raft 5.3 Log replication

Raft 笔记

5.3 Log replication

要保证:

  1. 如果不同日志中两个entry有同样的index和term, 那么储存的是同一个指令

    Leader 一次只创建一entry

  2. 如果两个不同日志中两个entry有同样的index和term, 那么两个entries之前的记录都是一样的

    通过Leader发送AppendEntries给各个follower来检查是否和Leader的log一致,如果不一致,Follower就拒绝(拒绝后操作:Leader处理不一致)

    理想情况,Leader和Follower的状态是一样的,但是可能遇到上一个Leader没有复制所有的entries到日志中,或者Leader崩溃,没来得及commit log

Leader处理不一致:

当Follower和Leader的日志不一致时,Leader强制抹除Follower的日志内容并将自己的日志内容复制给Follower(Leader's log == Fowllower's log).

  • 缺失entries,例如(a) (b)

  • 多余的uncommitted entries,例如(c) (d)

  • 两者都有,例如(e) (f)

Leader发送AppendEntries 给 Follower 来找到最新的已经committed了的entry,然后少了entries的添上,多了的entries删除.

对于每个Follower,Leader会维护一个 nextIndex :index of next log entry the leader will send to that follower

当Leader第一次启动(包括更换leader),所有的nextIndex设置为Leader log 的下一个index. 上面图中是 11

Screen Shot 2021-02-07 at 3.44.44 PM.png

如果Follower's log和leader不一致,那么下一个AppendEntry就会失败。Follower返回rejection,nextIndex--

上图b和leader的情况:

1.nextIndex是11,sendAppendEntries到b, 发现index 11没有指令,nextIndex减一并返回false,一直减到5然后发现index=4 term = 4匹配Leader的index=4,term=4, 返回true, matchIndex is 4,nextIndex是5。

2.Leader此时知道4是对的,将5的指令发送给b, b index = 5 填上4.

5.4 Safety

前面的一些机制并不能完全保证每个状态机执行的是相同的指令。比如,当Leader提交的时候,其中一个follower可能不能用了,就会commit失败,然后它被选成了新的Leader,这时候之前应该提交的entries可能被新的entries取代。结果就是,不同的状态机执行了不同的command sequence.

5.4.1 Election restriction

Raft在选取新的Leader的时候会检查candidate是不是拥有所有的committed entries,如果没有就阻止它成为Leader: 通过RequestVote RPC实现: RPC拥有candidate的log信息。

当Follower投票时, 它会拒绝投票如果它的log比candidate的更新(拥有的committed entries更多)

5.4.2 Committing entries from previous terms

不能简单的通过count大多数entries的方式提交之前term的entry。例如:在(c)中,index2 中的2是大多数,但是(c)不能因为这个就commit 2. 可能出现(d)和 (e)两种情况

(d)中,S5成为Leader后,由于自己的值3拥有比2更大的term,导致用值3将已经commit的2覆盖,所以之前2是不能commit的

下图描述了当一个old entry储存在大部分servers上 依然存在被未来新的Leader重写的可能。

Screen Shot 2021-01-31 at 6.43.58 PM.png

解决上述问题:

因此Raft限制只能通过判断大多数的方式提交当前term的entry,进而对之前的entry间接提交,如过程e所示

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