问题:

前面有了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()查看数据在各个复制集上的分布