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

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

一、日志复制流程:

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协议异同点分析的更多相关文章

  1. Raft与MongoDB复制集协议比较

    在一文搞懂raft算法一文中,从raft论文出发,详细介绍了raft的工作流程以及对特殊情况的处理.但算法.协议这种偏抽象的东西,仅仅看论文还是比较难以掌握的,需要看看在工业界的具体实现.本文关注Mo ...

  2. MongoDB复制集成员及状态转换

    此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 复制集(Replica Set)是MongoDB核心组件,相比早期版本采用的主从(Master-Slave) ...

  3. MongoDB复制集原理

    版权声明:本文由孔德雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/136 来源:腾云阁 https://www.qclo ...

  4. MongoDB复制集高可用选举机制(三)

    复制集高可用选举机制 在上一章介绍了MongoDB的架构,复制集的架构直接影响着故障切换时的结果.为了能够有效的故障切换,请确保至少有一个节点能够顺利升职为主节点.保证在拥有核心业务系统的数据中心中拥 ...

  5. MongoDB学习4:MongoDB复制集机制和原理,搭建复制集

    1.复制集的作用   1.1 MongoDB复制集的主要意义在于实现服务高可用   1.2 它的实现依赖于两个方面的功能:    · 数据写入时将数据迅速复制到另一个独立节点上    · 在接收写入的 ...

  6. 02 . MongoDB复制集,分片集,备份与恢复

    复制集 MongoDB复制集RS(ReplicationSet): 基本构成是1主2从的结构,自带互相监控投票机制(Raft(MongoDB)Paxos(mysql MGR 用的是变种)) 如果发生主 ...

  7. MongoDB 复制集 (一) 成员介绍

       一 MongoDB 复制集简介          MongoDB的复制机制主要分为两种:          Master-Slave    (主从复制)      这个已经不建议使用       ...

  8. mongodb 复制集

    mongodb 复制集 复制集简介 Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写 ...

  9. MongoDB复制集

    1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础. 1.1.1 复制集的目的 ...

随机推荐

  1. MyBatis 学习记录2 Mapper对象是如何生成的

    主题 以前我一直有一个问题不懂.并且觉得很神奇.就是Mybatis我们开发的时候只需要定义接口,并没有写实现类,为什么我们运行的时候就可以直接使用? 现在我想分享下这部分大致是怎么实现的. 在启动的时 ...

  2. python:find()函数,字符串查询

    #find函数 # b中有a的元素则打印a对应的元素坐标(索引),否则打印-1 a = "abcd" b = "d" print(a.find(b))

  3. MySQL批量添加表字段

    ALTER TABLE custom ADD contacts2 VARCHAR(50) NOT NULL DEFAULT '' COMMENT '客户联系人2',ADD phone2 VARCHAR ...

  4. Spark之 Spark Streaming流式处理

    SparkStreaming Spark Streaming类似于Apache Storm,用于流式数据的处理.Spark Streaming有高吞吐量和容错能力强等特点.Spark Streamin ...

  5. Lucene介绍及简单入门案例(集成ik分词器)

    介绍 Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和 ...

  6. Linux下各种解压命令

    本文介绍了linux下的压缩程式tar.gzip.gunzip.bzip2.bunzip2.compress .uncompress. zip. unzip.rar.unrar等程式,以及如何使用它们 ...

  7. 解决VS2013中的控制台一闪而过的问题

    修改项目配置,右键点击项目,在右键菜单中选择属性,然后在弹出的对话框左侧列表中中选择 “配置属性”-->“链接器”-->“系统”,然后在右侧的列表中, 在第一项”子系统“的值中选择”控制台 ...

  8. rtx 二次开发,查找所有部门

    1>rtx二次开发操作类 using System; using System.Collections.Generic; using System.Linq; using System.Text ...

  9. git 常用commands(转)

    常用 Git 命令清单   作者: 阮一峰 日期: 2015年12月 9日 我每天使用 Git ,但是很多命令记不住. 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60- ...

  10. sql分组获取第一条记录(sql+oracle)

    sql版本 select * from (select t.CloseDate,t.ExpiryDate,t.DataTypeLookupID,ROW_NUMBER() over(partition ...