分布式一致性问题-Raft算法解读

1、一些概念

term: 任期,比如新的选举任期,即整个集群初始化时,或者新的Leader选举就会开始一个新的选举任期。

大多数: 假设一个集群由N个节点组成,那么大多数就是至少N/2+1。例如:3个节点的集群,大多数就是至少2;5个节点的集群,大多数就是至少3。

状态: 每个节点有三种状态,且某一时刻只能是三种状态中的一种:Follower(图左),Candidate(图中),Leader(图右)。假设三种状态不同图案如下所示:

node的三种状态

初始化状态时,节点都是 Follower 状态,并且 term 为0.

如果一段时间后,跟随者没有监听到领导者发来的消息,那么自己将变成候选人身份

初始阶段

2、Leader选取过程

完成选取后,所有的请求必定经过Leader节点

1、在Raft算法中,会有两个超时时间设置来控制选举过程:选举超时心跳超时,其详细的解释在下一节。

初始状态下,所有节点会进入选举周期,都会在一个随机周期内变为候选节点。

初始状态

2、当有节点成为候选节点,自然的会进入选取任期1,并且自然可以拿到自己的一个投票。

候选人

3、紧接着,候选节点会像其他所有节点发送投票请求,只有拿到大多数的选票才能成为Leader。
当然候选人也是不能重复投票的,在一个选取周期内,节点智能投出去一次。
注意:在 发送投票请求 和 响应请求 的时候节点都会启动 选取超时


候选人将发送 投票请求 给其它节点

4、如果候选节点能拿到过半数的投票,那就可以成为一个Leader。
注意:候选节点可能会同时存在多个,候选节点的票数也有可能出现一致的情况(一般偶数个节点会出现,所以节点数一般不要选偶数)。一次投票过程有且只能产生一个leader。

获半数支持可以成为Leader

5、Leader选举成功后,Leader节点就会不断的往Follower节点发送附加日志。这些消息是周期性发送,也叫 心跳包;当然在设值的时候,这个心跳包中也会附加同步操作。

发送附加日志

6、选举周期将一直持续直到某个跟随者没有收到心跳包并成为候选人。


重新选举

此时Node A就是 选取周期2的Leader了

至此最为普通的选举过程结束了。但是现实情况中还是可能同时存在两个候选节点的情况,或者网络分区导致有两个Leader的情况。


3、重新选取

两个候选节点的情况
1、在某种条件下,是会产生多个候选节点的,然后这两个候选节点会往A/C同时发送投票请求。

image.png

2、你说巧不巧,这个时候节点A投给了B,节点C投给了D。这种情况下B和D谁都不能拿到多数票,毕竟A、C同一时间只能投给一个节点。


image.png

3、这种情况下会重新进行一次竞选请求,这个就看这两个节点的随机函数结果了。


image.png

此时B的选取周期先结束,Node B就会被选为Leader。


4、两个超时

接下来介绍Raft中两个很重要的超时设置:
选举超时心跳超时
election timeout,一般是150毫秒到300毫秒之间的随机数
heartbeat timeout,视情况而定。

  • 1、选举超时

    为了防止3个节点(假设集群由3个节点组成)同时发起投票,会给每个节点分配一个随机的选举超时时间(Election Timeout),即从Follower状态成为Candidate状态需要等待的时间。在这个时间内,节点必须等待,不能成为Candidate状态。

  • 2、心跳超时

    如下图所示,节点A和C投票给了B,所以节点B是leader节点。节点B会固定间隔时间向两个Follower节点A和C发送心跳消息,这个固定间隔时间被称为heartbeat timeout。Follower节点收到每一条日志信息都需要向Leader节点响应这条日志复制的结果:


    image.png

5、Log Replication 日志复制

这个概念其实就是怎么让客户端过来的数据同步到所有Follower节点

1、假设接下来客户端发起一个SET 5的请求,这个请求会首先由leader即节点a接收到,并且节点a写入一条日志。由于这条日志还没被其他任何节点接收,所以它的状态是 uncommitted
Leader会在下一个心跳中将数据同步给跟随者

image.png

2、一旦有大多数节点成功写入这条日志,那么Leader节点的这条日志状态就会更新为committed状态,并且值更新为5。
注意的是:此时Follower节点还是uncommit状态。

image.png

3、在接收到Follower的响应后,Leader会通知所有节点提交记录。


image.png

4、最后Leader会响应客户端


image.png

这种模式就是2PC,这部分衍生出来还有3PC,TCC,SAGA等一致性协议,尤其在分布式事务处理中更为常用。


6、网络分区

1、在发生网络分区的时候,Raft一样能保持一致性。如下图所示,假设我们的集群由5个节点组成,且节点B是Leader节点:

image.png

2、我们假设发生了网络分区:节点A和B在一个网络分区,节点C、D和E在另一个网络分区,C,D,E分区就会重新选举

image.png

3、如下图所示,且节点B和节点C分别是两个网络分区中的Leader节点:


image.png

4、此时两个客户端分别对两个分区进行操作,其中一个客户端将把节点B的值设置为"3",但节点B不能同步大多数,所以他的日志记录仍为未提交


image.png

5、另一个客户端将修改 节点C 的值为"8",因为可以同步大多数,所以这个操作能够成功


image.png

6、之后再回复分区,节点B将会发现存在"更高领导人",所以将会选择"下台",此时,节点A和节点B将会回滚它们未提交的记录,并同步新领导人的日志


image.png

参考文献

1、这个动图非常生动形象:http://raft.taillog.cn/
2、raft论文:https://ramcloud.stanford.edu/wiki/download/attachments/11370504/raft.pdf

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容