MongoDB Sharding Cluster分片集群

分片集群部署

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

MongoDB Sharding Cluster 分片集群

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 分片的使用

1)激活数据库分片功能(例如激活 oldboy 库,在 mongos 下执行)

mongo --port 38017 admin
use admin
db.runCommand( { enablesharding : "oldboy" } )

2)对 oldboy 库下的 vast 表建立 hash 索引

注:在 mongos 下执行:


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 那活儿”公众号

© 版权声明

☆ END ☆
喜欢就点个赞吧
点赞0 分享
图片正在生成中,请稍后...