参考官方文档:

https://docs.mongodb.com/manual/replication/

在 MongoDB 中的复制

副本集是一组维护相同数据集的mongod实例。 副本集包含多个数据承载节点和可选的一个仲裁节点。 在承载数据的节点中,一个且仅一个成员被视为主节点,而其他节点被视为次要节点。

主节点接收所有写操作。 副本集只能有一个能够确认具有{w:“most”}写入的主写; 虽然在某些情况下,另一个mongod实例可能暂时认为自己也是主要的。 主记录其操作日志中的数据集的所有更改,即oplog。 有关主节点操作的详细信息,请参阅副本集主节点。




mongodb 连接 dbeaver mongodb连接失败怎么办_副本集


辅助节点复制主节点的oplog并将操作应用于其数据集,以使辅助节点的数据集反映主节点的数据集。 如果主不可用,则符合条件的辅助节点将举行选举以选出新的主。


mongodb 连接 dbeaver mongodb连接失败怎么办_mongodb 连接 dbeaver_02


您可以将额外的mongod实例添加到副本集作为仲裁者。 仲裁者不维护数据集。 仲裁者的目的是通过响应其他副本集成员的心跳和选举请求来维护副本集中的仲裁。 因为它们不存储数据集,所以仲裁器可以是提供副本集更好的仲裁功能,其资源成本比具有数据集的全功能副本集成员更便宜。 如果您的副本集具有偶数个成员,请添加仲裁者以获得主所选举中的大多数投票。 仲裁者不需要专用硬件。


mongodb 连接 dbeaver mongodb连接失败怎么办_数据_03


仲裁者将永远是仲裁者,而主可能会退出并成为次要人员,而次要人员可能会被选举成主。

异步复制

辅助节点异步应用主节点的操作。 因为在主要成员之后应用操作,尽管一个或多个成员失败,但集合仍可继续运行。

从版本4.0.6开始,辅助成员的副本集现在记录要应用长于慢操作阈值的oplog条目。 在REPL组件下的诊断日志中为辅助节点记录这些慢速oplog消息,其中应用了文本op:<oplog entry> take <num> ms。 这些缓慢的oplog条目仅取决于慢速操作阈值。 它们不依赖于日志级别(系统级别或组件级别),分析级别或慢速操作采样率。 探查器不捕获慢速oplog条目。

自动故障转移

当主节点与集合中的其他成员通信的时间超过配置的electionTimeoutMillis期限(默认为10秒)时,符合条件的次要节点要求选举将自己指定为新主节点。 群集尝试完成新主节点的选举并恢复正常操作。


mongodb 连接 dbeaver mongodb连接失败怎么办_mongodb连接失败_04


在选举成功完成之前,副本集无法处理写入操作。 如果查询在主offline时配置在次节点上,则副本集可以继续提供读取查询。

假设默认副本配置设置,群集选择新主节点之前的中位时间通常不应超过12秒。 这包括将主标记为不可用并呼叫和完成选举所需的时间。 您可以通过修改settings.electionTimeoutMillis复制配置选项来调整此时间段。 网络延迟等因素可能会延长副本集选举完成所需的时间,从而影响群集在没有主节点的情况下运行的时间。 这些因素取决于您的特定群集体系结构。

将electionTimeoutMillis复制配置选项从默认10000(10秒)降低可以更快地检测到主出现的故障。 但是,由于诸如临时网络延迟等因素,群集可能会更频繁地呼叫选举,即使主是健康的。 这可能导致w:1写入操作的回滚量增加。

您的应用程序连接逻辑应包括自动故障转移和后续选举的容差。

读操作

默认情况下,客户端从主读取; 但是,客户端可以指定读取首选项以将读取操作发送到辅助节点。 对辅助节点的异步复制意味着从辅助节点读取可能会返回不反映主节点上数据状态的数据。

包含读取操作的多文档事务必须使用read preference primary。

给定事务中的所有操作都必须路由到同一成员。

依赖于读取的concern,客户端可以在写入持久之前查看写入结果:

  • 无论写入是否关注,使用“local”或“available”readConcern的其他客户端都可以在向发布客户端确认写入操作之前查看写入操作的结果。

对于多文档事务中的操作,在事务提交之前,事务外部的数据更改在事务外部不可见。 但是,其他客户端可以在发布客户端确认提交操作之前查看事务提交时的结果。

  • 使用“local”或“available”readConcern的客户端可以读取在副本集故障转移期间可能回滚的数据。

变更 流

从MongoDB 3.6开始,变更流可用于副本集和分片集群。 变更流允许应用程序访问实时数据更改,而不会产生拖尾oplog的复杂性和风险。 应用程序可以使用变更流来订阅集合或集合上的所有数据更改。