您好,我是Aoho。我今天与您分享的主题是:ETCD-RAFT模块如何实现分布式一致性?
在上一篇文章中,我们介绍了ETCD读取和写作操作的基本实现,但是关于如何实现分布式数据一致性,它没有详细介绍。失败,获得多个副本,提高服务的高可用性和系统吞吐量。ETCD群集中的多个节点不可避免地存在不一致的数据,但是它是同步复制,异步复制还是一半同步复制,将有问题或一致性或一致性或一致性或一致性或一致性或一致性解决多个节点数据一致性的解决方案实际上是共识算法。共有共识算法是Paxos和Raft。Zookeeper使用的ZAB协议,ETCD使用的共有算法是RAFT。
在本课程中,您将首先介绍如何使用RaftExample,然后介绍ETCD-RAFT模块的实现。ETCD-RAFT模块是一个求解ETCD中分布式一致性的模块。我们结合了ETCD中RAFT的实现与源代码相结合。
ETCD项目包含RAFT Library的示例。
Raftexample的输入方法的实现代码如下:
两个通道:proposec是在输入功能中创建的,以提交书面数据;Concchangec用于提交配置更改数据。
然后开始以下核心goroutine:
在这里,RAFT的使用具有一个基本概念,即通过节点结构实现的节点接口与RAFT库交互。数据更改涉及的核心数据结构是现成的结构。接下来,您可以进一步分析库以分析图书馆实现。
RAFT库为外界提供了一个节点接口,该节点接口由raft/node.go中的节点结构实现。这是唯一需要与此筏库直接处理的结构。节点界面需要实现的功能包括:tick,forese,提出,提出,提出,提出,提出,提出,提出,提出,提出,提出,提出,提出,提出,提出,提出,提出,提出,提出,提议,提出,,建议,提议,准备,步骤,等等。
我们需要理解准备就绪。这是一个核心功能,它将返回到对应于读者的相应通道。此通道代表当前时间点。应用层需要注意该通道。发生更改时,其中的数据还将执行相应的操作。与其他功能相对应的相应功能如下:
接下来是筏算法的实现。节点结构实现节点接口。定义如下:
这种结构通常以后使用。木筏/筏中有两个核心数据结构。
让我们看一下木筏statemachine的状态转换,这实际上是筏算法中各个字符的转换。EAFT筏节点可能具有以下三个状态之一:
每个状态都有其相应的状态机。每次收到提交的数据时,您都会根据其不同状态将消息输入不同状态的状态计算机。同时,执行tick操作时,与每个状态相对应的处理函数也不同。
因此,筏结构中的不同状态和不同的处理函数独立产生了几个成员变量:
ETCD-Raft statemachine封装在筏主体中,其状态转换如下:
筏状态转换的呼叫接口全部为木筏。go,定义如下:
RAFT驱动Raft Raft Raft statemachine状态机在各种状态?etcd摘要所有与RAFT相关的处理,并通过步骤接口进行处理:
其中,步骤是回调函数。不同的状态设置了不同的回调功能以驱动筏。此回调函数stepfunc是该函数已完成的设置。
步骤回调函数具有以下值。其中,Stepcandidate将处理两个状态:预示和候选人:
在这里,我们以Stepcandidate为例:
那就是处理各种味精,您将不会在此处详细介绍。LET查看筏消息的类型及其定义。
RAFT消息RAFT算法本质上是一台大型机器,例如选举,提交数据等,并最终打包到消息结构中,并输入RAFT算法库的状态计算机。
在Raft/RaftPB/Raft.proto文件中,定义了筏算法中传输消息的结构。任何熟悉Raft Papers的人都知道Raft算法实际上是由几个协议组成的,但是这里,均匀性在这里,均匀性在此中。消息结构。以下总结了结构的成员。
与消息结构相关的数据类型是MessageType,并且有19种类型的MessageType。当然,并非所有新闻类型都将使用上面定义的消息结构中的所有字段,因此其中一些字段是光学的。常用协议(即不同的消息类型)总结了以下表格:
MSGHUP不用于在节点之间进行交流。它仅用于将选举消息接收器节点发送到此节点。IDMSGBEAT不用于在节点之间进行通信。节点发送心跳消息接收器的节点IDMSGPRAFPRAFT库用户建议(提示)数据消息接收者的节点iDMSGAPP用于群集中数据数据的新闻接收器的消息,将集群中数据的数据发送到群集中的数据接收者。clusterIdMSGSNAP用于领导者数据的快照消息消息接收者,以同步数据。节点ID节点IDMSGSNAPSAPSAPSTAS用于向Raft库报告到RAFT库中,用于报告筏库以报告节点。节点IDMSGTRANSFERLEADER用于迁移发件人的派生ID,但是New New Leader节点ID ID消息接收机的节点的节点的节点IDMSGCHECKQUORUM消息接收器接收器的节点iDMSGTIMESGTIMENOWLEAWLEADER,当时旧领导者的日志数据是同步的,领导者将消息发送给新的领导者以迁移新的。接收器,以及消息发件人的node.id..der接收消息后,根据消息的类型搜索此表,以帮助我们了解RAFT算法的操作。
实施筏一致性算法的关键是领导者选举,日志复制和安全限制。领导者失败后,集群可以快速选择新的领导者。日志复制,群集只能写入日志中,领导者负责将日志复制到跟随器节点,并强迫追随者节点保持与本身相同;安全
筏算法的第一步是首先选择领导者。领导者失败后,您需要快速选择新的领导者,因此让我们注意选举过程。
只有当节点启动选举节点才能在候选或追随者状态的节点中启动选举过程,而这两个状态的相应tick函数是筏。过程如下所示:
当项号的项数字大于当前节点时,接收选举消息的节点,如果该消息是选举类别的消息,该消息的类型将做出以下判断(类型是prevote或投票):
如果不是为了要求选举和租赁期内的强制性要求,请忽略选举消息并返回流程。这是为了避免那些离开集群并经常启动新的选举请求的节点的出现。
只有当同时满足上述两个条件时,我们才能同意节点的选举,否则将被拒绝。这样做的原因是:确保最后一个节点可以作为新领导者赢得登录是最新的。
让我们回顾上一类中提到的ETCD读取请求的处理过程。以下图标说明了日志复制过程。
然后查看领导者如何将日志数据复制到追随者节点。
提交此命令后,可以将命令提交到应用程序层。
本文主要向ETCD-RAFT模块介绍分布式一致性的原理,并通过RaftExample了解RAFT模块的使用。然后介绍选举过程和日志复制的过程。日志选举和日志复制。例如,在筏算法中,并非所有节点都可以成为领导者。要成为领导者,节点需要获得群集中的一半以上的节点,并且节点将投票给节点。足够的条件是:本选举节点的日志比该节点的日志更新。还有其他判断日志和提交上学期的日志条目的措施。
最后,留下一个问题,没有任何节点成为领导者,将选出什么情况。将来会发生什么?欢迎您在消息区域提议。
ETCD通信接口:客户端API实践和核心方法
分析租赁租赁,结合和取消租赁的ETCD申请
原始:https://juejin.cn/post/71000077777733072523295