分片集群部署
1.1 集群节点规划
10 个实例:38017-38026
1)configserver
38018-38020 3 台构成的复制集(1 主两从,不支持 arbiter)
2)shard 节点
- sh1:38021-23 (1 主两从,其中一个节点为 arbiter,复制集名字 sh1)
- sh2:38024-26 (1 主两从,其中一个节点为 arbiter,复制集名字 sh2)
3)mongos:38017
1.2 集群节点实施
1.2.1 shard 数据节点的搭建
1)不同实例目录的创建
su - mongod
mkdir -p /mongodb/38021/conf /mongodb/38021/log /mongodb/38021/data
mkdir -p /mongodb/38022/conf /mongodb/38022/log /mongodb/38022/data
mkdir -p /mongodb/38023/conf /mongodb/38023/log /mongodb/38023/data
mkdir -p /mongodb/38024/conf /mongodb/38024/log /mongodb/38024/data
mkdir -p /mongodb/38025/conf /mongodb/38025/log /mongodb/38025/data
mkdir -p /mongodb/38026/conf /mongodb/38026/log /mongodb/38026/data
2)第一组复制集搭建:21-23(1 主 1 从 1Arb)
# 修改配置文件:
cat > /mongodb/38021/conf/mongodb.conf <
3)第二组复制集搭建:24-26(1 主 1 从 1Arb)
# 修改配置文件:
cat > /mongodb/38024/conf/mongodb.conf <
1.2.2 config server 节点搭建
1)config server 节点不同实例目录创建
mkdir -p /mongodb/38018/conf /mongodb/38018/log /mongodb/38018/data
mkdir -p /mongodb/38019/conf /mongodb/38019/log /mongodb/38019/data
mkdir -p /mongodb/38020/conf /mongodb/38020/log /mongodb/38020/data
2)config server 复制集搭建
# 修改配置文件:
cat > /mongodb/38018/conf/mongodb.conf <
注:configserver 可以是一个节点,官方建议复制集。configserver 不能有 arbiter。
1.2.3 mongos 节点搭建
1)创建目录
mkdir -p /mongodb/38017/conf /mongodb/38017/log
2)mongos 复制集搭建
# 修改配置文件:
cat > /mongodb/38017/conf/mongos.conf <
1.2.4 分片集群添加节点
1)登录 mongos 节点
mongo 10.0.0.10:38017/admin
2)添加分片
db.runCommand( { addshard : "sh1/10.0.0.10:38021,10.0.0.10:38022,10.0.0.10:38023",name:"shard1"} )
db.runCommand( { addshard : "sh2/10.0.0.10:38024,10.0.0.10:38025,10.0.0.10:38026",name:"shard2"} )
3)列出分片
db.runCommand( { listshards : 1 } )
4)整体状态查看
sh.status();
2.1 RANGE 自动分片的使用
1)激活数据库分片功能(例如激活 test 库,在 mongos 下执行)
mongo --port 38017 admin
use admin
db.runCommand( { enablesharding : "test" } )
2)指定分片键(例如经常以 id 列作为查询条件)
注:在 shard 节点的主节点,为 id 列创建索引:
mongo --port 38021
use test
db.vast.ensureIndex( { id: 1 } )
mongo --port 38024
use test
db.vast.ensureIndex( { id: 1 } )
3)开启分片:(在 mongs 下执行)
mongo --port 38017 admin
use admin
db.runCommand( { shardcollection : "test.vast",key : {id: 1} } )
4)range 分片验证
mongo --port 38017 admin
use test
for(i=1;i<1000000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
db.vast.stats()
5)分片结果查看
shard1:
mongo --port 38021
use test
db.vast.count();
shard2:
mongo --port 38024
use test
db.vast.count();
2.2 hash 分片的使用
mongo --port 38017 admin
use admin
db.runCommand( { enablesharding : "oldboy" } )
2)对 oldboy 库下的 vast 表建立 hash 索引
use oldboy
db.vast.ensureIndex( { id: "hashed" } )
3)开启分片:(在 mongs 下执行)
mongo --port 38017 admin
use admin
sh.shardCollection( "oldboy.vast", { id: "hashed" } )
4)range 分片验证
mongo --port 38017 admin
use oldboy
for(i=1;i<100000;i++){
db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()});
5)分片结果查看
shard1:
mongo --port 38021
use oldboy
db.vast.count();
shard2:
mongo --port 38024
use oldboy
db.vast.count();
2.3 zone 方式进行 range 手工定制分片
1)激活数据库分片功能(例如激活 demo 库,在 mongos 下执行)
use admin
db.runCommand( { enablesharding : "demo" } )
2)对 demo 库下的 t1 表建立索引
mongo --port 38017 admin
use demo
db.t1.ensureIndex( {order_id: 1 } )
3)开启分片(在 mongs 下执行)
mongo --port 38017 admin
use admin
sh.shardCollection("demo.t1", {order_id: 1});
4)创建分片标签
sh.addShardTag("shard1", "shard00")
sh.addShardTag("shard2", "shard01")
5)自定义分片范围
sh.addTagRange(
"demo.t1",
{ "order_id" : MinKey },
{ "order_id" : 500 },"shard00" )
sh.addTagRange(
"demo.t1",
{"order_id" : 501 },
{"order_id" : MaxKey},"shard01" )
6)手工定制分片验证
sh.addTagRange(
"demo.t1",
{ "order_id" : MinKey },
{ "order_id" : 500 },"shard00" )
sh.addTagRange(
"demo.t1",
{"order_id" : 501 },
{"order_id" : MaxKey},"shard01" )
分片集群的查询及管理</span
3.1 判断是否 Shard 集群
db.runCommand({ isdbgrid : 1})
3.2 列出所有分片信息
db.runCommand({ listshards : 1})
3.3 列出开启分片的数据库
use config
db.databases.find( { "partitioned": true } )
或者:
db.databases.find()
3.4 查看分片的片键
db.collections.find().pretty()
3.5 查看分片的详细信息
sh.status()
3.6 删除分片节点(谨慎)
1)确认 blance 是否在工作
sh.getBalancerState()
2)删除 shard2 节点(谨慎)
db.runCommand( { removeShard: "shard2" } )
注意:删除操作一定会立即触发 blancer。balancer 操作管理
4.1 balancer 介绍
mongos 的一个重要功能,自动巡查所有 shard 节点上的 chunk 的情况,自动做 chunk 迁移。
什么时候工作?
- 自动运行,会检测系统不繁忙的时候做迁移;
- 在做节点删除的时候,立即开始迁移工作;
- balancer 只能在预设定的时间窗口内运行。
有需要时可以关闭和开启 blancer(备份的时候):
mongos> sh.stopBalancer()
mongos> sh.startBalancer()
4.2 自定义自动平衡进行的时间段
https://docs.mongodb.com/manual/tutorial/manage-sharded-cluster-balancer/#schedule-the-balancing-window
use config
sh.setBalancerState( true )
db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "3:00", stop : "5:00" } } }, true )
sh.getBalancerWindow()
sh.status()
4.3 关于集合的 balancer 管理
1)关闭某个集合的 balance
sh.disableBalancing("demo.t1")
2)打开某个集合的 balancer
sh.enableBalancing("demo.t1")
3)确定某个集合的 balance 是开启或者关闭
# 返回空则表示一直开着, 返回 true,代表当前 balancer 关闭了, 返回 false,代表集合的 balancer 曾经被关闭过。
db.getSiblingDB("config").collections.findOne({_id : "demo.t1"}).noBalance
来自:“IT 那活儿”公众号