12.MongoDB系列之副本集管理
1. 控制成员状态
1.1 把主节点变为从节点
rs.stepDown()
1.2 阻止选举
如果需要对主节点维护,不想期间其他从节点选举为主节点,则可以
rs.freeze(10000)
维护完成后,只需要再次执行以下命令即可
rs.freeze(0)
2. 监控复制
2.1 获取状态
rs.status()
2.2 可视化复制图谱
> server1.adminCommand({replSetGetStatus:1})['syncingTo']
server0:27017
表示server0是server1的复制源。
MongoDB会根据ping的时间会选择同步源。MongoDB维护着心跳时间的滑动平均值,当其选择同步源的时候,它会查找离它最近并且数据比它新的成员。因此自动复制链不会出现复制循环的问题
自动复制链的缺点是:更多复制链意味着复制需要更长的时间,最差情况复制路径会变为一条线A->B->C,当然可以通过以下命令自定义同步源:
secondary.adminCommand({'replSetSyncFrom': 'server0:27017'})
2.3 复制循环
由2.2可知,自定义同步源可能出现复制循环的问题,所以需要rs.status()仔细检查
2.4 禁用复制链
链式复制是指一个从节点从另一个从节点(而不是主节点)进行同步,可以通过如下操作实现强制每个成员从主节点同步(如果主节点不可用,则会从从节点进行同步)
var config = rs.config()
config.settings = config.settings || {}
config.settings.chainingAllowed = false
re.reconfig(config)
2.5 计算延迟
// 给出了主节点oplog的简要信息,包括大小和操作的日期范围
rs.printReplicationInfo()
// 获取每个成员的syncedTo值及最后一条oplog写入每个从节点的时间
rs.printSalveReplicationInfo()
2.6 调整oplog大小
// 检查oplog的当前大小,已MB显示集合大小
> user local
> db.oplog.rs.stats(1024*1024).maxSize
// 更改oplog大小为16G
> db.adminCommand({replSetResizeOplog: 1, size: 16000})
一般情况下,不应减少oplog的大小,毕竟只是占用磁盘空间,并且可以防止复制末尾脱节问题。