在这篇博文中,我们将讨论副本集的延迟成员以及它如何有用。副本集的延迟成员类似于副本集的其他成员,但其数据集反映了数据的设置延迟状态。假设一个延迟节点延迟一小时,当前时间是 11:00,那么它的数据集反映了最近到 10:00 的操作。
延迟成员从主节点的 oplog 复制并应用操作,并延迟。延迟成员的延迟量必须大于或等于预期的维护窗口持续时间。延迟时间应该小于 oplog 窗口。延迟的辅助节点无法在配置的slaveDelay或secondaryDelaySecs之前确认写入。
将延迟成员的投票设置为0并隐藏可以提高集群性能。考虑一下你是否有主次延迟和次要架构,并且延迟节点不投票,延迟时间为 15 分钟。当写入关注为“多数”并且非延迟成员变得不可用时,此时应用程序必须等待大约 15 分钟的写入确认。在这种情况下,提交点将开始滞后。存储引擎将在磁盘上的提交点之后开始保留所有更改以保留持久的历史记录。它会随着时间的推移增加 I/O 写入,从而影响写入和缓存压力。
节点成为延迟次要成员的要求:
- 优先级为零:延迟的辅助节点必须具有0优先级。其优先级应设置为 0 以阻止该节点成为主节点。由于它是一个延迟成员,反映了数据集的延迟状态,所以应该防止它成为主节点。
- 隐藏:必须隐藏延迟节点。由于该节点将反映数据集的延迟状态,因此应始终停止应用程序以查看和查询延迟节点。
- Oplog:Oplog 窗口的容量必须大于指定的延迟量。
在分片中,如果平衡器正在运行,则延迟的辅助成员的好处有限。由于延迟的成员会延迟克隆块迁移,因此如果迁移发生在延迟窗口期间,则延迟成员的状态对于恢复到分片集群的先前状态将无用。
通过将members[n].priority值调整为0 ,将members [n].hidden 值调整为true,将其members[n].slaveDelay值调整为延迟秒数,可以将辅助节点配置为延迟成员辅助节点. 例如,将节点配置为延迟如下:
rs1:PRIMARY> cfg = rs.conf()
rs1:PRIMARY> cfg.members[2].priority = 0
rs1:PRIMARY> cfg.members[2].hidden = true
rs1:PRIMARY> cfg.members[2].slaveDelay = 900 //slaveDelay is in seconds and in v5.0 onwards, this parameter changed to secondaryDelaySecs.
rs1:PRIMARY> cfg.members[2].votes = 0
rs1:PRIMARY> rs.reconfig(cfg)
复制
注意:重新配置副本集可能会导致选举,因此建议在计划的维护窗口中执行上述操作。
rs1:PRIMARY> rs.conf().members[2]
{
"_id" : 3,
"host" : "demo-node-3:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : true,
"priority" : 0,
"tags" : {
},
"slaveDelay" : NumberLong(900),
"votes" : 0
}
复制
副本集的延迟从属成员发挥着什么作用?
由于延迟的辅助成员延迟了一定的时间,所以如果需要回滚到较早的时间,或者它可以作为热备份来防止错误,如意外丢失整个数据库/集合,那么它就很有用。或者,如果执行了应用程序升级,但没有成功,或者出现了操作员错误。在这种情况下,可以使用延迟的辅助成员进行恢复。
结论
在意外删除整个数据库/集合并且该删除尚未应用(即直到指定的延迟时间)的情况下,延迟辅助可能很有用。您还需要确保您有足够的 oplog 窗口以使其与主节点同步。但是,对于全面的恢复解决方案,我们建议您使用备份解决方案。您可以查看 Percona 备份解决方案,要了解更多信息,请访问Percona Backup for MongoDB。
原文标题:MongoDB: Delayed Secondary Member of a Replica Set and How It Can Be Useful
原文作者:Mukesh Kumar
原文地址:https://www.percona.com/blog/mongodb-delayed-secondary-member-of-a-replica-set-and-how-it-can-be-useful/