MongoDB Replica Set 选举过程
Replica Set 选举过程
心跳检测
假设我们有三个节点的replica sets:X,Y和Z节点。在replica sets结构中,这三个节点每2秒会各自向其它两个节点发送一个心跳检测请求。比如X节点向Y和Z节点各发送了一个心跳检测请求,在正常情况下,Y、Z会返回一个包含自身信息的回复包,回复包中主要包括了下面一些信息:它们现在是什么角色(primary 还是 secondary),他们是否能够在必要的时候成为 primary,以及他们当前时钟时间等等。
X节点在收到回复包后,会用这些信息更新自己的一个状态映射表,更新的内容包括:是否有新的节点加入或有老的节点宕掉,这个请求的网络传输时间等等。
而当X节点的映射表发生了变化,那X会进行下面的逻辑判断:如果X是 primary,而另外一个节点出现故障,那么它会那自己是否还能和集群中大多数节点进行通信,如果不能与大多数节点通信,那么他会把自己从 primary 降级为 secondary。(在replica sets中,primary 必须能够和集群中的大多数节点进行通信,以免发生网络断开形成两个或多个节点群各自为政的情况,这样会影响到数据的一致性)
关于降级
在节点从 primary 降级为 secondary 的过程中,会有一些问题出现。在 MongoDB 中,写操作默认是通过 fire-and-forget 的模式来进行的,也就是说写操作通常不关心是否成功,发完请求后客户端就认为成功了。但如果这时候 primary 进行降级操作,那么客户端并不知道这时候 primary 已经降级成为 secondary 了,客户端可能还会将后续的写操作发送给这个节点。这时候刚刚降级的这个 secondary 可以发送一个包说“我已经不是 primary 了”,但是我们上面说过了,客户端根本就无视你这个包。所以客户端根本不知道这次写入已经失败了。
对于这个问题,你可能会说”那我们每次都使用安全写入不就行了“(安全写入意思是说等待服务器返回成功后客户端才认为写成功了),但是很明显,这非常不靠谱。所以我们的做法是,在一个 primary 降级成为 secondary 后,它会将原来的所有连接关闭。这样客户端在下一次写入的时候就会出现 socket 错误。而客户端在发现这个错误之后,就会重新向集群获取新的 primary 的地址,并将后续的写操作都往新的服务器上写入。
选举
我们回头再来看心跳监测请求:如果X是一个 secondary,那么X会定时检测是否需要选举自己成为 primary。其检测内容包括:是否集群中有其它节点认为自己是 primary?X节点自己是否已经是 primary?X节点自己是否有资格成为 primary?如果这三个问题中的任何一个回答是否定的,那么X节点就不会试图把自己变成primary。(也就是说,只有当X节点是一个能够当 primary 的secondary,并且其它节点都不是primary时,X才会发起选举并选自己为primary)
而当X发现现在需要一个 primary 并且自己又正好可以充当时,它就会发起一轮选举:X节点会向Y、Z节点各发起一个请求包,告知他们”我认为我可以接管 primary 的角色,你们觉得怎么样?“
当Y和Z收到上面的请求包时,他们会进行下面几项检测:他们是否已经知识集群中有一个 primary了?他们自己的数据是否比X节点更新?是否有其它节点的数据比X节点更新?如果上面条件有任何一个满足,那么他们都会认为X不够资格成为 primary,他们会发送一个返回包告知X说”停止选举!“。而如果三个条件都不成立,也就是说他们认为目前集群中确实没有 primary,并且X的数据又是最新的,那么他们会发送返回包告知X说”没问题“。
如果X收到”停止选举!“的返回,那么他会马上停止选举并保持自己为 sencondary 状态。
如果X收到所有其它节点都返回说”没问题“,那么他会进入选举过程的第二阶段。
在第二阶段中,X会向其它节点发送一个包,说”我宣布我已经是 primary 了“。这时候,Y和Z节点再进行一些最终的确认:上面的判断过的所有条件是否依然表明X可以做 primary,如果确实如此,那么他们会在本轮 primary 选举中向X出赞成票。并且他们投完赞成票后,30秒内不会再做其它投票决定。
上面是说如果第二次确认还是通过的情况,那么如果最终确认没有通过呢。他们会投一个反对票,反对X成为 primary,如果有反对票产生,那么这一轮选举就失败了。X还是保持 secondary 的身份。
下面我们假设一种情况,如果Y给X投了赞成票,而Z给X投了反对票。那这时候Y由于投了赞成票,它在30秒内不能再进行投票。所以如果这时候Z发起选举想让自己成为 primary,那么Z这时候必须要获得X的赞成票。因为这时候Y不能投票,为了获取多数票,Z必须获得X的赞成票。
所以投票的规则是这样的:如果没有人投反对票,并且赞成票的比例过半,那么本轮选举对象就能够成为 primary。
MongoDB Replica Set 选举过程的更多相关文章
- MongoDB Replica Set 选举过程
什么是选举? 选举是副本集选择某个成员成为primary的过程.primary是一个副本集中唯一能够接收写操作的成员. 下面的事件能够引发一次选举: 第一次初始化一个副本集 Primary失效.rep ...
- MongoDB的选举过程(转)
转自:http://www.mongoing.com/archives/295 MongoDB的复制集具有自动容忍部分节点宕机的功能,在复制集出现问题时时,会触发选举相关的过程,完成主从节点自动切换. ...
- 关于MongoDb Replica Set的故障转移集群——实战篇
如果你还不了解Replica Set的相关理论,请猛戳传送门阅读笔者的上一篇博文. 因为Replica Set已经属于MongoDb的进阶应用,下文中关于MongoDb的基础知识笔者就不再赘述了,请参 ...
- mongodb replica set 和 nodejs中使用mongoose连接replica
一.mongodb replication 介绍 官网上的第一句话就是Replication is the process of synchronizing data across multiple ...
- mongoDB Replica集群配置(1主+1从+1仲裁)
1.mongoDB节点介绍 主节点(Primary) 在复制集中,主节点是唯一能够接收写请求的节点.MongoDB在主节点进行写操作,并将这些操作记录到主节点的oplog中.而从节点将会从oplog复 ...
- 转 Warning:MongoDB Replica Sets配置注意事项
我们知道,MongoDB不提供单机的数据安全性,取而代之的是提供了Replica Sets的高可用方案.官方文档中提到的案例是三个节点组成的Replica Sets,这样在其中任何一个节点宕机后都会自 ...
- MongoDB Replica Set搭建集群
MongoDB做集群,版本3.2官网推荐的集群方式Replica Set 准备服务器3台 两个standard节点(这两个节点直接可以互切primary secondary). 一个arbiter节点 ...
- mongodb replica set 配置高性能多服务器详解
mongodb的多服务器配置,以前写过一篇文章,是master-slave模式的,请参考:详解mongodb 主从配置.master-slave模式,不能自动实现故障转移和恢复.所以推荐大家使用mon ...
- MongoDb Replica Set中使用的地址
Unable to connect to a member of the replica set matching the read preference Primary 今天尝试使用MongoDB ...
随机推荐
- 08 Transactions
本章提要------------------------------------------事务的特性事务控制语句------------------------------------------事 ...
- w3c与微软(IE)事件注册区别 -Tom
严格来说,有2中不同的模型:W3C模型和微软模型,除IE之外W3C模型支持所有的现代浏览器,而微软模型只支持IE,使用W3C模型的代码如下: // 格式:target.addEventListener ...
- ORA-32004 参数设置过时的解决办法
启动时报错: 查看日志: view /opt/oracle11g/app/db/diag/rdbms/yldev/yldev/trace/alert_yldev.log 原来是plsql_debug ...
- rpm and yum commands
rpm命令 rpm包,由“-”.“.”构成,包名.版本信息.版本号.运行平台 对已安装软件信息的查询 rpm -qa 查询已安装的软件 rpm ...
- 使用SurfaceView
一.新建一个工程“LearnSurfaceView” 二.新建一个类“MySurfaceView” public class MySurfaceView extends SurfaceView imp ...
- 图解javascript中this指向
JavaScript 是一种脚本语言,支持函数式编程.闭包.基于原型的继承等高级功能.JavaScript一开始看起来感觉会很容易入门,但是随着使用的深入,你会发JavaScript其实很难掌握,有些 ...
- tabhost切换标签:Log中出现You must supply a layout_width attribute的解决方法
谷歌.百度该问题,发现,除非是真的忘记添加layout_height或者layout_width属性值,对于布局文件没有语法问题但又难以发现问题所在的情况,从自己的经历和一个帖子的说明看到,该错误多半 ...
- html年月日下拉联动菜单 年月日三下拉框联动
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- python核心编程第六章练习6-8
6-8.列表.给出一个整型值,返回代表该值得英文,比如输入89会返回“eight-nine”.附加题:能够返回符合英文语法规律的新式,比如输入89会返回“eighty-nine”.本练习中的值假定在0 ...
- hibernate4.3.10使用注解映射方式样例
1.调用例子 import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.boot.re ...