目的
对集合中的数据和索引进行碎片整理。释放磁盘空间,降低磁盘利用率。
操作流程
- 连接到 Hidden 节点,执行 compact。
- 连接到 Secondary 节点,执行 compact。
- 待前两步做完之后,进行主备切换。
- 对当前的 Primary 执行 compact 命令。
Compact 命令影响&建议
- 回收磁盘碎片前,建议对数据库数据进行备份
- MongoDB 4.4 及之前的版本执行 compact 命令会导致集合所属的数据库被锁定,且该数据库的读写操作将被阻塞,建议您在业务低峰期操作
- 执行 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
- 同样以单点直连的方式连接到 Secondary
- 确认节点角色
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",
- 执行 compact 命令
3 - 执行切换
注意事项:
- 手动切换主节点过程(一般需要 30
60 秒)中,实例可能会出现 12 次连接闪断,请谨慎操作。建议在业务低峰期执行切换操作,并确保应用具备自动重连机制。 - 手动切换主节点仅改变节点的角色,不会改变节点所在的可用区和节点 ID。
4 - 对当前 Secondary 节点执行compact
参考步骤2中的步骤,执行 compact 即可
参考文档