此文已由作者温正湖授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

Primary(主)是MongoDB复制集中的最重要的角色,是能够接受客户端/Driver写请求的节点,(读请求也是默认路由到Primary节点)。在复制集中,与Primary相对应的有Secondary节点和Arbiter节点,分别表示从节点(可以接受读请求)和投票节点(仅用于投票选出新的Primary)。复制集是MongoDB的高可用框架,同时可以作为业务读写分离的一种方式。复制集提供了自动故障处理功能(当然还有其他功能,本文不展开),能够自动检测Primary节点是否宕机,进而选取新的Primary节点,并通过数据回追或数据回滚等方式实现复制集中数据一致。本文借助蜂巢MongoDB云服务的运行日志查看功能,来简要介绍Primary的选举过程。

MongoDB提供了强大的SystemLog模块,相比MySQL,MongoDB的运行日志模块做得更为贴心,通过日志能够有效跟踪MongoDB内部是如何进行一个个操作的。下面的图都截取自蜂巢MongoDB云服务的运行日志模块,从中能够看到了一串的MongoDB选主日志,非常清晰明了。


1、什么时候会发起选举?

图中所示,该节点(我)发现在过去的10s中时间内,复制集中没有Primary,

那么我怎么知道这段时间没有主呢,因为我每2s会给复制集中的其他节点发送心跳,

有些节点不回我

在超时时间内(默认10s)我会一直发。

除了心跳,我还会发送其他的命令,另外我还需要跟着Primary的opLog做复制,但是我发现没法再跟他做复制了,也找不到其他节点做复制

既然没有Primary。。。

2、我能不能被选为Primary呢?

我先试探性的问大家愿不愿意让我当Primary。于是我打算先发起 “dry election”,让人惊喜的是另一个节点竟然同意了,开心 :)。由于复制集中一共3个节点。除了自己外另一个节点也同意了,那么我就有资格当Primary;注意此时term 没有更新,还是0(看第一个图~~)。因为这个是非正式选举

3、既然这样,那我就发起正式选举吧

结果当然是十拿九稳了,那么为什么要先有dry呢,为了保证选举成功率,相比正式选举,dry阶段检查的东西少,效率更高些。此时term已经自豪地更新为1。

4、我果然被大家选为Primary

一切尽在掌握中的感觉真爽!!

5、那我就把自己的角色切换为Primary呗

等等,这个时候我还不能马上接受客户端的写请求,因为我得看看自己的数据是不是最新的,怎么办呢,oplog里面的optime。看看大家的状态(数据新旧情况)

我等大家回复我:

好了,节点202回我了(他把他自己的rs.status()发给我, 看看在他的世界里这个复制集是什么情况),(200连不上),从这些信息我可以知道,我的数据是最新的。而且我从202知道200确实挂了。

6、既然我的数据是最新的,那么我就不需要从其他节点拷贝数据了

这里跟raft不一样,从raft的论文中,可以确定raft选为primary是必须要求数据最新的。但MongoDB选出的Primary,数据不一定要最新,只需要满足一个约定条件即可(oplog落后10s以内)。如果数据落后集群中的某个/些存活节点(这个情况一般出现在当前节点的priority比拥有更新数据的节点高的时候),在我对外提供写服务前,我先把这些数据从其他节点从抓过来,应用到我自己这里。但是我这个是有原则的,我不会那么贪婪,给我2s(catchUpTimeoutMillis)就好了。我能追上多少就追多少。如果时间到了,我还没有完全追上咋办呢,那也没有办法,让这些节点把没追上的数据回滚掉好了。

7、现在我的数据是最新的了,我开始作为Primary对外提供写服务。你们把写请求发过来吧~~~

也就是说,并不是成为Primary后马上就会提供写服务,而是会有个追数据的过程。我觉得这个特性如果大家么有正确理解,很容易出现问题。比如用户设置了writeconcern是majority,在主从切换的场景下,可能还未写到大多数节点的请求因为主挂了返回失败,但其实这个数据会被持久化到新主上。而严格的raft不会出现这个情况。

以上用第一张图大体介绍了选举过程。然后每一点的仔细介绍时,我将MongoDB的SystemLog级别通过db.setLogLevel()从0设置为2,重演了一遍选举。让大家看到更多的细节。

最后安利下,网易蜂巢MongoDB云服务已经重磅上线,蜂巢MongoDB由业界著名的数据库专家姜承尧亲自把关架构设计,免费提供售前技术支持。要知道姜大神的出台费可是业界最贵的 :),欢迎大家注册试用。有任何意见和建议,请随时提出。

网易云免费体验馆,0成本体验20+款云产品!

更多网易技术、产品、运营经验分享请点击

相关文章:
【推荐】 JVM锁实现探究2:synchronized深探

MongoDB之我是怎么成为Primary节点的的更多相关文章

  1. MongoDB 3.2复制集单节点部署(四)

    MongoDB在单节点中也可以做复制集,但是仅限于测试实验,最大的好处就是部署方便快速,可以随便添加新节点,节省资源.在这里我使用的是MongoDB 3.2版本进行复制集实验(但MongoDB配置文件 ...

  2. MongoDB 2.6复制集单节点部署(三)

    MongoDB在单节点中也可以做复制集,但是仅限于测试实验,最大的好处就是部署方便快速,可以随便添加新节点,节省资源.在这里我使用的是MongoDB 2.6版本进行复制集实验(但MongoDB配置文件 ...

  3. mongodb副本集(选举,节点设置,读写分离设置)

    1.相对于传统主从模式的优势 传统的主从模式,需要手工指定集群中的Master.如果Master发生故障,一般都是人工介入,指定新的Master.这个过程对于应用一般不是透明的,往往伴随着应用重新修改 ...

  4. Mongodb主、副、仲裁节点集群安装

    mongodb 的集群方式主要分为三种Replica Set / Sharding / Master-Slaver ,这里只说明最简单的集群搭建方式(生产环境),如果有多个节点可以此类推或者查看官方文 ...

  5. mongodb副本集自动切换修复节点解决方案

    副本集部署 1.启动mongod 在每台运行mongod服务的机器上增加配置文件/etc/mongodb-rs.conf,内容为: [root@MongodbF-A etc]# vi /etc/mon ...

  6. 记录一次mongodb因网络问题导致shard节点异常

    现象: 机房反馈9点左右,机房交换机故障,导致网络出现问题 业务人员反馈某个接口超时 初查:通过业务日志查看分析发现,在连接mongo的某个collections时候,报错错误如下: 在写入数据的时候 ...

  7. spring配置mongodb连接副本集多个节点

    mongodb版本3.4.x 1.配置副本集 先配置副本集,可参考我之前写的文章:http://blog.csdn.net/fuck487/article/details/78287362 注意:必须 ...

  8. 在没有任何投票节点情况下将从节点转换为Primary节点脚本

    cfg={ "_id": "rs01", "version": 2, "protocolVersion": Number ...

  9. Spring Boot 学习系列(序)—Spring Boot

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Spring Boot? Spring Boot 是由pivotal团队提供的一个基于Spring的全新框架 ...

随机推荐

  1. h5做的app和原生app的区别

    之所以说h5做的app和原生app的区别,是因为一位博友的问题: 随着 h5 的普及,是不是不再需要开发 app ? 我的回答是要分业务需求,分场合而定. 比如现在的微信小程序这么流行,甚至也取代了不 ...

  2. springboot集成swagger2构建RESTful API文档

    在开发过程中,有时候我们需要不停的测试接口,自测,或者交由测试测试接口,我们需要构建一个文档,都是单独写,太麻烦了,现在使用springboot集成swagger2来构建RESTful API文档,可 ...

  3. Node环境下实现less编译

    今天在学习less的时候发现了在node中是可以渲染的,通过调用less的render方法渲染来生成css,所以写了个小Demo. var less = require('less'); var ht ...

  4. C# 5.0中使用CallerMemberName、CallerFilePath和CallerLineNumber获取代码的调用方信息(转载)

    很多时候,我们需要在运行过程中记录一些调测的日志信息,如下所示: public void DoProcessing() { TraceMessage("DoProcessing()被XXX调 ...

  5. ASP.NET Core 运行原理剖析 (转载)

    1.1. 概述 在ASP.NET Core之前,ASP.NET Framework应用程序由IIS加载.Web应用程序的入口点由InetMgr.exe创建并调用托管.以初始化过程中触发HttpAppl ...

  6. ZooKeeper分布式

    1:zk的相关特性 1.一致性:数据一致性,数据按顺序分批入库. 2.原子性:事务要么都成功,要么都失败,不会局部化. 3.单一视图:客户端连接集群中的任一zk节点,数据都是一致的. 4.可靠性:每次 ...

  7. chromium之observer_list

    典型用法如下 /////////////////////////////////////////////////////////////////////////////// // // OVERVIE ...

  8. window下pip install Scrapy报错解决方案

    1.首先打开https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted,找到对应版本的Twisted并下载到你的文件夹. 2.利用pip install命令 ...

  9. 微信小程序数据分析之自定义分析

    在小程序后台,微信已经提供了强大的数据分析功能,包括实时统计.访问分析.来源分析和用户画像功能,可以说对一般的数据分析已经完全足够了,但有时应用需要做一些更加精准的数据分析,比如具体到某一个页面的分享 ...

  10. visual studio进程或线程自上一个步骤以来已更改

    1.自己的解决方案:visual studio在多进程执行,在配置页面(webconfig)里把UseCounterThread参数设置为0 2.公司其他人解决方案,自己试了,多进程执行的时候没起作用 ...