MongoDB复制集与Raft协议异同点分析
此文已由作者温正湖授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
一、日志复制流程:
a、raft leader节点在接收client请求后,先将请求写到日志中,再将日志通过AppendEntries RPC发送到follow上。如果收到了大多数follow的确认消息,则对应日志可以在leader节点回放,之后follow上对应的日志也会被应用;
b、mongodb primary节点在接收到client/driver请求后,将数据变化写到数据库上,同时写一份日志到oplog.rs集合中,secondary节点通过tail cursor将日志从primary(或sync source,即复制源)拉取到本地马上进行回放(不会像mysql relay一样缓存到磁盘上),回放完成前将对应的oplog日志保存到本节点的oplog.rs集合。
//显然有几点不一样:
1、raft是主动推日志,mongodb是secondary拉日志; 相对来说,拉取的方式可以减轻主节点的负担。这点mongodb好些。
2、raft先写日志,日志发送到大多数节点后再应用到状态机。mongodb是先写数据,然后写日志,再通过日志拉取的方式应用到从节点。 如果日志比数据小,那么raft更具有性能优势,否则,相差无几。
二、什么时候返回客户端:
a、raft中, 是大多数节点已收到,还是写入leader日志时? 通过“● Once new entry committed: Leader executes command in its state machine, returns result to client”这句话可以知道,raft是等大多数节点收到日志,leader将日志应用到本节点后才返回客户端;
b、mongodb中,什么时候返回客户端可以由用户进行动态设置,设置项为writeConcern,通过rs.conf()可以获取当前默认的writeConcern,默认置为w=1,即写了primary后即返回。也可以在每次写操作时设置writeConcern,主要包括写入到几个节点,写入超时是多少,是否需要写日志等。
// 所以,在这点上mongodb更加灵活,但早期设置的writeConcern级别太松,导致丢数据严重。目前设置为写了primary节点再返回客户端。
三、从节点什么时候应用日志:
a、raft中,AppendEntries RPC携带了当前已经committed的log的信息,这样从节点就可以根据该信息来将这之前的log应用到本节点;
b、mongod中,从节点从复制源获取oplog信息后,马上在本节点并行回放;
//这点,mongod会更加简洁。
四、谁能成为主节点:
a、raft,“Only servers with up-to-date logs can become leader”只有拥有最新数据的节点才能成为主。// 4.21更新,raft也是跟MongoDB复制集一样,数据比大多数节点性就可以。官方ppt中的这句话,up-to-date翻译成最新容易引起误解。
b、数据比大多数节点新就可以成为主节点,新主节点在提供对外服务前,会有catchupTimeoutMills时间的catchup过程,用来短暂复制其他节点更新的数据;
//数据是否比大多数节点新,判断依据是根据日志来的
五、如何确保每个节点在一个term中只投票一次:
a、raft “Each server gives only one vote per term (persist on disk)”,也就是说会将相应信息持久化到磁盘上,具体可参考mongodb。
b、mongodb将投票信息持久化到local库下replset.election中,内容如:{ "_id" : ObjectId("58cbe1844857daa6e06ed9da"), "term" : NumberLong(4), "candidateIndex" : NumberLong(0) },记录了在那个term中给谁(candidateIndex)投票了。通过_id字段的ObjectId对象能获取投票时间。
六、新主是否会做catchup:
a、raft,“Leader’s log is “the truth””,主节点的数据是真理,新主产生后,不会从存活的从节点上拷最新的数据;
b、mongodb,默认会有2s的catchup时间,如果发现从节点数据比新主新,那么在这时间内会catchup
//两则不同的原因是,mongodb是个AP系统,C无法满足。存在2种情况,如果设置为w=1,那么如果主挂了,数据可能丢失。如果w=majority,那么如果还未满足majority时,主挂了,也就是说客户端返回错误,但这并不表示数据就写入失败了,需要等新主产生后进一步确认,因为即使新主本来没有这部分数据,也可能在catchup节点从其他节点获取。所以,这跟mysql等关系型数据库不一样。
七、主怎么知道从已经收到日志/回放了:
a、raft,通过AppendEntries RPC返回结果;
b、通过replSetUpdatePosition命令;
2017-03-30T10:48:12.839+0800 I COMMAND [conn647] command admin.$cmd command: replSetUpdatePosition { replSetUpdatePosition: 1, optimes: [ { durableOpTime: { ts: Timestamp 1490797135000|2, t: 3 }, appliedOpTime: { ts: Timestamp 1490797135000|2, t: 3 }, memberId: 0, cfgver: 454570 }, { durableOpTime: { ts: Timestamp 1490842087000|1, t: 4 }, appliedOpTime: { ts: Timestamp 1490842087000|1, t: 4 }, memberId: 1, cfgver: 454570 }, { durableOpTime: { ts: Timestamp 1490842087000|1, t: 4 }, appliedOpTime: { ts: Timestamp 1490842087000|1, t: 4 }, memberId: 2, cfgver: 454570 } ], $replData: { term: 4, lastOpCommitted: { ts: Timestamp 1490842087000|1, t: 4 }, lastOpVisible: { ts: Timestamp 0|0, t: -1 }, configVersion: 454570, replicaSetId: ObjectId('58cbe1844857daa6e06ed9d7'), primaryIndex: 0, syncSourceIndex: 0 } } numYields:0 reslen:22 locks:{} protocol:op_command 0ms
replSetUpdatePosition不是周期性的,而是实时的。从节点每完成一次oplog回放,就向其复制源发送一个replSetUpdatePosition命令。
八、节点间是否有优先级:
a、raft,大家都是平等的。
b、mongodb,有优先级概念,priority可以是非负数。浮点型
九、是否支持链式复制:
a、raft,不支持;
b、mongodb支持链式复制。好处是减小了主上的压力。尤其是在有很多从节点的场景下。不足之处是,这容易导致某些从节点的复制延迟过大。
网易云免费体验馆,0成本体验20+款云产品!
更多网易技术、产品、运营经验分享请点击。
相关文章:
【推荐】 网易云容器服务微服务化实践—微服务测试及镜像化提测全流程实践
【推荐】 流式断言器AssertJ介绍
【推荐】 【网易严选】iOS持续集成打包(Jenkins+fastlane+nginx)
MongoDB复制集与Raft协议异同点分析的更多相关文章
- Raft与MongoDB复制集协议比较
在一文搞懂raft算法一文中,从raft论文出发,详细介绍了raft的工作流程以及对特殊情况的处理.但算法.协议这种偏抽象的东西,仅仅看论文还是比较难以掌握的,需要看看在工业界的具体实现.本文关注Mo ...
- MongoDB复制集成员及状态转换
此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 复制集(Replica Set)是MongoDB核心组件,相比早期版本采用的主从(Master-Slave) ...
- MongoDB复制集原理
版权声明:本文由孔德雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/136 来源:腾云阁 https://www.qclo ...
- MongoDB复制集高可用选举机制(三)
复制集高可用选举机制 在上一章介绍了MongoDB的架构,复制集的架构直接影响着故障切换时的结果.为了能够有效的故障切换,请确保至少有一个节点能够顺利升职为主节点.保证在拥有核心业务系统的数据中心中拥 ...
- MongoDB学习4:MongoDB复制集机制和原理,搭建复制集
1.复制集的作用 1.1 MongoDB复制集的主要意义在于实现服务高可用 1.2 它的实现依赖于两个方面的功能: · 数据写入时将数据迅速复制到另一个独立节点上 · 在接收写入的 ...
- 02 . MongoDB复制集,分片集,备份与恢复
复制集 MongoDB复制集RS(ReplicationSet): 基本构成是1主2从的结构,自带互相监控投票机制(Raft(MongoDB)Paxos(mysql MGR 用的是变种)) 如果发生主 ...
- MongoDB 复制集 (一) 成员介绍
一 MongoDB 复制集简介 MongoDB的复制机制主要分为两种: Master-Slave (主从复制) 这个已经不建议使用 ...
- mongodb 复制集
mongodb 复制集 复制集简介 Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写 ...
- MongoDB复制集
1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础. 1.1.1 复制集的目的 ...
随机推荐
- MyBatis 学习记录2 Mapper对象是如何生成的
主题 以前我一直有一个问题不懂.并且觉得很神奇.就是Mybatis我们开发的时候只需要定义接口,并没有写实现类,为什么我们运行的时候就可以直接使用? 现在我想分享下这部分大致是怎么实现的. 在启动的时 ...
- python:find()函数,字符串查询
#find函数 # b中有a的元素则打印a对应的元素坐标(索引),否则打印-1 a = "abcd" b = "d" print(a.find(b))
- MySQL批量添加表字段
ALTER TABLE custom ADD contacts2 VARCHAR(50) NOT NULL DEFAULT '' COMMENT '客户联系人2',ADD phone2 VARCHAR ...
- Spark之 Spark Streaming流式处理
SparkStreaming Spark Streaming类似于Apache Storm,用于流式数据的处理.Spark Streaming有高吞吐量和容错能力强等特点.Spark Streamin ...
- Lucene介绍及简单入门案例(集成ik分词器)
介绍 Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和 ...
- Linux下各种解压命令
本文介绍了linux下的压缩程式tar.gzip.gunzip.bzip2.bunzip2.compress .uncompress. zip. unzip.rar.unrar等程式,以及如何使用它们 ...
- 解决VS2013中的控制台一闪而过的问题
修改项目配置,右键点击项目,在右键菜单中选择属性,然后在弹出的对话框左侧列表中中选择 “配置属性”-->“链接器”-->“系统”,然后在右侧的列表中, 在第一项”子系统“的值中选择”控制台 ...
- rtx 二次开发,查找所有部门
1>rtx二次开发操作类 using System; using System.Collections.Generic; using System.Linq; using System.Text ...
- git 常用commands(转)
常用 Git 命令清单 作者: 阮一峰 日期: 2015年12月 9日 我每天使用 Git ,但是很多命令记不住. 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60- ...
- sql分组获取第一条记录(sql+oracle)
sql版本 select * from (select t.CloseDate,t.ExpiryDate,t.DataTypeLookupID,ROW_NUMBER() over(partition ...