- MongoDB中的副本集是一组提供冗余和高可用性的 mongod 进程。
- 副本集最多可包含50个成员,但只有7个投票成员。
- 副本集成员:
Primary
:主要成员接收所有写操作。Secondaries
:辅助成员从主成员复制操作以维护相同的数据集。
- 主要成员是副本集中唯一接收写入操作的节点。
- MongoDB在主要成员上应用写操作,然后在主成员的 oplog 上记录操作。
- 辅助成员复制此日志并将操作应用于其数据集。
- 副本集的所有成员都可以接受读取操作。但是,默认情况下,应用程序将其读取操作定向到主成员。有关更改默认读取行为的详细信息,请参阅读取首选项。
- 副本集最多可以包含一个主副本。如果当前主要成员不可用,则选举确定新主要成员。
- 优先级为0的成员是不能成为主要成员且不能触发选举。
- 优先级为0的辅助成员作为普通辅助成员运行:它们维护数据集的副本,接受读取操作,并在选举中投票。
- 将辅助成员配置为优先级为0以防止它成为主要成员。
Hidden Replica Set Members
- 隐藏成员维护主数据集的副本,但对客户端应用程序不可见。
db.isMaster()
方法不显示隐藏的成员。- 客户端不会将具有适当读取首选项的读取分发给隐藏成员。因此,除基本复制外,这些成员不会收到任何流量。使用隐藏成员执行报告和备份等专用任务。
- 隐藏的成员可以在副本集选举中投票。
- 延迟成员包含副本集数据集的副本。但是,延迟成员的数据集反映了该集合的早期或延迟状态。例如,如果当前时间是09:52并且成员有一小时的延迟,则延迟成员没有比08:52更新的操作。
- 由于延迟成员是数据集的“滚动备份”或运行“历史”快照,因此它们可以帮助您从各种人为错误中恢复。
- 延迟成员:必须是优先级为0的成员。将优先级设置为0以防止延迟成员成为主要成员。
- 应该是隐藏的成员。始终阻止应用程序查看和查询延迟成员。
- 如果
members[n].votes
设置为1,则在Primary
选举中投票。
- 必须等于或大于预期的维护窗口持续时间。
- 必须小于oplog的容量。
- 仲裁者没有数据集的副本,也不能成为主要成员。
- 仲裁者可以在主要成员选举中添加投票。
- 仲裁者总是只有1次选举投票。
- 由于仲裁器不存储数据,因此它们不具有用于身份验证的用户和角色映射的内部表。因此,使用授权登录仲裁服务器的唯一方法是使用 localhost exception。
副本集的最小体系结构有三个成员。三个成员副本集可以包含三个保存数据的成员,也可以包含两个保存数据和仲裁的成员。
-
两个辅助成员都可以成为选举中的候选人。
-
除主数据库外,这些部署始终提供两个完整的数据集副本。这些副本集提供额外的容错能力和高可用性。如果主要成员不可用,则副本集将选择辅助成员作为主要成员并继续正常操作。旧主要成员在可用时重新加入集合。
-
secondary
可以成为选举的主要成员。 -
一个仲裁者。仲裁者只在选举中投票。
-
由于仲裁器不保存数据副本,因此这样的部署仅提供一个完整的数据副本。仲裁者的服务器可以配置低,付出的代价是有限的冗余和容错。
-
故障切换
- 虽然副本集提供针对单实例故障的基本保护,但其成员全部位于单个数据中心的副本集容易受到数据中心故障的影响。停电,网络中断和自然灾害都是可能影响其成员位于单个设施中的副本集的问题。
- 在不同地理位置的数据中心之间分发副本集成员会增加冗余,并在其中一个数据中心不可用时提供容错功能。
- 两个数据中心:数据中心1的两个成员和数据中心2的一个成员。如果副本集的其中一个成员是仲裁者,则将仲裁者分配给具有数据承载成员的数据中心1。如果数据中心1关闭,则副本集将变为只读。如果数据中心2关闭,则副本集仍然可写,因为数据中心1中的成员可以进行选举。
- 三个数据中心:一个成员到数据中心1,一个成员到数据中心2,一个成员到数据中心3。如果任何数据中心发生故障,副本集仍然可写,因为其余成员可以举行选举。