问题:
前面有了mongo的复制集,实现了主从同步,现在搭建分布式集群
解决办法:
机器A:192.168.31.139
机器B:192.168.31.140
机器C:192.168.31.142
说在前面: 我们实现mongo的最小集群模型,两个存储数据的复制集,
一个存储配置的复制集,再加上mongos服务
如果未指定操作在哪台机器上执行,那么就是所有机器都要执行
1. 创建相关目录结构
在上一节的rs0同级目录下,再创建三个目录configs、mongos、rs1
且三个目录下均创建data和log目录,如同rs0一样
mkdir ~/mongodb/configs
mkdir ~/mongodb/configs/data
mkdir ~/mongodb/configs/log
cp -R ~/mongodb/configs ~/mongodb/mongos
cp -R ~/mongodb/configs ~/mongodb/rs1
2. 创建存储配置的复制集
在目录~/mongodb/configs
下,创建配置文件mongod.conf
:
storage:
dbPath: /home/xx/mongodb/configs/data
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /home/xx/mongodb/configs/log/mongod.log
net:
port: 13000
bindIp: 0.0.0.0
processManagement:
timeZoneInfo: /usr/share/zoneinfo
replication:
replSetName: configRS
这里指定复制集名为:configRS
这里和创建rs0的步骤是一样的,只是复制集名称不一样
3. 启动配置复制集
mongod --config mongod.conf --fork --configsvr
和rs0启动是有区别的,用于配置的服务需要增加
--configsvr
参数
4. 设置配置复制集及增加节点
在机器A上执行:
mongo --port 13000
config = { _id: 'configRS', configsvr: true, members: [ {_id: 0, host: '192.168.31.139:13000'}, {_id: 1, host: '192.168.31.140:13000'}, {_id: 2, host: '192.168.31.142:13000'}, ] }
rs.initiate(config)
上面是一次性将所有节点加入到了config中,一次性初始化了,
这里和rs0设置时,多了一个configsvr: true
通过rs.conf()和rs.status()查看复制集状态
5. 创建存储数据的复制集rs0
rs0配置文件mongod.conf:
storage:
dbPath: /home/xx/mongodb/rs0/data
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /home/xx/mongodb/rs0/log/mongod.log
net:
port: 11000
bindIp: 0.0.0.0
processManagement:
timeZoneInfo: /usr/share/zoneinfo
replication:
replSetName: rs0
配置文件内容同上一节一样
6. 启动存储数据的复制集rs0
mongod -f mongod.conf --fork --shardsvr
这里是和上一节讲的有区别,因为上一节仅仅是为了配置复制集,
而这里是在配置集群环境,在启动时需要增加参数--shardsvr
7. rs0配置节点
在机器A上执行:
mongo --port 11000
config = { _id: 'rs0', members: [ {_id: 0, host: '192.168.31.139:11000'}, {_id: 1, host: '192.168.31.140:11000'}, {_id: 2, host: '192.168.31.142:11000'}, ] }
rs.initiate(config)
rs.status()
8. 创建存储数据的复制集rs1
rs1配置文件mongod.conf:
storage:
dbPath: /home/xx/mongodb/rs1/data
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /home/xx/mongodb/rs1/log/mongod.log
net:
port: 12000
bindIp: 0.0.0.0
processManagement:
timeZoneInfo: /usr/share/zoneinfo
replication:
replSetName: rs1
与rs0的配置文件区别一个是端口号,一个是复制集名
因为我们是通过三台机器搭建集群,一台机器要启动多个mongo实例,
所以要用不同的端口来启动
9. 启动rs1
mongod -f mongod.conf --fork --shardsvr
10. rs1配置节点
在机器A上执行:
mongo --port 12000
config = { _id: 'rs1', members: [ {_id: 0, host: '192.168.31.139:12000'}, {_id: 1, host: '192.168.31.140:12000'}, {_id: 2, host: '192.168.31.142:12000'}, ] }
rs.initiate(config)
rs.status()
这里复制集名称和端口号不要弄错,rs1及12000
11. 配置mongos节点
mongos目录下创建配置文件mongos.conf:
systemLog:
destination: file
logAppend: true
path: /home/xx/mongodb/mongos/log/mongod.log
net:
port: 14000
bindIp: 0.0.0.0
processManagement:
timeZoneInfo: /usr/share/zoneinfo
sharding:
configDB: "configRS/192.168.31.139:13000,192.168.31.140:13000,192.168.31.142:13000"
其中sharding中设置configDB的信息,配置的复制集名加所有地址端口信息
12. 启动mongos节点
在机器A上启动mongos:
mongos -f mongos.conf --fork
mongo --port 14000
sh.addShard('rs0/192.168.31.139:11000')
sh.addShard('rs1/192.168.31.139:12000')
sh.status()
sh.addShard是将复制集加入到集群中
这里增加时只用指定复制集中的一个节点就可以了
使用sh.status()
就会发现每个复制集下的节点都已经存在了
13. 启用多个mongos节点
在B和C机器上同样启动mongos后,执行:
mongos -f mongos.conf --fork
mongo --port 14000
sh.status()
这里只要一启动就可以直接看到所有复制集的情况,
这是因为所有配置都存储到了配置复制集中,
而我们的mongos.conf中记录了配置复制集的信息
14. 启用sharding功能
mongo --port 14000
use dealer
sh.enableSharding('dealer')
db.createCollection('goods')
sh.shardCollection('dealer.goods', {id: 'hashed'}, false)
let goods = [];
for (let i = 0; i < 10000; i ++) {
goods.push({
id: i,
name: 'goods-' + i,
})
}
db.goods.insertMany(goods);
sh.status()
db.goods.getShardDistribution()
创建一个dealer库,使用sh.enableSharding('dealer')允许dealer库使用sharding功能
sh.shardCollection('dealer.goods', {id: 'hashed'}, false)指定使用id的hash值进行sharding
db.goods.getShardDistribution()查看数据在各个复制集上的分布