MongoDB复制集机制及原理


MongoDB 复制集机制及原理

一、复制集的作用

  • MongoDB 复制集的主要意义在于实现服务高可用
  • 它的实现依赖于两个方面的功能:
    • 数据写入时将数据迅速复制到另一个独立节点上
    • 在接受写入的节点发生故障时自动选举出一个新的替代节点
  • 在实现高可用的同时,复制集实现了其它几个附加功能
    • 数据分发:将数据从一个区域复制到另一个区域,减少另一个区域的读延迟
    • 读写分离:不同类型的压力分别在不同的节点上执行
    • 异地容灾:在数据中心故障的时候快速切换到异地

二、典型复制集结构

  • 一个典型的复制集由 3 个以上具有投票权的节点组成,包括:
    • 一个主节点(PRIMARY):接受写入操作和选举时投票
    • 两个(或多个)从节点(SECONDARY):复制主节点上的新数据和选举时投票
    • 不推荐使用 Arbiter(投票节点)

image.png

副本集示例

下面这张图是一个典型三节点副本集,由一个活跃节点,两个备份节点组成。活跃节点接受所有的写操作,其上数据集的所有变更都会记录到自身的操作日志(oplog)中。
image.png
image.png

备份节点复制活跃节点的的 oplog,然后将 oplog 的操作应用到自身的数据集上,以达到与活跃节点数据一致的目的,如下图所示:
image.png
此外,副本集内部节点每 2 秒会相互发送心跳包。

三、数据是如何复制的?

  • 当一个修改操作,无论是插入、更新或删除,到达主节点时,它对数据的操作将被记录下来(经过一些必要的转换),这些记录称为 oplog。
  • 从节点通过在主节点上打开一个 tailable 游标不断获取新进入主节点的 oplog ,并在自己的数据上回放,以此保持跟主节点的数据一致。

image.png

四、通过选举完成故障恢复

  • 具有投票权的节点之间两两互相发送心跳;
  • 当 5 次心跳未接收时判断为节点失联;
  • 如果失联的是主节点,从节点会发起选举,选举出新的主节点;
  • 如果失联的是从节点则不会产生新的选举;
  • 选举基于 bully 算法实现,选举成功的必要条件是大多数投票节点存活;
  • 复制集中最多可以有 50 个节点,但是有投票权的节点最多 7 个。
  • 如果活跃节点不可用,备份节点之间会自动发起选举将其中一个成员升级为新的活跃节点,如下图所示:

image.png

  • 其特点如下:
    1. 触发时机:活跃节点超过 10 秒都没有与其他节点发起心跳。
    2. 备选节点推选自身为活跃节点,并在大多数节点同意后成为活跃节点。
    3. 整个过程耗时将近 1 分钟。(发现不可用 1030 秒,选举过程 1030 秒)

五、选举机制

image.png

六、影响选举的因素

  • 整个集群必须有大多数节点存活
  • 被选举为主节点的节点必须:
    • 能够与多数节点建立连接
    • 具有较新的 oplog
    • 具有较高的优先级(如果有配置)

文章作者: Truda
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Truda !
评论
  目录