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()
posted @   原来是你~~~  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示