Raft系列2 核心概念(角色&Rules)(原创)

可能是你能找到的最完整最详细的中文版的Raft算法说明博客

内容来源都是原生的论文,可以保证内容的可靠性,并且对论文里面的很多细节做了扩展说明

Role

candidate、follower、leader
role不同,数据结构就不同,遵循的rule也不同

All Server Rules:

  1. 如果RPC里面commitIndex>appliedIndex,则更新appliedIndex。
  • leader角色中,统计超过半数节点copy成功,那么commitIndex就可以增加,增加完之后,就可以apply 命令到状态机中,最后更新appliedIndex
  • Follower角色中,confirm了copy之后,下一个Leader的心跳中会通知更新最新的leaderCommitIndex,然后Follower就会做出对应的调整commitIndex和appliedIndex
  1. 无论任何情况下,当RPC返回的term比自己的大时,不管你是什么身份,都成为follower。
  • 你当前role是leader,你发AppendEntry RPC消息给follower,结果follower返回一个比你大的term,说明你网络不好,已经有新leader了,所以你要转变角色为follower。而新的leader可能是这个follower,也可能是你不知道的其他节点

  • 你当前role是candidate,你发RequestVote RPC消息给follower,结果follower返回一个比你大的term,说明你这轮选举失败了,已经有比你更新的leader了,所以你要转变角色为follower

Followers Rules:

  1. Respond to RPCs from candidates and leaders(收到来自leader或者candidate的RPC消息,要响应)
  2. If election timeout elapses without receiving AppendEntries RPC from current leader or granting vote to candidate:convert to candidate(在一个心跳超时周期内,如果没收到任何消息,则身份成为candidate)

Candidates Rules:

On conversion to candidate, start election:成为candidate要做的事情
• Increment currentTerm
• Vote for self
• Reset election timer
• Send RequestVote RPCs to all other servers

注意第二条描述,candidate只有监听到newLeader的消息才会服从成为follower,加入老leader抽风了一下,被follower发觉,follower发起candidate后但是未成为new leader时,又收到了老leader的心跳,是不服从,直接拒绝的
• If votes received from majority of servers: become leader
• If AppendEntries RPC received from new leader: convert to follower
• If election timeout elapses: start new election

Leader Rules:

  1. 一旦成为leader,第一时间会发一个特殊的心跳给所有的节点,申明地位,阻止小弟们继续选举,并且会发送一个内容为空的log。

  2. leader要定时发送消息给小弟们,即使没有写操作,也要发一个空的心跳消息给小弟们

  3. leader收到客户端的写的操作是,第一时间是自己持久化这个消息,然后把消息RPC给所有follower,超过半数Node添加好了这个消息的时候,就把这个消息的状态标志为applied,并且反馈client操作成功,最后在下一个心跳消息中通知所有的follower 可以applied这个消息了

  4. leader发AppendRPC给follower,如果有的小弟因为日志的序号不对,说明小弟的消息和自己的不一致,有缺失,则更新leader的nextIndex[小弟Index]的值为递减值,重试消息,直到消息完全一致

  5. 一旦选举成功:发一个初始化空日志的AE RPC,并且持续保持心跳
    • If command received from client: append entry to local log,respond after entry applied to state machine (§5.3)
    • If last log index ≥ nextIndex for a follower: sendAppendEntries RPC with log entries starting at nextIndex
    • If successful: update nextIndex and matchIndex forfollower (§5.3)
    • If AppendEntries fails because of log inconsistency:decrement nextIndex and retry (§5.3)

• If there exists an N such that N > commitIndex, a majority of matchIndex[i] ≥ N, and log[N].term == currentTerm:set commitIndex = N (§5.3, §5.4)
这里解决的就是前leader遗留给新leader且未commit的命令
比如 S1有 MS1 MS2 MS3 MS4 MS5命令,commitIndex为3,还有MS4 MS5命令未commit,而且并不知道其它Node是否commit了,所以会发一个空命令的 MS6申明地位,这时候,N=6 >commitIndex=3,最终大家都commit了MS6,那么commitIndex=6

通用Rules

  1. 1个term里,最多只会有一个leader,如果老leader挂了,新leader在这个term选举又失败了,那么可能一个term里没有leader,但是绝对不会出现2个leader

  2. leader-append-only,确保了leader的权威,所有的节点的数据都要保持和leader一样,即使你的log比leader要多,也要服从leader。而且leader不仅不会覆盖自己的log,也不会删除自己的log,所以老leader遗留给新leader的所有的命令都会被commit,不会糟践

  3. 日志比对:如果log Index和log Term一样,那么所有的这样的log的内容是一样的

如果你觉得对你有帮助的话,就给我点赞吧!

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

推荐阅读更多精彩内容