MongoDB 副本
一. 简介
MongoDB 复制集由一组 MongoDB 实例组成,包含一个Primary节点和多个Secondary节点,MongoDB Driver(客户端)的所有数据都写入Primary,Secondary 从 Primary 同步写入的数据,以保持复制集内所有成员存储相同的数据集,提供数据的高可用。
二. 特殊节点
正常情况下,复制集的 Secondary 会参与 Primary 选举(自身也可能会被选为 Primary),并从 Primary 同步最新写入的数据,以保证与 Primary 存储相同的数据。
- Secondary
可以提供读服务,增加 Secondary 节点可以提供复制集的读服务能力,同时提升复制集的可用性。另外,MongoDB 支持对复制集的 Secondary 节点进行灵活的配置,以适应多种场景的需求。
- Arbiter
Arbiter 节点只参与投票,不能被选为Primary,并且不从Primary同步数据。
比如你部署了一个2个节点的复制集,1个Primary,1个Secondary,任意节点宕机,复制集将不能提供服务了(无法选出Primary),这时可以给复制集添加一个Arbiter节点,即使有节点宕机,仍能选出Primary。
Arbiter本身不存储数据,是非常轻量级的服务,当复制集成员为偶数时,最好加入一个Arbiter节点,以提升复制集可用性。
- Priority0
Priority0节点的选举优先级为0,不会被选举为Primary。
比如你跨机房A、B部署了一个复制集,并且想指定Primary必须在A机房,这时可以将B机房的复制集成员Priority设置为0,这样Primary就一定会是A机房的成员。
说明 如果这样部署,最好将大多数节点部署在A机房,否则网络分区时可能无法选出Primary。
- Vote0
MongoDB 3.0里,复制集成员最多50个,参与Primary选举投票的成员最多7个,其他成员(Vote0)的vote属性必须设置为0,即不参与投票。
- Hidden
Hidden节点不能被选为主(Priority为0),并且对Driver不可见。
因Hidden节点不会接受Driver的请求,可使用Hidden节点做一些数据备份、离线计算的任务,不会影响复制集的服务。
- Delayed
Delayed节点必须是Hidden节点,并且其数据落后于Primary一段时间(可配置,比如1个小时)。
因Delayed节点的数据比Primary落后一段时间,当错误或者无效的数据写入Primary时,可通过Delayed节点的数据来恢复到之前的时间点。
三. 数据同步
Primary 与 Secondary 之间通过 oplog 来同步数据,Primary 上的写操作完成后,会向特殊的 local.oplog.rs 集合写入一条 oplog,Secondary 不断的从 Primary获取新的 oplog 并应用。由于 oplog 的数据不断增加,local.oplog.rs 被设置为一个 capped 集合,当容量达到配置上限时,旧数据会被删除。另外考虑到oplog在Secondary上可能重复应用,oplog必须具有幂等性,即重复应用也会得到相同的结果。