raft读写流程和线性一致性

raft写数据流程

在 Raft 协议中,写日志流程涉及多个步骤,以确保日志条目的安全复制和一致性提交。commit indexapply index 是这一流程中的关键部分,它们分别用于管理日志条目的提交和应用状态。以下是 Raft 写日志流程中与 commit indexapply index 相关的详细步骤:

1. 客户端请求

  • 发起写请求:客户端向 Leader 节点发送写请求,通常包含需要写入的操作或数据。

2. Leader 追加日志

  • 日志追加:Leader 接收到写请求后,将其作为新的日志条目追加到本地日志中。每个日志条目都有一个唯一的索引和当前任期号(Term)。

3. 复制日志条目

  • 发送 AppendEntries RPC:Leader 将新的日志条目通过 AppendEntries RPC 发送给所有的 Follower 节点。此 RPC 包括:
    • 新的日志条目。
    • 前一个日志条目的索引和任期号,用于一致性检查。
    • 当前的任期号。
    • 当前的 commit index

4. Follower 处理日志

  • 一致性检查:Follower 在接收到 AppendEntries RPC 后,首先检查前一个日志条目是否与 Leader 发来的信息匹配。如果不匹配,Follower 将拒绝该请求。
  • 日志追加:如果一致性检查通过,Follower 将新的日志条目追加到自身的日志中,并返回确认(ACK)给 Leader。

5. 日志提交

  • 更新 commit index
    • Leader 收到大多数(超过半数)Follower 的确认后,将该日志条目标记为已提交。
    • Leader 更新自己的 commit index,使其等于最新提交的日志条目的索引。

6. 应用日志条目

  • 更新 apply index
    • Leader 和 Follower 节点会定期检查 commit indexapply index
    • 节点将 apply index 更新到与 commit index 相同的值,逐一应用这些日志条目到状态机。
  • 状态机应用
    • apply index 更新的过程中,已提交的日志条目被应用到本地状态机中,更新系统状态。

7. 响应客户端

  • 返回结果:一旦日志条目被应用,Leader 将操作结果返回给客户端,表示写请求已成功完成。

关键特性

  • 线性一致性:通过确保写请求在大多数节点上提交和应用,commit indexapply index 提供了线性一致性。
  • 故障恢复:在 Leader 故障时,通过 commit index 可以确保新的 Leader 能够正确识别已提交的日志条目,而 apply index 确保这些日志条目被应用到状态机中。

总结

在 Raft 写日志流程中,commit indexapply index 起着至关重要的作用。commit index 确保日志条目在大多数节点上被复制和确认,从而标记为已提交,而 apply index 确保这些已提交的日志条目被应用到状态机中。通过这两个索引,Raft 能够提供强一致性和高可用性,确保分布式系统中数据的一致性和可靠性。

raft读数据流程

在 Raft 协议中,读取数据的流程设计旨在确保线性一致性,即所有的读取操作都能看到最新的已提交数据。通常,读取操作由 Leader 节点处理,因为 Leader 能够确保其持有的状态是最新的。以下是 Raft 协议中读取数据的详细流程:

1. 客户端请求读取

  • 发起读取请求:客户端向集群中的 Leader 节点发送读取请求,要求获取某个数据的当前状态。

2. Leader 处理读取请求

  • 确认 Leader 身份:Leader 首先确认自己是当前的合法 Leader。通过心跳机制(AppendEntries RPC),Leader 确保自己在任期内没有被替换。
  • 读取最新状态
    • Leader 从本地状态机中读取数据。状态机持有的是已提交的日志条目应用后的数据,因此能保证读取到的是最新的状态。

3. 线性一致性保证

  • 最新状态确认:为了确保读取操作的线性一致性,Leader 必须确认其持有的状态机状态已经达到最新的 commit index
  • 可选的 Read Index 机制:在某些实现中,Leader 可以使用 Read Index 机制来进一步确保读取的一致性。Read Index 是通过心跳确认的,用于确保读取操作在最新的提交状态下进行。

4. 返回结果给客户端

  • 响应生成:Leader 将从状态机中读取到的数据封装为响应,返回给客户端。
  • 一致性保证:由于读取操作是在 Leader 上进行的,并且 Leader 确保读取的是最新的已提交数据,因此客户端可以信赖返回的数据是线性一致的。

5. 处理故障和异常

  • Leader 变更处理:如果在读取过程中 Leader 发生变更,客户端可能会收到重定向信息,指向新的 Leader。
  • Follower 读取优化(可选):在某些优化实现中,允许 Follower 处理读取请求,但需要确保一致性。通常需要使用 Lease Read 或 Read Index 机制来保证读取的一致性。

总结

在 Raft 协议中,读取数据的流程主要依赖于 Leader 来处理,以确保线性一致性。Leader 通过从状态机中读取已提交的状态来响应客户端请求。通过心跳机制和可选的 Read Index,Raft 确保读取操作始终在最新的提交状态下进行,提供一致的读取视图。在某些优化场景下,可以允许 Follower 处理读取请求,但需要额外的机制来保证一致性。

raft如何保证线性一致性

在标准的 Raft 协议中,读取操作不会产生日志条目。日志条目主要用于记录写操作(如状态变更、数据更新)以确保这些操作在整个集群中保持一致性和持久性。读取操作不改变系统状态,因此不需要记录在日志中。

Raft 协议中的 Read Index 机制是一种优化读取性能的方法,旨在确保读取操作的线性一致性,而无需在每次读取时都将请求转发给 Leader 进行日志条目提交。Read Index 提供了一种轻量级的方式来验证读取操作的正确性和一致性。以下是 Read Index 机制的工作原理和操作流程:

Read Index 机制的基本原理

  1. 线性一致性要求:Raft 协议要求读取操作能够看到最新的已提交状态,以确保线性一致性。
  2. 轻量级一致性检查:Read Index 通过心跳机制确认 Leader 的合法性和当前的 commit index,从而提供一种无需写入日志条目的读取一致性保证。

Read Index 操作流程

  1. 客户端请求读取

    • 客户端向 Leader 节点发送读取请求,要求获取某个数据的当前状态。
  2. Leader 确认状态

    • Leader 收到读取请求后,通过心跳消息(AppendEntries RPC)与大多数 Follower 确认其身份和当前的 commit index
    • 这些心跳消息不需要附加日志条目,仅用于维持 Leader 的合法性和确认集群的最新提交状态。
  3. 计算 Read Index

    • Leader 使用当前的 commit index 作为 Read Index,这个索引值代表了读取操作可以安全访问的最新已提交状态。
  4. 读取数据

    • Leader 从状态机中读取数据,确保读取的状态不早于 Read Index 指定的状态。
    • 通过这种方式,Leader 可以保证返回的数据是线性一致的。
  5. 返回结果给客户端

    • Leader 将从状态机中读取到的数据返回给客户端,确保读取操作的结果是最新的已提交状态。

优势和应用场景

  • 性能提升:Read Index 机制避免了在每次读取时都需要写入日志条目,减少了网络和磁盘 I/O,提高了系统的读取性能。
  • 一致性保障:通过确认 Leader 的合法性和 commit index,Read Index 提供了一种轻量级的方式来保证读取操作的一致性。
  • 适用场景:适用于高读取频率的场景,特别是在读取操作不需要强制写入日志的情况下。

限制和注意事项

  • 依赖 Leader:Read Index 机制依赖于 Leader 的存在和心跳消息的正常传递,Leader 故障时需要重新选举。
  • 网络延迟:心跳消息的延迟可能会影响 Read Index 的实时性,但通常影响较小。

总结

Read Index 是 Raft 协议中一种优化读取性能的机制,通过利用心跳消息确认 Leader 的合法性和集群的最新提交状态,提供了一种轻量级的读取一致性保障。它在提高系统读取性能的同时,仍然能够满足线性一致性的要求,适用于频繁读取的应用场景。

从raft写流程可以看到,更新commit index后,客户端请求就返回成功,真正的apply index会被放在后台执行。在leader收到读请求时,然后会通过check qurom确定自己此时是不是真的Leader,如果确认成功,Leader 使用当前的 commit index 作为 Read Index,然后等到apply Index到达read index,即状态机成功apply完那个时刻所有已commit的数据,就可以从状态机读取到最新数据了。

另外读请求是可以在Follower上执行的,与read index的实现原理同理,只要知道请求到达的那个时刻最新的commit Index,Follower就可以等自己的applyIndex == followerReadIndex时,读取状态机的状态并返回给客户了。至于commitIndex的获取,最简单的方式就是直接向Leader咨询,当然Leader为了保证自己的commitIndex是最新的,同样需要一轮check qurom的RPC开销,但与前面不同的是,这里Leader不再负担读操作的开销,而是仅需要负担通信和同步的开销,这是一种非常有效的优化(考虑一个客户请求是SELECT *的场景,这条Log的Apply会产生大量的IO,将这个负担放在Follower对Leader是一种多大的解放)。

上述情景下,每个读请求都需要一轮check qurom,当然我们可以通过对读请求进行[batching],以延迟换取相对少的RPC轮数,但其实可以依赖Lease Read来更加优雅的解决这个问题。Lease Read可以依赖时间来满足线性一致读,具体来说,它依赖了Raft选举算法的某些特性:如果一个Follower在election timeout内收到了Leader的心跳信息,那么Follower会拒绝投票(即使拉票者的term更高),或者将投票操作阻塞到超过election timeout之后再进行。这样如果一个Leader成功的做了check qurom,那么在一个election timeout内可以认为集群不会出现更新的Leader,这段election timeout时期被称为Lease期。由于Lease期内不会出现新的Leader且已经check qurom,因此此时的Leader应该是最新的Leader,它持有最高的commitIndex。据此,Lease期的Leader对于来自客户的读请求,可以直接使用commitIndex作为readIndex,对于来自follower的获取commitIndex的请求,可以直接将commitIndex返回给它。

在 Raft 协议中,Lease Read 是一种优化读取性能的机制,它通过短期租约(Lease)来允许从 Leader 或 Follower 节点读取数据,同时确保读取操作的线性一致性。Lease Read 机制主要用于减少读取操作的延迟,并减轻 Leader 的负担。以下是 Lease Read 机制的详细原理和操作流程:

Lease Read 机制的基本原理

  1. Leader Lease

    • 租约概念:Leader 持有一个租约(Lease),在租约有效期内,Leader 保证其身份的唯一性和合法性。
    • 租约期限:租约的期限通常通过心跳消息(AppendEntries RPC)来维持,Leader 定期向 Follower 发送心跳以续约。
    • 读取权限:在租约有效期内,Follower 可以安全地从自己的状态机中读取数据,因为它们知道 Leader 的状态没有变更。
  2. 一致性保证

    • Leader 的合法性:在租约有效期内,Leader 保证不会被新的 Leader 替换,因此 Follower 可以信任 Leader 的状态是最新的。
    • 数据一致性:Follower 可以在租约期间直接处理读取请求,而无需每次都与 Leader 确认最新状态。

Lease Read 操作流程

  1. 客户端请求读取

    • 客户端向 Leader 或 Follower 节点发送读取请求,要求获取某个数据的当前状态。
  2. 租约确认

    • Leader 维护租约:Leader 定期向 Follower 发送心跳消息,维持租约的有效性。
    • Follower 确认租约:Follower 在接收到心跳消息后更新租约期限,确认当前的 Leader 仍然有效。
  3. 读取数据

    • Leader 读取:Leader 直接从状态机中读取数据,确保读取到的是最新的已提交状态。
    • Follower 读取:在租约有效期内,Follower 可以直接从自己的状态机中读取数据,而不需要与 Leader 进行额外的通信。
  4. 返回结果给客户端

    • 节点将从状态机中读取到的数据返回给客户端,确保读取操作的结果是最新的已提交状态。

优势和应用场景

  • 降低延迟:Lease Read 机制允许 Follower 在租约期间处理读取请求,显著降低了读取操作的延迟。
  • 减轻 Leader 负担:通过分散读取请求,Lease Read 减轻了 Leader 的负担,提高了系统的整体性能。
  • 适用场景:适用于高读取频率的场景,特别是在读取操作不需要强制写入日志的情况下。

限制和注意事项

  • 时间同步:Lease Read 依赖于节点之间的时间同步。如果时间不同步,可能会导致一致性问题。
  • 租约过期风险:在租约过期或 Leader 发生故障时,可能会导致短暂的不可用。
  • 复杂性:实现和维护租约机制增加了系统的复杂性。

总结

Lease Read 是 Raft 协议中一种优化读取性能的机制,通过短期租约允许 Follower 处理读取请求,提供了一种在保持线性一致性的同时提高读取性能的方法。通过合理的租约管理和时间同步,Lease Read 能够在分布式系统中实现高效的强一致性读取。

参考链接:https://www.zhihu.com/question/468357665/answer/1966740883

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

推荐阅读更多精彩内容