延迟副本集成员
延迟成员包含 a 的副本副本集的数据集。然而,延迟成员的数据集反映的是该集的较早或延迟状态。例如,如果当前时间是09:52,而一个成员有1小时的延迟,那么延迟成员没有晚于08:52的操作。
由于延迟成员是数据集的“滚动备份”或正在运行的“历史”快照,它们可以帮助您从各种人类错误中恢复。例如,延迟成员可以使从应用升级失败和操作错误中恢复成为可能,包括丢失数据库和集合。
考虑因素
需求
延迟成员
必须是 优先级0成员。将优先级设置为0以防止延迟成员成为主节点。
必须是 隐藏成员。始终防止应用程序看到和查询延迟成员。
如果
members[n].votes
设置为1,则 必须 在 选举 中投票以选择主节点。确保延迟成员不投票可以通过将members[n].votes
设置为0来提高性能。
重要
如果你的副本集包含延迟成员,请确保这些延迟成员被隐藏且不具有投票权。
隐藏延迟副本集成员可以防止应用程序在没有直接连接到该成员的情况下查看和查询延迟数据。将延迟副本集成员设置为非投票成员意味着它们不会在具有写入关注"majority"
的写操作中进行确认。
如果您不隐藏延迟成员,且一个或多个节点不可用,副本集必须等待延迟成员,并且提交点滞后。滞后的提交点可能导致性能问题。
例如,考虑一个主-次-延迟的副本集配置,其中延迟的次级成员在延迟10分钟后进行投票。
如果有一个非延迟的次级成员不可用,主-延迟的降级配置至少需要等待10分钟才能确认具有"majority"
的写操作。大多数提交点的推进将花费更长的时间,从而导致与具有主、次级和仲裁员(PSA)副本集类似的缓存压力和性能问题。
有关大多数提交点的更多信息,请参阅因果一致性和读写关注。有关解决性能问题的更多详细信息,请参阅副本集维护教程。
行为
延迟成员会延迟复制和执行来自源操作日志的操作。在确定延迟时间时,请考虑以下因素:
延迟时间必须等于或大于您预期的维护窗口持续时间。
延迟时间必须小于操作日志的容量。有关操作日志大小的更多信息,请参阅操作日志大小。
写入关注度
延迟的副本集成员可以确认使用 w: <number>
发出的写入操作。然而,对于使用 w : "majority"
发出的写入操作,延迟成员还必须是投票成员(即 members[n].votes
大于 0
),才能确认 "majority"
写入操作。非投票副本集成员(即 members[n].votes
是 0
)不能参与确认具有 majority
写入关注度的写入操作。
延迟的从副本可以最早在配置的 secondaryDelaySecs
时刻返回写入确认。
分片
在启用了 平衡器 的分片集群中,延迟成员的用途有限。因为延迟成员会延迟复制块迁移,所以分片集群中延迟成员的状态在延迟窗口内发生任何迁移时,对于恢复到分片集群的先前状态没有用。
示例
在以下5成员副本集中,主节点和所有副节点都有数据集的副本。一个成员延迟3600秒(一小时)执行操作。这个延迟的成员也被隐藏,并且是一个优先级0的成员。
配置
延迟成员的members[n].priority
设置为0
,members[n].hidden
设置为true
,以及其members[n].secondaryDelaySecs
设置为延迟的秒数
{ "_id" : <num>, "host" : <hostname:port>, "priority" : 0, "secondaryDelaySecs" : <seconds>, "hidden" : true }
要配置延迟成员,请参阅配置延迟自管理副本集成员。