深入浅出 Raft - Optimization

在猪爸爸的努力下,三个银行网点能正确的选出一个主网点对外提供服务了。一切工作的良好,但随着客户的增多,一些问题渐渐暴露出来。

这天,兔小姐又叫来了猪爸爸,说到:『猪爸爸,现在我们碰到了一个问题。每次客户在 Leader 网点进行一笔交易,我们都需要告诉其他两个地方,只有我们确定了交易记录被大多数网点保存了,这笔交易才会真正开始执行,处理完了,我们才能继续服务下一个客户。已经有很多客户投诉我们效率慢了。』

『是的,兔小姐,之前我们设计的机制只能保证整个系统在出现了异常的时候,能够安全的运行,不会出现金钱不一致的情况。现在,是时候考虑对整个系统进行优化了,而且我已经想到了很多优化的手段。』猪爸爸信心满满的说到。

『那真的是太好了』兔小姐高兴的说到,『你能跟我好好的说一下嘛?』
『当然可以!』

Pipeline 和 Batch

『首先,我们来整理下现在的流程,假设客户来存钱,我们会先记录交易,然后给其他几个网点发送消息,等我们确定大部分网点都确认了这笔交易记录,就可以开始执行这笔交易,将用户的钱存到金库里面了。』
『是的,猪爸爸』
『现在,为了后面简单说明,我将整个流程简化说明一下,其实就是几个步骤,也就是 Propose,Append,Broadcast 和 Apply。客户发起交易,我们叫做 Propose,然后我们记录交易,这个叫做 Append,再就是通知其他网点,这个叫做 Broadcast,等我们最后知道大部分网点都确认了这笔交易记录,我们就执行交易,也就是 Apply。希望我这么简化不会让你困惑,兔小姐。』猪爸爸有点担忧的询问到。
『虽然有点抽象了,但我想我还是能理解的,猪爸爸。麻烦你继续。』
『好的,兔小姐,既然你理解了简化流程,那么我下面开始说第一个优化,就是 Pipeline。』
『Pipeline?这是什么,你完全把我搞糊涂了,猪爸爸』兔小姐吃惊的说到。
『不要紧张,兔小姐。Pipeline 就是管道,你可以把我们的整个流程想成一个 Pipeline。对于客户 A,操作是 Propose,Append,Broadcast, Apply,对于客户 B 也是一样的流程,之前我们必须等 A 完成了,才能处理 B。但不知道你发现了没有,兔小姐,当 A 在 Append 之后,我们就可以开始处理 B 的 Propose 了。』
『为什么呢?猪爸爸,我有点不明白了』
『我们只要保证的是所有银行网点的交易记录是一致有序的,那么我们就一定能保证最终所有银行的数据是一致的,所以只要 A Append 了,B 开始 Propose,B Append 的时候交易记录一定在 A 的后面,这样记录就一定是有序的了。』
『我大概有点理解了。』兔小姐说到。
『所以,兔小姐,当 A 执行完 Append 之后,我们就能立刻开始处理 B,而当 B Append 之后,我们也可以立刻处理下一个用户 C,这样整个流程就是一个像水流那样源源不断流动的了,这不就是一个 Pipeline 了。』
『嗯,真的是很形象,猪爸爸。』兔小姐由衷的赞叹道。

Batch

『我们还可以继续优化了,兔小姐。上面我们说到了 Pipeline,我们还可以做 Batch。』猪爸爸继续说道。
『Batch?』兔小姐疑惑的说道。
『是的,Batch。也就是我们可以将很多单独的操作合并到一块处理。』
『哦,这个我明白。』兔小姐说道,『可哪里做 Batch 呢?』
『如果很多客户同时要发起交易,那么我们可以将这些交易记录,用一个消息发送过去到其他网点,这样我们就不需要一个一个的发送消息了,这就是 Batch。』
『哦,我明白了。因为我们各个网点之间距离还是有点远的,消息传递的时间开销还是有点大的。所以使用 Batch 可以减少消息的发送次数,自然就能提高效率了,是吧,猪爸爸。』
『非常正确,兔小姐。』

Leader 并发写盘

上面说到了 Pipeline 和 Batch,这里我们再次说明一下整个 Raft 的流程。Leader 收到 Propose,Append Log,然后 Broadcast Log,等收到 Follower 的回复确定 Log 被 Committed 之后,开始 Apply。而对应的 Follower,在收到 Log 之后,先 Append Log,然后给 Leader reply 消息,等下次 Leader 发过来的消息知道 Log 被 Committed 了,就可以 Apply 了,好了,我们继续说故事吧。

『猪爸爸,有了 Pipeline 和 Batch,我们银行的服务速度应该会很快了。』
『是的,兔小姐,不过我们还可以继续优化了。』
『真的?』兔小姐有点不可思议。
『是的,你还记得我之前提到过的 quorum 吧。对于一笔交易记录,如果我们知道大部分银行网点都确认了这笔记录,我们就可以继续处理交易了。』
『当然记得,猪爸爸。』
『当用户在 Leader 网点进行交易的时候,原来我们的流程是 Propose,Append,然后在 Broadcast,但现在,我们在 Propose 之后,就可以直接 Broadcast,同时 Append,这两个步骤在 Leader 网点是可以同时处理的。』
『同时处理?猪爸爸,这没什么风险吧?』
『不会有任何风险,即使 Broadcast 先进行,Leader 网点这边仍然需要在 Append 之后确保这笔记录被大多数网点确认了。』
『我想我有点明白了。也就是这两个流程其实不相关,反正无论怎样,后面 Leader 都必须等待 Follower 回复的确认消息,才能最终确定这笔交易是否已经被大多数网点接受了。』
『对的,兔小姐。但这里我们需要注意,这个优化只能在 Leader 网点进行,在 Follower 网点这边,我们仍然需要保证先 Append,再回复。』
『哦,这又是怎么回事,猪爸爸?』
『我们上面说了,Leader 网点必须知道大部分网点都收到了交易记录,才能认为是 Committed,然后继续处理。如果 Follower 网点这边也直接先回复消息,在 Append,就可能出现一种情况,在 Append 之前,Follower 网点出现了问题,导致 Append 不成功。那么极端情况下面就会出现,Leader 认为记录都已经被大部分节点接受了,但实际并没有,我们就很可能面临数据丢失的问题了。』
『好复杂,但我貌似懂了。』兔小姐思索了一会说到。

小结

Raft 的 Paper 其实比较简单,但如果实际按照 Paper 实现,会发现性能并不好,所以在实践中,我们会做很多优化,上面提到的只是一些优化手段,还有一些,譬如 Leader 在发送一次 Log 之后不需要等 Follower 的回复,继续发送后面的 Log,Follower 只需要回复最近的一次 Log Index 或者 reject 就可以。

这些优化方式在 etcd 和 TiKV 里面都有,大家可以自己去浏览代码。

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

推荐阅读更多精彩内容