MongoDB的复制集具有自动容忍部分节点宕机的功能,在复制集出现问题时时,会触发选举相关的过程,完成主从节点自动切换.
每个复制集成员都会在后台运行与复制集所有节点的心跳线程,在两种情况下会触发状态检测过程:

  • 复制集成员心跳检测结果发生变化,比如某个节点挂了或者新增节点.
  • 超过4s没有执行状态检测过程.

在状态检测过程大致包含以下步骤:

  • 检测自身是否处于选举过程,如果是,退出本次过程.
  • 维护一个主节点的备用列表,列表中所有节点都可能被选举为主节点,每个节点都会检测自身以及全局条件是否满足:
    • 是否看见复制集中是否有Majority在线.
    • 自身priority大于0.
    • 自身不为arbiter.
    • 自身opTime不能落后于最新节点10s以上.
    • 自身存储的集群程序按信息为最新.

如果所有条件满足,则将自身添加到主节点备用列表中,否则,将自身从列表中移除.

  • 检测以下条件,若都满足,将主节点将为从节点(如果要降级的主节点是自身,直接调用降级方法,如果不为自身,调用replSetStepDown命令将复制集主节点降级为从节点.):

    • 集群中主节点存在.
    • “主节点的备用列表”中存在比当前的主节点priority更高的节点.
    • “主节点的备用列表”中priority最高的节点,其opTime要比其他所有节点最新的opTime落后10s以内.
  • 检测自身是否为主,若为主,且自身无法看见复制集的Majority在线,将自身降级为从.
  • 如果看不见集群中有主节点存在,检测自身是否在”主节点的备用列表”,若不在,打印log并退出此流程.
  • 若自身在”主节点的备用列表”中,开始判断自身可否向复制集中发送选举自身为主节点的通知,判断过程包含:
    • 自身是否可以看见复制集中的Majority在线.
    • 自身是否在”主节点的备用列表”.
      若条件满足,则设置”自身已经在选举过程中”标识位为true,并进入”选举自身为主节点”方法.
  • 方法中会验证自身是否满足以下条件:
    • 此线程拿到了线程锁.
    • 此节点没有被配置slaveDelay选项或者配置的slaveDelay为0.
    • 此节点没有被配置为arbiter.
      若满足,则调用环境检测,若以下条件被触发,则不发送“选举我为主节点”投票:
    • 当前时间小于steppedDown的结束冻结时间(为执行steppedDown时的时间+冻结设定时间,内部调用为60s).
    • 自己的opTime不是所有节点最新的.
      • 若有节点opTime比自己新,直接退出此流程.
      • 如果其他最新的节点最多与自己一样新,每有一个这样的节点,随机sleep一段时间,之后继续判断.
    • 自己上线5分钟内且复制集中不是所有节点在线.
  • 如无其他问题,尝试获取自己进行投票时的票数,在此过程中,会判断自己在30s内是否进行过投票,如进行过,直接退出整个过程.
  • 经过以上种种复杂的检测,终于可以向复制集发送”选举我为主节点”的投票.
  • 发送之后,会接收来自所有节点的投票,若得票数小于等于一半,不将自己变为主节点,若超过一半,设置自己为主节点.
    投票结束后,设置”自身已经在选举过程中”标识位为false.
    可以看到,上面的判断逻辑有一些是重复判断,不过不影响最终结果,可能与判断逻辑较为复杂有关系,在每个决定之前都要验证所有条件是否满足,防止有条件被漏掉.
    在复制集中的节点收到其他节点发送的”选举我为主节点”投票信息时,会有以下的判断:
  • 若自身存储的复制集配置版本过低,不投票.
  • 若发起请求的节点存储的复制集配置版本过低,投反对票.
  • 如果自身所在的复制集没有发起投票的节点,投反对票.
  • 复制集中存在主节点,投反对票.
  • 可参与选举的节点中有priority高于请求为主的节点存在时,投反对票.
    如果所有条件通过,获取自身的投票数(同样会判断自身在30s内是否参加过投票,若参加过,不再投票),投出票数.
    需要说一下的是,一个反对会将最终票数减10000,即在绝大多数情况下,只要有节点反对,请求的节点就不能成为主节点.
    选举过程很复杂,实际使用中总结为两点:
  • 一般情况下需要5s左右进行选主.
  • 如果新选举出的主节点立马挂掉,至少需要30s时间重新选主.

MongoDB的选举过程相关推荐

  1. MongoDB Replica Set 选举过程

    Replica Set 选举过程 心跳检测 假设我们有三个节点的replica sets:X,Y和Z节点.在replica sets结构中,这三个节点每2秒会各自向其它两个节点发送一个心跳检测请求.比 ...

  2. Mongodb在使用过程中有什么问题

    mongodb在使用过程中有什么问题 关于连接方面 1. mongodb目标计算机积极拒绝无法连接 此问题很多情况下是出现在window安装 Mongo时,出现的主要原因是配置没配好: 1. 要把Mo ...

  3. Zookeeper的ZAB协议和Leader选举过程剖析

    Zookeeper的ZAB协议和Leader选举过程剖析 关键词 ZAB 崩溃恢复 和 消息⼴播 原子广播协议(⼆阶段提交),数据不⼀致问题 崩溃恢复(Leader选举算法/zxid) 选举:投票先投 ...

  4. 搭建etcd 3.4.15集群(详细教程,包括选举过程、数据备份和恢复)

    推荐阅读 Helm3(K8S 资源对象管理工具)视频教程:https://edu.csdn.net/course/detail/32506 Helm3(K8S 资源对象管理工具)博客专栏:https: ...

  5. 你知道DR和BDR选举过程吗?了解一下?!精华总结(华为设备,抓包分析,OSPF的DR不抢占原则和wait时间)

    文章目录 前言 一:OSPF邻接关系 1.1:七个状态 二:抓包分析选举过程 2.1:环境 2.2:拓扑图 2.3:配置并抓包分析 三:DR和BDR选举的总结 3.1:第一个hello包什么时候出现? ...

  6. mediasoup ICE提名选举过程

    mediasoup ICE提名选举过程 1 ICE 状态 2 ICE 提名流程图 1 ICE 状态 mediasoup 的 ICE 有4种状态,分别是NEW,CONNECTED,COMPLETED,D ...

  7. 节约用电倡议_开放数据倡议可真实反映选举过程

    节约用电倡议 国家民主研究所已宣布启动公开选举数据倡议 . 该计划的目标是确保公民团体能够获得能够真实反映选举过程的选举数据,包括候选人如何获得认证,选举人的方式和登记方式,选举日发生的事情,结果是否 ...

  8. kafka leader选举过程

    前言 通过之前的篇章,我们了解到kafka集群中存在一个leader,这个leader目前来说,通常是谁先注册到zk中,即在broker的ids节点中的第一位,就是leader 但是在某些情况下,比如 ...

  9. MongoDB复制选举原理及复制集管理

    一.MongoDB复制集的选举原理 复制是基于操作日志oplog,相当于MySQL中的二进制日志,只记录发生改变的记录.复制是将主节点的oplog日志同步应用到其他从节点的过程. 复制集的节点是通过选 ...

最新文章

  1. 2021-07-23 图像分割
  2. OpenCV——KNN分类算法 摘
  3. android 导入sqlite文件怎么打开,如何将sqlite文件导入到我的项目中?
  4. bzoj 2653 middle (可持久化线段树)
  5. SEO优化如何“搭乘”线上营销推广“列车”?
  6. OpenCV中cornerSubPixel()亚像素求精原理
  7. java 输入任何字符继续_Thinking in Java 4th chap13笔记-字符串
  8. neo4j limit
  9. 开源数字媒体资产管理系统:Razuna安装方法
  10. Django表中的字段
  11. Mycat跨库join实现方式总结
  12. STM32MP157 Linux系统移植开发篇16:Linux内核音频驱动移植
  13. 整理:状态机的编程思想
  14. RGB颜色值与十六进制颜色码转换工具
  15. Matlab坐标轴标签中文设置宋体,英文设置新罗马字体(Times New Roman)
  16. py读取xlsx文件
  17. ip.php是什么意思,有人频繁试探云主机的 ip_js. PHP 是什么操作?
  18. Fractions (水)
  19. 新手操作更换固态和重装系统竟然这么麻烦?!
  20. Visual Studio主题与配色方案

热门文章

  1. 《Fluid Engine Development》 学习笔记3-光滑粒子流体动力学
  2. [MySQL] specified key was too long max key length is 767bytes
  3. Ubuntu终端里面显示路径名称太长,怎么设置变短【转】
  4. iOS 开发,该如何解决弹窗的设计问题?
  5. 智能卡开发的相关总结
  6. jquery中的全局事件
  7. ActiveReports 报表应用教程 (7)---交叉报表及数据透视图实现方案
  8. Resnet论文解读与TensorFlow代码分析
  9. 【机器学习】机器学习的主要挑战与应对方式
  10. 网际协议IP与其配套协议