Raft 日志复制 Log replication

背景

Raft 是分布式一致性算法,保证的实际上是多台机器上数据的一致性,前面说的 leader 选举是为了保证日志复制的一致性。

简单来说,保证复制日志相同,才是分布式一致性算法的最终任务。

Leader 选举只是为了保证日志复制相同的辅助工作。实际上,在更为学术的 Paxos 里面,是没有 leader 的概念的(大部分 Paxos 的实现通常会加入 leader 机制提高性能)。

所以,保证复制日志相同,就是分布式一致性算法的终极任务

日志复制

在 Raft 中,leader 会接收客户端的所有需求(follower 会将写请求转发给 leader),leader 会将数据以日志的方式通过 RPC 的方式同步给所有 followers,只要超过半数以上的 follower 反馈成功,这条日志就成功提交了。如果 RPC 请求超时,leader 就不停的进行 RPC 重试。

下面再从几个方面说说日志复制:

  1. 复制过程
  2. 日志的组成
  3. 主从日志的一致性
  4. 日志特性
  5. 日志的不正常情况
复制过程
  1. 客户端的每一个请求都包含被复制状态机执行的指令。
  2. leader 把这个指令作为一条新的日志条目添加到日志中,然后并行发起 RPC 给其他的服务器,让他们复制这条信息。
  3. 假如这条日志被安全的复制,领导人就应用这条日志到自己的状态机中,并返回给客户端。
  4. 如果 follower 宕机或者运行缓慢或者丢包,领导人会不断的重试,知道所有的 follower 最终都存储了所有的日志条目。

大概的流程如下图:

图 1
日志的组成

日志的数据结构:

  1. 创建日志时的任期号(用来检查节点日志是否出现不一致的情况)
  2. 状态机需要执行的指令(真正的内容)
  3. 索引:整数索引表示日志条目在日志中位置

日志结构如下图:

图 2

上图显示,共有 8 条日志,提交了 7 条。提交的日志都将通过状态机持久化到磁盘中,防止宕机。

主从日志的一致性

然后谈谈主从日志的一致性问题,这个是分布式一致性算法要解决的根本问题。

Raft 为了保证主从日志的一致性,做了以下规则/限制(补丁)。

  1. Raft 保证所有已提交的日志条目都是持久化的并且最终会被所有可用的状态机执行
  2. 领导人把指令作为一条新的日志条目添加到日志中后,将并行的发送 RPC 给 follower,让他们复制这条信息。
  3. leader 将会跟踪最大的且即将被提交的日志条目的索引,并且这个索引会被包含在未来的所有附加日志 RPC 请求中,这样就能保证其他的服务器知道 leader 的索引提交位置。
  4. 一旦 follower 知道一条日志条目已经被提交,那么他也会将这条日志应用到自己的状态机中(按照日志的顺序)。
日志特性
  1. 如果在不同的日志中的两个日志条目的索引索引下标 相同,那么他们的指令就是相同的。(原因:leader 最多在一个任期里的一个日志索引位置创建一条日志条目,日志条目在日志的位置从来不会改变

  2. 如果在不同的日志里的 2 个日志条目拥有相同的任期号和索引,那么他们之前的日志项都是相同的。(原因:每次 RPC 发送附加日志时,leader 会把这条日志条目的前面的日志的下标和任期号一起发送给 follower,如果 follower 发现和自己的日志不匹配,那么就拒绝接受这条日志,这个称之为一致性检查)。
    2.1 这里需要提一下 Raft 的日志匹配规则:如果 2 个日志的相同的索引位置的日志条目的任期号相同,那么 Raft 就认为这个日志从头到这个索引之间全部相同 ,这个非常重要。

日志的不正常情况

上面说的都是日志在正常情况下的表现,没有考虑到一些异常情况,例如 leader 崩溃。

即,正常情况下, leader 和 follower 的日志保持一致性,所以附加日志 RPC 的一致性检查从来不会失败(查询上次已提交的日志条目的任期和下标)

然而,让我们考虑一下 leader 的崩溃:假设老的 leader 还没有完全复制完所有的日志条目,就崩溃了,这将导致 follower 的日志有可能比 leader 的日志多,也可能少,也可能多多少少。。。。

下图将展示 leader 和 follower 的日志的冲突情况:

图 3

从上图可以看出,所有的 follower 都和 leader 的日志冲突了,leader 的最后一条日志的任期是 6, 下标是 10 ,而其他 follower 的日志都与 leader 不匹配。

如何处理?

Raft 给出了一个方案(补丁):通过强制 follower 直接复制 leader 的日志解决(意味着 follower 中的和 leader 冲突的日志将被覆盖)。

如何操作?

要使得 follower 的日志和 leader 进入一致状态,leader 必须找到 follower 最后一条和 leader 匹配的日志,然后把那条日志后面的日志全部删除。

依据这个限制,上图中的 a follower 不需要删除任何条目,b 也不需要删除,c follower 需要删除最后一个条目,d follower 需要删除最后 2 个任期为 7 的条目,e 需要删除最后 2 个任期为 4 的条目,f 则比较厉害,需要删除 下标为 3 之后的所有条目。

Raft 如何实现?

leader 为每一个 follower 维护一个下标,称之为 nextIndex,表示下一个需要发送给 follower 的日志条目的索引。

当一个新 leader 刚获得权力的时候,他将自己的最后一条日志的 index + 1,也就是上面提的 nextIndex 值,如果一个 follower 的日志和 leader 不一致,那么在下一次 RPC 附加日志请求中,一致性检查就会失败(不会插入数据)。

当这种情况发生,leader 就会把 nextIndex 递减进行重试,直到遇到匹配到正确的日志。

当匹配成功之后,follower 就会把冲突的日志全部删除,此时,follower 和 leader 的日志就达成一致。

日志复制 Summary

日志复制是分布式一致性算法的核心,所谓的一致性,就是集群多节点的数据一致性。

Raft 把每条日志都附加了 任期号和下标 来保证日志的唯一性。

依据这个限制,Raft 对日志有以下保证:如果 2 个日志的相同的索引位置的日志条目的任期号相同,那么 Raft 就认为这个日志从头到这个索引之间全部相同。

依据这个保证,当 leader 和 follower 日志冲突的时候,leader 将校验 follower 最后一条日志是否和 leader 匹配,如果不匹配,将递减查询,直到匹配,匹配后,删除冲突的日志。这样就实现了主从日志的一致性。

参考

英文 paper pdf 地址

Raft paper 中文翻译 —— 寻找一种易于理解的一致性算法(扩展版)

Raft 作者讲解视频

Raft 作者讲解视频对应的 PPT

一个简单的讲解 Raft 协议的动画

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

推荐阅读更多精彩内容

  • 可进入我的博客查看原文。 Raft 算法是可以用来替代 Paxos 算法的分布式一致性算法,而且 raft 算法比...
    Jeffbond阅读 13,328评论 4 91
  • 寻找一种易于理解的一致性算法(扩展版) 摘要 Raft 是一种为了管理复制日志的一致性算法。它提供了和 Paxos...
    yflau阅读 978评论 0 1
  • 寻找一种易于理解的一致性算法(扩展版) 摘要 Raft 是一种为了管理复制日志的一致性算法。它提供了和 Paxos...
    枝叶君阅读 2,644评论 0 15
  • 寻找一种易于理解的一致性算法(扩展版) 摘要 Raft 是一种为了管理复制日志的一致性算法。它提供了和 Paxos...
    糖果果老师阅读 1,269评论 0 4
  • 家人们,下午好! 今天看到一篇文章,觉得很有意思,分享其中一段: 最坑孩子的四大教育谎言,99%的家长都信了!你呢...
    赵诚彬阅读 233评论 0 0