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

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

一、日志复制流程:

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. then()方法是异步执行

    then()方法是异步执行 就是当.then()前的方法执行完后再执行then()内部的程序 这样就避免了,数据没获取到等的问题

  2. GitHub个人使用入门

    今天突然想起来了github 于是开始了入门之旅 如果你用过svn 那么你用起来感觉入门比较快的(至少我是这么感觉的)和在svn服务器上建项目的流程很像 每次修改代码之后提交的过程是: add, co ...

  3. 通过Curl 对url进行encode操作

    最近做项目的时候,通过 Gflags Reload 时候 发现对于某些value中包含=%中文等字符的支持不够好,value被截断了. 经过分析后,发现程序对url切分是用=&为标准的,如果v ...

  4. shell编程——变量子串的常用操作

    ${#字符串} 返回字符串的长度 [root@localhost ~]# a=length [root@localhost ~]# echo ${#a} 6 ${字符串:位置x} 从位置x开始往后截取 ...

  5. shell编程——sed用法

    一.sed格式: sed 参数 '正则表达式' 文件名 演示文件的内容: [root@localhost ~]# cat test.sh #!/bin/bash 第一行 12345! 第二行 2345 ...

  6. Finite State Transducers

    一, 简介 Finite State Transducers 简称 FST, 中文名:有穷状态转换器.在自然语言处理等领域有很大应用,其功能类似于字典的功能(STL 中的map,C# 中的Dictio ...

  7. Ubuntu 14.04 安装QQ2015

    作为重要的技术交流工具,Ubuntu下没有QQ还是挺不方便的. 参考链接(带软件下载链接)http://www.longene.org/forum/viewtopic.php?f=6&t=30 ...

  8. Java中String类型详解

    这篇博客是我一直想总结的,这两天一直比较忙,先上传下照片吧,过后有时间再弄成正常的. 本文主要是对Java中String类型的总结,包括其在JVM中是怎么存储的...

  9. JVM内存区域解析

    引言 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间.有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的 ...

  10. 设计模式--单例模式(Singleton)详解

    单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频繁,对于一些大型的对象,这是一笔 ...