MongoDB 的分片集群由下面的几个组件组成:

  • 分片(shard):每个分片包含了分片数据的一个子集,每个分片可以作为一个副本集部署。
  • mongos:mongos扮演者查询路由的角色,提供着客户端应用和分片集群的接口。
  • config servers:配置服务存储着集群的元数据和配置设置,MongoDB 3.4 以后,配置服务必须部署成副本集

05、MongoDB 分片 - 图2

搭建副本 Replication

搭建两套副本
创建 shard 文件夹,作为分片集群工作空间,shardsvr 默认监听 27018 端口

创建 replication1

在 shard 创建 replication1,作为第一个副本工作空间,然后创建三个文件夹做为三个MongoDB实例的工作空间

  1. mkdir -p /shard/replication1/mongodb1
  2. mkdir -p /shard/replication1/mongodb2
  3. mkdir -p /shard/replication1/mongodb3

在三个工作空间下分别创建数据,日志,进程存放等目录或者文件

  1. mkdir -p /shard/replication1/mongodb1/data
  2. mkdir -p /shard/replication1/mongodb1/log
  3. mkdir -p /shard/replication1/mongodb1/pid
  4. mkdir -p /shard/replication1/mongodb2/data
  5. mkdir -p /shard/replication1/mongodb2/log
  6. mkdir -p /shard/replication1/mongodb2/pid
  7. mkdir -p /shard/replication1/mongodb3/data
  8. mkdir -p /shard/replication1/mongodb3/log
  9. mkdir -p /shard/replication1/mongodb3/pid
  10. touch /shard/replication1/mongodb1/log/mongodb.log
  11. touch /shard/replication1/mongodb2/log/mongodb.log
  12. touch /shard/replication1/mongodb3/log/mongodb.log
  13. touch /shard/replication1/mongodb1/pid/mongodb.pid
  14. touch /shard/replication1/mongodb2/pid/mongodb.pid
  15. touch /shard/replication1/mongodb3/pid/mongodb.pid

在每个工作空间下创建配置文件

  1. vim /shard/replication1/mongodb[1, 2, 3]/mongodb.conf
  2. 写入
  3. systemLog:
  4. destination: file
  5. logAppend: true
  6. path: /shard/replication1/mongodb[1, 2, 3]/log/mongodb.log
  7. storage:
  8. dbPath: /shard/replication1/mongodb[1, 2, 3]/data
  9. journal:
  10. enabled: true
  11. processManagement:
  12. fork: true
  13. pidFilePath: /shard/replication1/mongodb[1, 2, 3]/pid/mongodb.pid
  14. net:
  15. port: [7000, 7001, 7002]
  16. bindIp: 192.168.204.199
  17. replication:
  18. replSetName: shard0
  19. sharding:
  20. clusterRole: shardsvr

启动 replication1

  1. /usr/local/mongodb/bin/mongod -f /shard/replication1/mongodb1/mongodb.conf
  2. /usr/local/mongodb/bin/mongod -f /shard/replication1/mongodb2/mongodb.conf
  3. /usr/local/mongodb/bin/mongod -f /shard/replication1/mongodb3/mongodb.conf

创建 replication2

在 shard 创建 replication2,作为第二个副本工作空间,然后创建三个文件夹做为三个MongoDB实例的工作空间

mkdir -p /shard/replication2/mongodb1
mkdir -p /shard/replication2/mongodb2
mkdir -p /shard/replication2/mongodb3

在三个工作空间下分别创建数据,日志,进程存放等目录或者文件

mkdir -p /shard/replication2/mongodb1/data
mkdir -p /shard/replication2/mongodb1/log
mkdir -p /shard/replication2/mongodb1/pid

mkdir -p /shard/replication2/mongodb2/data
mkdir -p /shard/replication2/mongodb2/log
mkdir -p /shard/replication2/mongodb2/pid 

mkdir -p /shard/replication2/mongodb3/data
mkdir -p /shard/replication2/mongodb3/log
mkdir -p /shard/replication2/mongodb3/pid

touch /shard/replication2/mongodb1/log/mongodb.log
touch /shard/replication2/mongodb2/log/mongodb.log
touch /shard/replication2/mongodb3/log/mongodb.log

touch /shard/replication2/mongodb1/pid/mongodb.pid
touch /shard/replication2/mongodb2/pid/mongodb.pid
touch /shard/replication2/mongodb3/pid/mongodb.pid

在每个工作空间下创建配置文件

vim /shard/replication2/mongodb[1, 2, 3]/mongodb.conf

写入
systemLog:
  destination: file
  logAppend: true
  path: /shard/replication2/mongodb[1, 2, 3]/log/mongodb.log

storage:
  dbPath: /shard/replication2/mongodb[1, 2, 3]/data
  journal:
    enabled: true

processManagement:
  fork: true
  pidFilePath: /shard/replication2/mongodb[1, 2, 3]/pid/mongodb.pid

net:
  port: [8000, 8001, 8002]
  bindIp: 192.168.204.199

replication:
  replSetName: shard1
sharding:
  clusterRole: shardsvr

启动 replication2

/usr/local/mongodb/bin/mongod -f /shard/replication2/mongodb1/mongodb.conf
/usr/local/mongodb/bin/mongod -f /shard/replication2/mongodb2/mongodb.conf
/usr/local/mongodb/bin/mongod -f /shard/replication2/mongodb3/mongodb.conf

搭建 ConfigServive

创建 ConfigService

在 shard 创建 configservice,作为配置节点副本工作空间,然后创建三个文件夹做为三个 MongoDB 实例的工作空间,configsvr **默认监听 27019 端口**

mkdir -p /shard/configservice/mongodb1  
mkdir -p /shard/configservice/mongodb2
mkdir -p /shard/configservice/mongodb3

在三个工作空间下分别创建数据,日志,进程存放等目录或者文件

mkdir -p /shard/configservice/mongodb1/data
mkdir -p /shard/configservice/mongodb1/log
mkdir -p /shard/configservice/mongodb1/pid

mkdir -p /shard/configservice/mongodb2/data
mkdir -p /shard/configservice/mongodb2/log
mkdir -p /shard/configservice/mongodb2/pid 

mkdir -p /shard/configservice/mongodb3/data
mkdir -p /shard/configservice/mongodb3/log
mkdir -p /shard/configservice/mongodb3/pid

touch /shard/configservice/mongodb1/log/mongodb.log
touch /shard/configservice/mongodb2/log/mongodb.log
touch /shard/configservice/mongodb3/log/mongodb.log

touch /shard/configservice/mongodb1/pid/mongodb.pid
touch /shard/configservice/mongodb2/pid/mongodb.pid
touch /shard/configservice/mongodb3/pid/mongodb.pid

在每个工作空间下创建配置文件

vim /shard/configservice/mongodb1/mongodb.conf

写入
systemLog:
  destination: file
  logAppend: true
  path: /shard/configservice/mongodb[1, 2, 3]/log/mongodb.log

storage:
  dbPath: /shard/configservice/mongodb[1, 2, 3]/data
  journal:
    enabled: true

processManagement:
  fork: true
  pidFilePath: /shard/configservice/mongodb[1, 2, 3]/pid/mongodb.pid

net:
  port: [9000, 9001, 9002]
  bindIp: 192.168.204.199

replication:
  replSetName: shard2
sharding:
  clusterRole: configsvr

启动 ConfigService

/usr/local/mongodb/bin/mongod -f /shard/configservice/mongodb1/mongodb.conf
/usr/local/mongodb/bin/mongod -f /shard/configservice/mongodb2/mongodb.conf
/usr/local/mongodb/bin/mongod -f /shard/configservice/mongodb3/mongodb.conf

初始化副本

初始化 Replication 第一套副本

mongo --host=192.168.204.188 --port=7000

rs.initiate()
rs.add("192.168.204.199:7001")  // 加入副本节点
rs.add("192.168.204.199:7002")  // 加入副本节点

初始化 Replication 第二套副本

mongo --host=192.168.204.188 --port=8000

rs.initiate()
rs.add("192.168.204.199:8001")  // 加入副本节点
rs.add("192.168.204.199:8002")  // 加入副本节点

初始化 ConfigService 配置节点副本

mongo --host=192.168.204.199 --port=9000
rs.add("192.168.204.199:9001")
rs.add("192.168.204.199:9002")

搭建路由

配置路由

在 shard 下创建 route 文件夹,然后创建两个文件夹作为路由节点实例工作空间

mkdir -p /shard/route/mongodb1/log
mkdir -p /shard/route/mongodb1/pid

touch /shard/route/mongodb1/log/mongodb.log
touch /shard/route/mongodb1/pid/mongodb.pid

创建配置文件

 vim /shard/route/mongodb1/mongos.conf

写入
systemLog:
    destination: file
  logAppend: true
  path: /shard/route/mongodb1/log/mongodb.log

processManagement:
  fork: true
  pidFilePath: /shard/route/mongodb1/pid/mongodb.pid

net:
  port: 6000
  bindIp: 192.168.204.199

sharding:
  configDB: shard2/192.168.204.199:9000,192.168.204.199:9001,192.168.204.199:9002

启动路由

mongos -f /shard/route/mongodb1/mongos.conf

初始化路由节点

mongo --host=192.168.204.199 --port=6000

sh.addShard(ip:port) # 单机模式
sh.addShard(副本名:/ip:端口, ip:端口....) # 副本模式

sh.addShard("shard0/192.168.204.199:7000, 192.168.204.199:7001, 192.168.204.199:7002")
sh.addShard("shard1/192.168.204.199:8000, 192.168.204.199:8001, 192.168.204.199:8002")

sh.status() # 查看

初始化分片

sh.enableSharding("数据库名")   // 开启此数据库分片
sh.shardCollection("数据库名.集合名", {"根据此集合中那个字段进行分片":"分片规则是什么"})

sh.enableSharding("taibai")  
sh.shardCollection("taibai.xyj", {"nickname":"hashed"}) // hash
sh.shardCollection("taibai.sg", {"age":1}) // 范围

测试分片

# 测试 hash
use taibai
for(var i= 1;i <= 1000; i++) {db.xyj.insert({_id:i+"",nickname:"taibai"+i})} // 插入1000条数据
登录7000和8000两个副本查看
7000  ---》  502
8000  ---》  498

登录7000的副本7001,执行rs.slaveOk()命令之后,可能看到数据也同步过来了

# 测试范围
在做范围测试之前,由于范围默认是写入某个库,直到这个库当中这个集合的数据达到64M之后才会进行分片
然而我们没有这么大的数据量,所有将64M设置为1M
use config
db.settings.save({_id:"chunksize",value: 1})

use taibai
for(var i=1;i<=20000;i++){db.sg.save({"name":"fwefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"+i,"age":NumberInt(i%2000)})}
登录7000和8000两个副本查看
7000  ---》  7940
8000  ---》  16782
总数据:24722