1.选举协议

下面是官网对老版本和新版本复制协议的简洁说明:

pv0: 基于priority 和 optime 选举新主,依赖clock synchronization。

有选举权的节点,每一轮选举最多投一票,在30s内,不能重复投票。

pv1:基于Raft协议,每个成员都有 对候选主列表成员投赞成或者反对票,不是单方面否决选举,没有节点投反对票,且获得赞成票数超过有权投票节点总数的1/2,则能成为Primary。否则进入下一轮选举。

因使用了Raft协议,加快  back-to-back选主,减少整个选举新主所需花费的总时间,相应的会增加WriteConcern(w:1)rollback的可能性。

Raft将时间分为多个term,term以连续的整数来标识,每个term以一次election开始,如果有server被选为leader,则该term的剩余时间该server都是leader。

有些term里,可能并没有选出leader,这时候会开启一个新term来继续选主,如上图中的t3。

2.怎么选举?

选举:

假设X是一个Secondary,那么X会定时检测是否需要选举自己成为Primary。其检测内容包括:

1) 是否集群中有其它节点认为自己是Primary?

2) X节点自己是否已经是Primary?

3) X节点自己是否有资格成为Primary?

如果这三个问题中的任何一个回答是否定的,那么X节点就不会试图把自己变成Primary。(也就是说,只有当X节点是一个能够当Primary 的secondary,并且其它节点都不是Primary时,X才会发起选举并选自己为Primary)。

投票规则:如果没有节点投反对票,且获得赞成票数超过有权投票节点总数的1/2,则能成为Primary。否则进入下一轮选举。

3.2之前(只支持pv0 协议):

影响选举的因素:

1)优先级(先看优先级,级别越高,优先为主,priority=0:表示不参与选举、不能成为主)

2)optime (如果优先级都相同,则有最新的 optime 的成为主) 注意:集群中 prority 最大,但是optime 不是最新的,落后集群其他最新optime超过10s的prority 最大也不能选为主。

3)心跳 (副本级中的每个member默认都是每2秒ping 其他节点,如果超过{"heartbeatTimeoutSecs" : 10} 默认是10秒没有回应,则标记节点不可达s_down)

网络分裂(Network Partition):

如果Primary在少数的那一组,那么次Primary会变成Secondary,多数节点(互相能通信)的那组选举新的主(Primary)。

例外情况:如发生网络分裂,被分裂的一组选举出一个新的Primary,老的Primary还没降级,这就出现了2个Primary,这就是脑裂现象。此时2个Primary都有写入,直到网络恢复后,若老主再次成为Primary,则脑裂过程中选举出的新Primary会回滚脑裂过程新写入的数据;若老主成为Secondary,则回滚老主脑裂过程新写入的数据。

>= 3.2开始:

支持pv0 协议、pv1协议,默认是pv1协议。

影响选举的因素:

1)Replication Election Protocol(从3.2开始支持protocolVersion: 1)

2)优先级(先看优先级,级别越高,优先为主,priority=0:表示不参与选举、不能成为主)

3)optime (如果优先级都相同,则有最新的 optime 的成为主)

4)心跳 (副本级中的每个member默认都是每2秒ping 其他节点,protocolVersion:0如果超过{"heartbeatTimeoutSecs" : 10} 默认是10秒 或者 protocolVersion:1时 electionTimeoutMillis 默认是10秒没有回应,则标记节点不可达s_down,类似Redis sentinel主观下线)

下面status的节点有资格成为选举者:

PRIMARY

SECONDARY

RECOVERING

ARBITER

ROLLBACK

什么时候发生选举主?

1)初始化副本集

2)修改了节点的priority  (config.members[0].priority = 3)

3)网络分裂(当前的Primary和多数的节点不通,当前Primary变成Secondary多数节点的组重新选Primary)

4)当前主上执行rs.stepDown()

5)Secondary ping超过heartbeatTimeoutSecs 后不可达,则标记Primary s_down,发生选主

Rollbacks During Replica Set Failover:

回滚的限制:

超过300MB的rollbacks,则需要重新全同步。

影响回滚的配置参数:

settings.catchUpTimeoutMillis:新选举出来的的新主,sync from 集群中有更新的数据同步的时间,在整个过程新主是不可write。其他节点(其他Secondary包括以后加入到集群的老主)都需要从新主同步,他们需要rollback 一些数据,都需要与新主数据对齐(保证数据一致性),增加此参数值,可以减少回滚的数据量,加速回滚;同时也会增加failover 的时间。

多次选举:

并不是每次都是一次就可以选出新主,那么pv0和pv1分别是怎么多次选举?

假设:有3个节点A、B、C,当集群都是Secondary,此时发生选主时候,有资格成为主的A发起选主(发给集群其他节点,我要成为主),B、C收到A的选主请求后,结果B给A投了赞成票,C给A投了反对票,此时无主,要进入下一轮选主。若下一轮C发起我要成为主,由于B上次投出了赞成票,若是pv0,则30秒内不能再投票,此时C必须获得A的赞成票后才能成为主。若是pv1,B很快就开启下一个term,进入投票,这样对比,pv1 比 pv0  可能更快选出新主。也即Back-to-Back Elections(紧邻选举/多次连续选举)。

参考文献:

mongodb一致性协议_Mongodb选举机制相关推荐

  1. mongodb一致性协议_mongodb副本集用一致性快照方法添加从节点步骤

    环境描述 主节点 192.168.0.1:27002 两个从节点 192.168.0.2:27002 192.168.0.3:27002 目标:用一致性快照方式添加第三个从节点192.168.0.3 ...

  2. mongodb一致性协议_mongo的怎么保持事物的一致性-问答-阿里云开发者社区-阿里云...

    http://docs.mongoing.com/manual-zh/tutorial/perform-two-phase-commits.html 要么操作全都执行,要么都不执行,不能执行一半,改了 ...

  3. Mongodb集群 - 副本集内部选举机制

    今天有同事问我,副本集两个节点怎么做高可用,我也很好奇两个节点用副本集的方式怎么做高可用?查了一些资料,发现至少要三个节点才能做,也算是给自己普及理论知识. 选举算法 mongodb副本集的选举机制采 ...

  4. 循序渐进大数据组件之--【Zookeeper 03】进阶(选举机制以及ZBA协议)

    目录 一.选举机制 1.概述 2.选举信息包含: 3.比较原则: 二.ZAB协议 2.1.原子广播

  5. mongodb模糊查询_MongoDB技术从0到1+

    本文是陈仕在"青芒话生长"MongoDB征文比赛的获奖文章,下面我们一起来欣赏下. 前言 偶然机会看到mongo中文社区办了场征文活动,觉得挺有意思的,虽说自己还在成为大佬的路上, ...

  6. 超详细解析 | 一致性协议算法-2PC、3PC、Paxos、Raft、ZAB、NWR

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:r6d.cn/VMW9 背景 在常见的分布式系统中, ...

  7. 面试官问:ZooKeeper 一致性协议 ZAB 原理

    2019独角兽企业重金招聘Python工程师标准>>> 一致性协议有很多种,比如 Paxos,Raft,2PC,3PC等等,今天我们讲一种协议,ZAB 协议,该协议应该是所有一致性协 ...

  8. 一致性协议算法-2PC、3PC、Paxos、Raft、ZAB、NWR超详细解析

    背景 在常见的分布式系统中,总会发生诸如机器宕机或网络异常(包括消息的延迟.丢失.重复.乱序,还有网络分区)等情况. 一致性算法需要解决的问题就是如何在一个可能发生上述异常的分布式系统中,快速且正确地 ...

  9. 【Zookeeper】Zookeeper一致性协议——ZAB

    Zookeeper一致性协议--ZAB ZAB协议简介 Zookeeper通过ZAB保证分布式事务的最终一致性. ZAB全称Zookeeper Atomic Broadcast(ZAB,Zookeep ...

  10. 一致性协议raft详解(三):raft中的消息类型

    一致性协议raft详解(三):raft中的消息类型 前言 raft 节点 Raft中RPC的种类 RequestVote leader选举成功后 AppendEntries 请求参数 返回值 存储日志 ...

最新文章

  1. 《Sibelius 脚本程序设计》连载(四十七) - 4.17 BracketsAndBraces 与 Bracket
  2. Redis管道 发布订阅
  3. pac (PAC(Proxy Auto Config) 是一个 Script;经由编写这个 Script,我们可以让系统判断在怎么样的情形下,要利用哪一台 Proxy 来进行联机。)...
  4. android 获取网卡mac_Java获取Linux安卓设备的mac地址方法
  5. java web消息机制_JavaWeb BeanUtils信息类原理详解
  6. c语言ftell函数,C语言中ftell函数的使用方法
  7. Ubuntu最佳字体推荐
  8. svn报错E175002
  9. 如何在word中批量编辑所有图片的大小?
  10. 内网服务器防火墙作用,防火墙内网用户通过公网域名访问内部服务器典型配置案例集...
  11. 完美兼容MIC5203-3.3BM5的高压LDO-CSM5133SE/CSM5130SE
  12. Eolink 征文活动- -专为开发者设计的一款国产免费 API 协作平台
  13. oracle 日志 性能,Oracle日志的性能介绍及原理剖析-Oracle
  14. 获取平面的法向量_艾孜尔江撰
  15. 职称计算机证书保质期多少年,请问PETS5证书取得后有效期是几年?谢谢!
  16. 京东一面+京东物流二面+京东秋招一二面
  17. 判断一个日期是否在活动范围内,活动还未开始? 活动已结束?
  18. python爬虫学习 - 查看显卡价格
  19. 周济来了,“牛皮癣”走了
  20. 文件系统(五)—VFS初始化

热门文章

  1. 用ros3.3中的nth进行带宽叠加
  2. 基于opencv的图片文字识别实战
  3. 计算机安装win10系统还原,解决win10电脑一键还原教程
  4. java 判断exception类型_Java中获取Exception的详细信息
  5. GSOAP 在一个客户端内调用多个服务出现的问题解决
  6. 齐齐哈尔计算机应用软件学校,齐齐哈尔职业学院计算机应用技术专业介绍
  7. Android开发之渐变效果gradient属性
  8. Kafka:增加Topic的分区数
  9. 六个免费网站状态监控服务
  10. 跨时区存储跨时区展示时间 | js 获取当前UTC时间