MongoDB复制集机制及节点选举原理
本文主要整理了MongoDB的复制集概念,并简单介绍了一下选举机制的原理。
MongoDB复制集的作用
MongoDB复制集的主要意义在于实现服务高可用。一个MongoDB复制集最多拥有7个具有投票权的从节点,每个从节点最多拥有7个子节点,再加上1个主节点。
复制集的实现主要依赖于两个方面的功能:
- 数据写入时数据迅速复制到另一个独立节点上。
- 在接受写入的节点发生故障时自动选举出一个新的替代节点。
在实现高可用的同时,复制集实现了其它几个附加作用:
- 数据分发:将数据从一个区域复制到另外一个区域,减少另一个区域的读延时。
- 读写分离:不同类型的压力分别在不同的节点上执行。
- 异地容灾:当数据中心故障时快速地切换到异地,减少数据中心故障导致的损失。
典型复制集的结构
一个典型的复制集有三个以上具有投票权的节点组成,包括:
- 一个主节点(PRIMARY): 接受写入操作和选举时投票。
- 两个或多个从节点(SECONDARY):复制主节点上的新数据和选举时的投票 。
数据复制流程
当一个修改操作,无论是插入、更新还是删除,到达主节点时,他对数据的操作将被记录下来(经过一些必要的转换),这些记录称为oplog。从节点通过在主节点打开一个 tailable 游标不断地获取新进入主节点的oplog,并在自己的数据集合上进行复现回放,从而保持数据和主节点完全一致。
MongoDB选举流程
当数据库遭遇故障时,将通过选举来完成故障恢复。为实现选举功能,MongoDB是这样做的:
- 正常状态时,具有投票权的节点之间两两互相发送心跳。当5次心跳未收到时将判断节点失联。
- 如果失联的是主节点,从节点将发起选举,选出新的主节点;如果失联的是从节点,将不会发生选举。
- 选举基于RAFT一致性算法实现,选举成功的必要条件是大多数投票节点存活。
影响选举的因素
整个集群必须有大多数节点存活,且被选举成为主节点的节点必须满足三个特征:
- 能够和大多数节点建立连接
- 具有交心的oplog
- 具有较高的优先级(可以配置)
复制集节点常常会有如下配置选项:
- 是否具有投票权:有投票权则参与投票
- 优先级参数: 优先级越高的节点越优先在选举中成为主节点。如果设置一个节点的优先级为0,则该节点一定不会成为主节点。
- 隐藏节点:此节点仅仅用作复制数据,对应用不可见。影藏节点可以具有投票权,但是其优先级一定为0.
- 延迟参数:复制一段时间以前的数据,保持与主节点的时间差。常用于恢复数据。
复制集注意事项
- 关于硬件
- 因为正常的复制集节点都有可能成为主节点,他们的地位是一样的,因此硬件上的配置应当都一致。
- 为了保证节点不会同时宕机,各节点使用的硬件必须具有独立性。
- 关于软件
- 复制集各节点软件版本必须一致,以避免出现不可预知的问题
- 增加节点不会增加系统写的性能,反而会增加节点同步的开销。如果希望提高写的性能,可以考虑MongoDB的分片机制,当然这是另外一个话题了