这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战
MongoDB 复制集(Replica Set)的意义在于实现服务的高可用。它的实现基于 MongoDB 的两个特性:一个是数据写入一个节点时,可以立即被复制到另外的独立节点上;另一个是,当接受写入的节点出现故障后,能够从其它节点中自动选举出一个新的替代节点。
一个典型的 MongoDB 复制集,可以由 3 个具有投票权的节点组成,包括:
- 一个主节点(PRIMARY),它可以接受写入操作,并且可以在选举时投票。
- 两个(或更多的)从节点(SECONDARY),它们可以复制主节点上的新数据,并且可以在选举时投票。
数据的复制
当一个写操作(插入、更新、删除)到达主节点的时候,这个操作指令会被记录为 oplog,同一复制集中的从节点会在主节点打开一个游标,不断获取新进入的主节点 oplog,并在自己的数据上进行回放执行,从而保持跟主节点的数据一致。
出现故障后的选举
在一个复制集中,具有投票权限的节点,两两之间会互相发送心跳,如果连续 5 次未收到心跳通知,即判断为失联。如果失联的节点是主节点,则从节点会发起选举,选出新的主节点;如果失联的是从节点,则不产生新的节点。
在一个复制集中,最多可以有 50 个节点,但具有投票权的节点最多可以有 7 个。
在进行选举时,必须有大多数的节点是存活的,并且被选举的主节点必须满足如下条件:
- 能够和多数节点之间建立联系
- 具有最新的(准确说是相对比较新的)oplog
- 如果节点配置了优先级,被选举的节点需要有相比较高的优先级
--
复制集的搭建放在下一篇。