Ubuntu系统MongoDB分片集群部署基于MongoDB 6.x

参考这篇文章就能搞出来,我已经验证过了

综合考虑,还是把自己的环境和配置写出来吧.万一以后别人的链接没了.
首先准备一批服务器.(理论上来讲mongos需要多节点高可用,但是家境贫寒,先弄一个节点)

服务器名 vCPU RAM 系统ROM 数据磁盘 OS IP 用途
mongos-01 16 32 50 0 Ubuntu20.04 192.168.2.60 对外提供mongos服务
mongocs-01 2 4 50 0 Ubuntu20.04 192.168.2.61 mongoconfig服务01
mongocs-02 2 4 50 0 Ubuntu20.04 192.168.2.62 mongoconfig服务02
mongocs-03 1 2 40 0 Ubuntu20.04 192.168.2.63 mongoconfig服务03
mongosh-g0-01 4 8 40 200 Ubuntu20.04 192.168.2.64 分片01主节点
mongosh-g0-02 4 8 40 200 Ubuntu20.04 192.168.2.65 分片01从节点
mongosh-g0-arbitration 1 1 40 0 Ubuntu20.04 192.168.2.66 分片01仲裁节点
mongosh-g1-01 4 8 40 200 Ubuntu20.04 192.168.2.67 分片02主节点
mongosh-g1-02 4 8 40 200 Ubuntu20.04 192.168.2.68 分片02从节点
mongosh-g1-arbitration 1 1 40 0 Ubuntu20.04 192.168.2.69 分片02仲裁节点
  • 以上就是服务器的规划.不多不少正好10台.(做集群真的是有点费🤣)
  • 给10台服务器均装好操作系统Ubuntu20.04LTS(目前MongoDB 6.x支持的最新版本,21.10也可以)
  • 接下来先走一波常规的MongoDB安装步骤
  • 首先常规操作,安装必须的依赖包.
sudo apt install gnupg
  • 导入GPG公钥
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
  • 创建MongoDB的包源文件
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
  • 执行包源更新和安装mongodb社区版
sudo apt update && sudo apt install mongodb-org -y
  • 到此MongoDB的包就装好了.接下来就是调整配置文件的部分了.
  • 首先先做两个shard节点的配置.
  • 我们可以先生成一个keyFile用来节点间校验通信,并同步到所有节点的用户目录下.
openssl rand -base64 745 > /home/joe/mongokeyfile.key
# 同时还调整keyFile的所有者和只读权限.并同步到其他所有机器
sudo chown mongodb:mongodb /home/joe/mongokeyfile.key && sudo chmod 400 /home/joe/mongokeyfile.key
  • 修改mongod.conf配置文件
sudo nano /etc/mongod.conf
  • 192.168.2.64-192.168.2.66这三个节点我们当作shard1.其配置如下.
# mongod.conf
# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: /mongo
  journal:
    enabled: true
#  engine:
#  wiredTiger:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /mongo/logs/mongod.log

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0

# how the process runs
processManagement:
  timeZoneInfo: /usr/share/zoneinfo

#security:
security:   
  keyFile: /home/joe/mongokeyfile.key
  authorization: enabled

#operationProfiling:

replication:
  replSetName: sh1

sharding:
  clusterRole: shardsvr

## Enterprise-Only Options:

#auditLog:

#snmp:
  • 可见我们的配置文件中启用了安全校验,若是出现第一次无法使用mongosh登录,可先注释掉authorization: enabled等待配置好用户后再开启,shard2也是如此.修改配置文件后,mongod服务需要重启一下.
  • 这里我们需要注意一下一些参数,其中dbPath我单独放到了用于数据库使用的磁盘中.所以路径和默认的不一致.
  • 仲裁节点由于不保存数据,所以可以不调整配置文件内容.仅需同步keyFile即可.
  • 同时我们需要给这两个路径调整一下所有者.(实际路径需要根据自己的情况来定)
sudo chown -R mongodb:mongodb /mongo
# 若是后期启动出现日志目录不存在的情况,可以先手动添加一下目录(仅数据节点添加即可.若是使用默认目录这两行命令都不需要)
sudo mkdir -p /mongo/logs && sudo chown -R mongodb:mongodb /mongo/logs
  • 当配置文件写好了后就可以执行命令启动mongod服务了.
sudo service mongod start
# 等待数秒后,可以使用如下命令查看状态
sudo service mongod status
  • 输出如下内容表示启动成功.(一般来说使用Linux的用户或者都来看这帖子了,能看懂这些命令的含义)
  • 3台节点均需启动成功.
  • 在我们打算做主节点的服务器上进行接下来的操作,这里我们选192.168.2.64
  • 使用mongosh命令(MongoDB 6.x新命令旧版使用mongo)登录本机mongodb服务.
# 先切换到admin数据库.
use admin
# 然后填入配置信息
config = {_id: 'sh1', members: [
                          {_id: 0, host: '192.168.2.64:27017'},
                          {_id: 1, host: '192.168.2.65:27017'},
                          {_id: 2, host: '192.168.2.66:27017',"arbiterOnly":true}]
}
# 再然后执行数据库初始化命令
rs.initiate(config)
# 等待数秒输出 {"ok": 1}等类似成功的信息后,就表示初始化成功.
# 执行退出命令,退出交互.至此第一个副本集就配置好了.
exit
  • 给这三台服务器的mongodb服务做开机自启动
sudo systemctl enable mongod.service
  • 第一个副本集配置好了后,我们就可以断开这三台服务器的SSH链接,接下来配置第二个副本集,操作和第一个类似,但是部分配置信息不一样.
  • 使用SSH连接上192.168.2.67-192.168.2.69三台服务器后,依照上边的命令修改配置文件
sudo nano /etc/mongod.conf
  • 这三台服务器我们当作第二个副本集shard2
# mongod.conf
# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: /mongo
  journal:
    enabled: true
#  engine:
#  wiredTiger:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /mongo/logs/mongod.log

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0

# how the process runs
processManagement:
  timeZoneInfo: /usr/share/zoneinfo

#security:
security:   
  keyFile: /home/joe/mongokeyfile.key
  authorization: enabled

#operationProfiling:

replication:
  replSetName: sh2

sharding:
  clusterRole: shardsvr

## Enterprise-Only Options:

#auditLog:

#snmp:
  • 其中replSetName: sh2和shard1不一样,别的都一致的.同样其中的路径需要根据自己的实际情况调整
  • 然后启动三个节点的mongodb服务.
  • 然后在初始化shard2副本集.在我们需要做主节点的机器上192.168.2.67上执行类似操作
# 登录到本机的mongodb服务
mongosh
# 切换到admin数据库
use admin
# 配置副本集二
config = {_id: 'sh2', members: [
                          {_id: 0, host: '192.168.2.67:27017'},
                          {_id: 1, host: '192.168.2.68:27017'},
                          {_id: 2, host: '192.168.2.69:27017',"arbiterOnly":true}]
}
# 初始化副本集
rs.initiate(config)
# 等待数秒提示成功后退出
exit
  • 配置3台服务器的mongodb服务自启动
sudo systemctl enable mongod.service
  • 自此两个副本集的配置就完成了.接下来我们配置Config Server服务
  • 首先退出6个副本集的SSH链接,避免操作错误了.
  • 登录192.168.2.61-192.168.2.63这三台服务器.
  • 调整他们的mongod.conf文件
sudo nano /etc/mongod.conf
  • 调整配置文件内容如下
# mongod.conf
# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
#  engine:
#  wiredTiger:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0

# how the process runs
processManagement:
  timeZoneInfo: /usr/share/zoneinfo

#security:
security:   
  keyFile: /home/joe/mongokeyfile.key
  authorization: enabled

#operationProfiling:

replication:
  replSetName: configReplSet
sharding:
  clusterRole: configsvr

## Enterprise-Only Options:

#auditLog:

#snmp:
  • 这里由于是配置文件服务,所以我使用了默认的文件夹路径.也可以依据实际情况进行调整.
  • 和前边差不多类似的操作,改好三台服务器的配置文件后,就直接启动mongod服务.
  • 然后登录主节点192.168.2.61来配置Config Server的集群服务.
# 登录mongodb
mongosh
# 切换admin数据库
use admin
# 集群服务器配置(新版的mongodb仅允许配置服务是副本集集群.)
config = {_id: 'configReplSet', members: [
                          {_id: 0, host: '192.168.2.61:27017'},
                          {_id: 1, host: '192.168.2.62:27017'},
                          {_id: 2, host: '192.168.2.63:27017'}]
}
# 然后依据配置初始化集群
rs.initiate(config)
# 退出shell交互界面
exit
  • 一样Config Server也需要开机自启动.执行前边的命令即可.
sudo systemctl enable mongod.service
  • 退出三台配置服务服务器.至此,Config Server集群就配置好了.
  • 接下来配置mongos服务.
  • 首先我们根据mongod.conf的文件模板创建一个mongos.conf文件
sudo cp /etc/mongod.conf /etc/mongos.conf
# 打开mongos.conf文件编辑
sudo nano /etc/mongos.conf
  • 其中mongos.conf的配置信息如下
# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
#storage:
#  dbPath: /var/lib/mongodb
#  journal:
#    enabled: true
#  engine:
#  wiredTiger:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongos.log

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0


# how the process runs
processManagement:
  timeZoneInfo: /usr/share/zoneinfo

security:
  keyFile: /home/joe/mongokeyfile.key

#operationProfiling:

#replication:

sharding:
  configDB: configReplSet/192.168.2.61:27017,192.168.2.62:27017,192.168.2.63:27017

## Enterprise-Only Options:

#auditLog:

#snmp:
  • 从配置文件中我们可以发现,mongos不需要数据存储目录.所以直接注释掉就行.其他配置按照配置文件的内容调整即可.
  • 设置好配置文件后,我们就不能直接启动mongod服务了,因为这个服务器是mongos
  • 首先我们将mongd的service文件copy到mongos.service中
sudo cp /lib/systemd/system/mongosd.service /lib/systemd/system/mongos.service
# 然后编辑一下mongos.service
sudo nano /lib/systemd/system/mongos.service
  • 将其中的信息改成如下内容
[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network-online.target
Wants=network-online.target

[Service]
User=mongodb
Group=mongodb
EnvironmentFile=-/etc/default/mongod
ExecStart=/usr/bin/mongos --config /etc/mongos.conf
PIDFile=/var/run/mongodb/mongos.pid
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false

# Recommended limits for mongod as specified in
# https://docs.mongodb.com/manual/reference/ulimit/#recommended-ulimit-settings

[Install]
WantedBy=multi-user.target
  • 上述的文件主要调整这两行,将启动命令换成了mongos以及配置文件指定为我们前边修改的配置文件
ExecStart=/usr/bin/mongos --config /etc/mongos.conf
PIDFile=/var/run/mongodb/mongos.pid
  • 修改好后,我们就可以执行如下命令来启动mongos服务以及验证服务运行状态.
# 启动服务
sudo service mongos start
# 查看运行状态
sudo service mongos status
  • 当服务成功启动后.我们就可以使用mongosh进行配置和初始化整个集群了.
# 登录mongos服务
mongosh
# 切换到admin数据库
use admin
# 添加分片一
db.runCommand( { addshard : "sh1/192.168.2.64:27017,192.168.2.65:27017,192.168.2.66:27017",name:"shard1"} )
# 添加分片二
db.runCommand( { addshard : "sh2/192.168.2.67:27017,192.168.2.68:27017,192.168.2.69:27017",name:"shard2"} )
# 添加成功后,会输出类似如下信息
{
	"shardAdded" : "shard1",
	"ok" : 1,
	"operationTime" : Timestamp(1638349820, 6),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1638349820, 6),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}
# 可以查看集群状态
sh.status()

# 添加用户.添加后,即可开启分片副本集的安全认证选项了.
db.createUser({user: "aaa", pwd: "123456", roles: [{ role: "root", db: "admin" }]});

# 退出shell交互
exit
  • 至此,MongoDB的分片集群即部署成功,最后别忘记开机自启动mongos服务
sudo systemctl enable mongos.service
  • 接下来一些分片集群的使用内容,我就直接复制上边参考链接的内容了.
  • 激活数据库的分片功能,需要登录到mongos
mongosh
# 语法:
mongos> db.runCommand({enablesharding: '数据库名称'})

#比如对test数据库开启分片功能:
mongos> db.runCommand({enablesharding: 'test'})
# 退出shell交互界面
exit
  • 给数据库的某个表指定分片键,范围分片
mongosh

# 切换到test库
mongos> use test

# 给表添加一个索引
mongos> db.testRange.ensureIndex({id: 1})

#切换到admin库
mongos> use admin

# 指定片键,开启分片功能,范围分片
mongos> db.runCommand({shardcollection: "test.testRange", key: {id: 1}})

# 退出shell交互
exit
posted @ 2022-03-08 14:50  Joe_du  阅读(606)  评论(0编辑  收藏  举报