如何对MongoDB sharding 集群做 compact

数据库NoSQL数据库技术服务知识库
目的

对集合中的数据和索引进行碎片整理。释放磁盘空间,降低磁盘利用率。

操作流程
  1. 连接到 Hidden 节点,执行 compact。
  2. 连接到 Secondary 节点,执行 compact。
  3. 待前两步做完之后,进行主备切换。
  4. 对当前的 Primary 执行 compact 命令。
Compact 命令影响&建议
  1. 回收磁盘碎片前,建议对数据库数据进行备份
  2. MongoDB 4.4 及之前的版本执行 compact 命令会导致集合所属的数据库被锁定,且该数据库的读写操作将被阻塞,建议您在业务低峰期操作
  3. 执行 compact 命令回收磁盘碎片所需的时间与集合数据量、系统负载等因素有关
操作步骤

前提 - 获取节点连接地址

我们需要对 S0 分片 进行 compact,如下三个节点对应的角色分别为:

  • s0-0:primary 节点
  • s0-1: secondary 节点
  • s0-2:hidden 节点

图片 在控制台上获取到的分片连接地址为:

mongodb://<user>:<password>@mongoshard11xxxxs00.ivolces.com:3717,mongoshard11xxxxs01.ivolces.com:3717/?authSource=admin&replicaSet=rs-mongo-shard-11a937c24b3d-s0&retryWrites=true

每个节点的单点直连地址为:

# primary 节点 s0-1
mongodb://root:xxxxx@mongoshardxxxxs00.ivolces.com:3717/?authSource=admin"

# secondary 节点 s0-1
mongodb://root:xxxxx@mongoshardxxxxs01.ivolces.com:3717/?authSource=admin"

# hidden 节点 s0-2
mongodb://root:xxxxx@mongoshardxxxxs02.ivolces.com:3717/?authSource=admin"

1 - 对 Hidden 节点执行 Compact

使用单点直连的方式连接到 Hidden 节点:

(base) [root@rudonx ~]# mongo "mongodb://root:xxxxx@mongoshard11xxxxxs02.ivolces.com:3717/?authSource=admin"

确认当前连接的节点为 Hidden 节点:

rs-mongo-shard-xxxxx-s0:SECONDARY|test> rs.isMaster()
{
        "hosts" : [
                "mongoshard11xxxxxs00.ivolces.com:3717",
                "mongoshard11xxxxxs01.ivolces.com:3717"
        ],
        "setName" : "rs-mongo-shard-xxxxx-s0",
        "setVersion" : 12444,
        "ismaster" : false,
        "secondary" : true,
        "primary" : "mongoshard11xxxxxs00.ivolces.com:3717",
        "passive" : true,
        "hidden" : true,   <----- 显示此节点为 hidden 节点

执行 compact 命令:

rs-mongo-shard-11xxxxxx-s0:SECONDARY|test> db.runCommand({compact:"sample"})
{
        "ok" : 1,
        ......
}

2 - 对 Secondary 节点执行 Compact

  1. 同样以单点直连的方式连接到 Secondary
  2. 确认节点角色
rs-mongo-shard-11xxxxx-s0:SECONDARY|test> rs.isMaster()
{
        "hosts" : [
                "mongoshard11xxxxs00.ivolces.com:3717",
                "mongoshard11xxxxs01.ivolces.com:3717"
        ],
        "setName" : "rs-mongo-shard-11a937c24b3d-s0",
        "setVersion" : 12444,
        "ismaster" : false,
        "secondary" : true,  <----- 显示为 secondary 节点
        "primary" : "mongoshard11xxxxs00.ivolces.com:3717",
  1. 执行 compact 命令

3 - 执行切换

注意事项:

  • 手动切换主节点过程(一般需要 3060 秒)中,实例可能会出现 12 次连接闪断,请谨慎操作。建议在业务低峰期执行切换操作,并确保应用具备自动重连机制。
  • 手动切换主节点仅改变节点的角色,不会改变节点所在的可用区和节点 ID。

4 - 对当前 Secondary 节点执行compact

参考步骤2中的步骤,执行 compact 即可

参考文档
  1. https://www.mongodb.com/docs/v4.0/reference/command/compact/
31
0
0
0
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论