mongodb-shard cluster
1、shard cluster 搭建及规划
10个实例端口:38017-38026
-
configserver:3台构成的复制集(1主两从,不支持arbiter)38018-38020
-
shard节点:
sh1:38021-23 (1主两从,复制集名字sh1)
sh2:38024-26 (1主两从,复制集名字sh2) -
mongos
mongos:38017
2、搭建 shard 节点
规划创建安装路径
$ mkdir -p /mongodb/38021/{conf,log,data}
$ mkdir -p /mongodb/38022/{conf,log,data}
$ mkdir -p /mongodb/38023/{conf,log,data}
$ mkdir -p /mongodb/38024/{conf,log,data}
$ mkdir -p /mongodb/38025/{conf,log,data}
$ mkdir -p /mongodb/38026/{conf,log,data}
编辑配置文件
$ vim /mongodb/38021/conf/mongodb.conf
systemLog:
destination: file
path: /mongodb/38021/log/mongodb.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /mongodb/38021/data
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
net:
bindIp: 0.0.0.0
port: 38021
replication:
oplogSizeMB: 2048
replSetName: sh1
sharding:
clusterRole: shardsvr
processManagement:
fork: true
$ cp /mongodb/38021/conf/mongodb.conf /mongodb/38022/conf
$ cp /mongodb/38021/conf/mongodb.conf /mongodb/38023/conf
$ sed -i 's/38021/38022/g' /mongodb/38022/conf/mongodb.conf
$ sed -i 's/38021/38023/g' /mongodb/38023/conf/mongodb.conf
$ vim /mongodb/38024/conf/mongodb.conf
systemLog:
destination: file
path: /mongodb/38024/log/mongodb.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /mongodb/38024/data
directoryPerDB: true
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
net:
bindIp: 0.0.0.0
port: 38024
replication:
oplogSizeMB: 2048
replSetName: sh2
sharding:
clusterRole: shardsvr
processManagement:
fork: true
$ cp /mongodb/38024/conf/mongodb.conf /mongodb/38025/conf/
$ cp /mongodb/38024/conf/mongodb.conf /mongodb/38026/conf/
$ sed -i 's/38024/38025/g' /mongodb/38025/conf/mongodb.conf
$ sed -i 's/38024/38026/g' /mongodb/38026/conf/mongodb.conf
启动 mongodb
$ mongod -f /mongodb/38021/conf/mongodb.conf
$ mongod -f /mongodb/38022/conf/mongodb.conf
$ mongod -f /mongodb/38023/conf/mongodb.conf
$ mondod -f /mongodb/38024/conf/mongodb.conf
$ mongod -f /mongodb/38025/conf/mongodb.conf
$ mongod -f /mongodb/38026/conf/mongodb.conf
配置复制集
$ mongo --port 38021
> config={_id:'sh2',members:[{_id:0,host:'192.168.3.105:38024'},{_id:1,host:'192.168.3.105:38025'},{_id:2,host:'192.168.3.105:38026'}]}
> rs.initiate(config)
$ mongo --port 38024
> config={_id:'sh2',members:[{_id:0,host:'192.168.3.105:38024'},{_id:1,host:'192.168.3.105:38025'},{_id:2,host:'192.168.3.105:38026'}]}
> rs.initiate(config)
3、搭建 config 节点
$ mkdir -p /mongodb/38018/{conf,log,data}
$ mkdir -p /mongodb/38019/{conf,log,data}
$ mkdir -p /mongodb/38020/{conf,log,data}
$ vi /mongodb/38018/conf/mongodb.conf
systemLog:
destination: file
path: /mongodb/38018/log/mongodb.conf
logAppend: true
storage:
journal:
enabled: true
dbPath: /mongodb/38018/data
directoryPerDB: true
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
net:
bindIp: 0.0.0.0
port: 38018
replication:
oplogSizeMB: 2048
replSetName: configReplSet
sharding:
clusterRole: configsvr
processManagement:
fork: true
$ cp /mongodb/38018/conf/mongodb.conf /mongodb/38019/conf/
$ cp /mongodb/38018/conf/mongodb.conf /mongodb/38020/conf/
$ sed -i 's/38018/38019/g' /mongodb/38019/conf/mongodb.conf
$ sed -i 's/38018/38020/g' /mongodb/38020/conf/mongodb.conf
$ mondod -f /mongodb/38018/conf/mongodb.conf
$ mongod -f /mongodb/38019/conf/mongodb.conf
$ mongod -f /mongodb/38020/conf/mongodb.conf
$ mongo --port 38018
> config={_id:'configReplSet',members:[{_id:0,host:'192.168.3.105:38018'},{_id:1,host:'192.168.3.105:38019'},{_id:2,host:'192.168.3.105:38020'}]}
> rs.initiate(config)
4、mongos节点配置
$ mkdir /mongodb/38017/{conf,log} -p
$ vim /mongodb/38017/conf/mongos.conf
systemLog:
destination: file
path: /mongodb/38017/log/mongos.log
logAppend: true
net:
bindIp: 0.0.0.0
port: 38017
sharding:
configDB: configReplSet/192.168.3.105:38018,192.168.3.105:38019,192.168.3.105:38020
processManagement:
fork: true
$ mongos -f /mongodb/38017/conf/mongos.conf
5、分片集群操作
连接 mongos 的 admin 库,进行分片操作
$ mongo 10.0.0.51:38017/admin
## 添加分片
> db.runCommand( { addshard :
"sh1/192.168.3.105:38021,192.168.3.105:38022,192.168.3.105:38023",name:"shard1"} )
db.runCommand( { addshard :
"sh2/192.168.3.105:38024,192.168.3.105:38025,192.168.3.105:38026",name:"shard2"}
## 列出分片
> db.runCommand( { listshards : 1 } )
## 整体状态查看
> sh.status();
RANGE 分片配置及测试,test库下的vast大表进行手工分片
## 激活数据库分片功能
> db.runCommand( { enablesharding : "test" } )
## 指定分片建对集合分片
## 创建索引
use test
> db.vast.ensureIndex( { id: 1 } )
## 开启分片
use admin
> db.runCommand( { shardcollection : "test.vast",key : {id: 1} } )
## 插入数据验证
> use test
> for(i=1;i<500000;i++){
db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
> db.vast.stats()
RANGE 分片结果验证,RANGE 范围分片,数据先插入其中某个主分片上,当写满一个块后,后续再进行数据块分配。
## shard1:
$ mongo --port 38021
> db.vast.count();
## shard2:
$ mongo --port 38024
> db.vast.count();
Hash 分片配置测试,数据在两个分片节点均匀的分布
$ mongo --port 38017 admin
> use admin
> admin> db.runCommand( { enablesharding : "test1" } )
## 创建hash索引
> use test1
> db.vast.ensureIndex( { id: "hashed" } )
> use admin
> sh.shardCollection( "test1.vast", { id: "hashed" } )
> use test1
for(i=1;i<100000;i++){
db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
查看分片详细信息
> sh.status()
删除分片
## 确认blance是否在工作
> sh.getBalancerState()
## 删除shard2节点
mongos> db.runCommand( { removeShard: "shard2" } )
6、balancer
mongos的一个重要功能,自动巡查所有shard节点上的chunk的情况,自动做chunk迁移。
-
自动运行,会检测系统不繁忙的时候做迁移
-
在做节点删除的时候,立即开始迁移工作
-
balancer只能在预设定的时间窗口内运行
有需要时可以关闭和开启blancer(备份的时候)
mongos> sh.stopBalancer()
mongos> sh.startBalancer()
自定义自动平衡进行的时间段
$ mongo --port 38017
> use config
> sh.setBalancerState( true )
> db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start :
"3:00", stop : "5:00" } } }, true )
> sh.getBalancerWindow()
> sh.status()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现