此集群拥有一个主节点(Master)和多个从节点(Slave),与主从复制模式类似,但是副本集与主从复制的区别在于:当集群中主节点发生故障时,副本集可以自动投票,选举出新的主节点,并引导其余的从节点连接新的主节点。
**MongoDB 的副本集是自带故障恢复功能的主从复制 **
主节点(Primary)
Primary 是副本集的主节点,可读写,唯一可以进行写操作的节点,由集群自行选举出来
副本节点(Secondary)
Seconary 会参与 Primary 选举,并从 Primary 同步最新写入的数据,以保证与 Primary 存储相同的数据(Seconary 默认不提供读写服务)
仲裁者(Arbiter)
Arbiter 节点只参与投票,不能被选为 Primary,并且不从 Primary 同步数据
intial sync(全量同步)
Replication(增量同步)
全量同步结束后,从节点不断的从主节点拉取 oplog 并重放应用到自身,这个过程并不是由一个线程来完成的,mongodb 为了提升同步效率,将拉取 oplog 以及重放 oplog 分到了不同的线程来执行。
需要进行 Primary 选举的场景如下:
每一个副本集节点根据自己维护的节点状态信息,如果判断出整个副本集没有主节点,而且本身具备升主节点条件,则会引发一次投票选举
投票发起者向副本集成员发起 Elect 请求,成员在收到请求后经过会一系列检查,如果通过检查则为发起者投一票
检查条件如下:
如果投票发起者获得超过半数(初始化时整个副本集节点的数量的一半)的投票,则选举通过成为 Primary 节点,否则重新发起投票
所有成员都可以投否决票,否决票具有一票否决权,所以一般可以认为只要有成员反对,则发起选举节点将不能成为 Primary
投否决票一般需要判断以下三个条件:
注:如果以上任意一个条件满足,则会停止选举过程;原计划升为主节点将仍旧保持 Secondary 状态
官方推荐副本集的成员数量为奇数,且至少副本集包含 3 个节点