MongoDB 的分片集群由下面的几个组件组成:
- 分片(shard):每个分片包含了分片数据的一个子集,每个分片可以作为一个副本集部署。
- mongos:mongos扮演者查询路由的角色,提供着客户端应用和分片集群的接口。
- config servers:配置服务存储着集群的元数据和配置设置,MongoDB 3.4 以后,配置服务必须部署成副本集
搭建副本 Replication
搭建两套副本
创建 shard 文件夹,作为分片集群工作空间,shardsvr 默认监听 27018 端口
创建 replication1
在 shard 创建 replication1,作为第一个副本工作空间,然后创建三个文件夹做为三个MongoDB实例的工作空间
mkdir -p /shard/replication1/mongodb1mkdir -p /shard/replication1/mongodb2mkdir -p /shard/replication1/mongodb3
在三个工作空间下分别创建数据,日志,进程存放等目录或者文件
mkdir -p /shard/replication1/mongodb1/datamkdir -p /shard/replication1/mongodb1/logmkdir -p /shard/replication1/mongodb1/pidmkdir -p /shard/replication1/mongodb2/datamkdir -p /shard/replication1/mongodb2/logmkdir -p /shard/replication1/mongodb2/pidmkdir -p /shard/replication1/mongodb3/datamkdir -p /shard/replication1/mongodb3/logmkdir -p /shard/replication1/mongodb3/pidtouch /shard/replication1/mongodb1/log/mongodb.logtouch /shard/replication1/mongodb2/log/mongodb.logtouch /shard/replication1/mongodb3/log/mongodb.logtouch /shard/replication1/mongodb1/pid/mongodb.pidtouch /shard/replication1/mongodb2/pid/mongodb.pidtouch /shard/replication1/mongodb3/pid/mongodb.pid
在每个工作空间下创建配置文件
vim /shard/replication1/mongodb[1, 2, 3]/mongodb.conf写入systemLog:destination: filelogAppend: truepath: /shard/replication1/mongodb[1, 2, 3]/log/mongodb.logstorage:dbPath: /shard/replication1/mongodb[1, 2, 3]/datajournal:enabled: trueprocessManagement:fork: truepidFilePath: /shard/replication1/mongodb[1, 2, 3]/pid/mongodb.pidnet:port: [7000, 7001, 7002]bindIp: 192.168.204.199replication:replSetName: shard0sharding:clusterRole: shardsvr
启动 replication1
/usr/local/mongodb/bin/mongod -f /shard/replication1/mongodb1/mongodb.conf/usr/local/mongodb/bin/mongod -f /shard/replication1/mongodb2/mongodb.conf/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

