# MongoDB 复制集

# 作用

  • 实现服务高可用。

    • 数据写入时能迅速将数据复制到另一个独立节点上。
    • 在接受写入的节点发生故障的时候会自动选举出一个新的替代节点。
  • 在实现高可用的同时,还能实现一些附加作用:

    • 数据分发:将数据从一个区域复制到另一个区域,减少另一个区域的延迟。
    • 读写分离:不同类型的压力分别在不同的节点上执行。
    • 异地容灾:节点可以分布在不同的可用区,在数据中心故障的时候可以快速的切换到异地。

# 搭建

一个典型的复制集由 3 个及 3 个以上具有投票权的节点组成,包括:

  • 一个 primary 节点: 接收写操作和选举时投票
  • 两个或者多个 secondary 节点:复制主节点上的新数据和选举时投票。
  • arbiter 节点,也叫投票节点,不存储数据,只用来投票,一般用在只有偶数个数据节点的情况下,为了构成奇数个节点来满足投票大多数的要求,不推荐使用。

# 数据是如何复制的?

  • 当一个修改操作,无论是插入,删除或者更新操作,到达主节点时,它对数据的操作将被记录下来,这些记录存在 local 数据库的 oplog 表中。
  • secondary 节点通过在主节点上打开一个 tailable 游标不断获取进入主节点的 oplog,并且在自己的数据库中回放,以保持跟主节点数据的一致。

# 选举流程

  • 具有投票权的节点之间亮亮发送心跳。
  • 当 5 次心跳未收到回复的时候判断为节点失联
  • 如果失联的是主节点,从节点会发起选举,选出新的主节点。
  • 如果失联的是从节点则不会产生新的选举。
  • 基于 RAFT 一致性算法实现,选举成功的必要条件是大多数的投票节点存活。
  • 复制集中最多可以有 50 个节点,但是投票节点最多只能有 7 个。

# 影响选举的因素

  • 整个集群中必须有大多数节点存活

  • 被选举为主节点的节点必须:

    • 能够与多数节点建立连接
    • 具有较新的 oplog
    • 具有较高的优先级

# 复制集的选项

  • 是否具有投票权,
  • 优先级: priority, 优先级越高,越容易成为主节点,优先级为 0 的节点无法成为主节点
  • 隐藏: hidden,复制数据,但对应用不可见。隐藏节点可以具有投票权,但优先级必须为 0,也就是说不会被选为主节点。
  • 延迟: slaveDelay,复制 n 秒之前的数据,保持与主节点的时间差。

# 注意事项

  • 正常的复制集节点都可能成为主节点,因为硬件配置最好是一样的。
  • 为保证节点不会同时宕机,各节点不应该部署在同一个机器或者同一个区域。
  • 复制集的软件版本必须一致,避免出现一些奇怪的问题。
  • 增加节点可以扩展系统的读性能,但是不能扩展系统的写性能。
上次更新: 5/12/2020, 2:19:47 AM