苏州园区做网站公司,网站建设与制作好学吗,加入网络营销公司,施工企业向建设单位提供预付款担保产生的费用属于Etcd Raft架构设计和源码剖析2#xff1a;数据流 | Go语言充电站
前言
之前看到一幅描述etcd raft的流程图#xff0c;感觉非常直观#xff0c;但和自己看源码的又有些不同#xff0c;所以自己模仿着画了一下#xff0c;再介绍一下。
下图从左到右依次分为4个部分…Etcd Raft架构设计和源码剖析2数据流 | Go语言充电站
前言
之前看到一幅描述etcd raft的流程图感觉非常直观但和自己看源码的又有些不同所以自己模仿着画了一下再介绍一下。
下图从左到右依次分为4个部分
raftraft主体功能部分Noderaft提供的接口raft跟上层的通信接口会运行一个run函数持续循环处理通道上的数据raftNode上层应用逻辑其他Client、Network、State 图中的箭头为数据的流向这幅图包含了多个流程接下来会分成4个流程介绍
客户端请求发送消息给其他节点接收其他节点消息及处理应用达成一致的日志
客户端请求
客户端请求的流程在下图已经使用红色箭头标出流程如下
客户端将请求发送给应用层raftNoderaftNode使用Propose方法请求写入到propc通道raft.Step接收到通道数据会通过append等函数加入到raftLograftLog用来暂时存储和查询日志请求会先加入到unstable 发送消息
发送消息的数据流已经用红色箭头标出流程如下
raft发现有数据发送给其他节点数据可以是leader要发送给follower的日志、snapshot或者其他类型的消息比如follower给leader的响应消息利用NewReady创建结构体Ready并写入到readyc通道raftNode从通道读到Ready取出其中的消息交给Network发送给其他节点 接收消息
接收消息的数据流已经在下图用红色箭头标出流程如下
从Network收到消息可以是leader给follower的消息也可以是follower发给leader的响应消息Network的handler函数将数据回传给raftNoderaftNode调用Step函数将数据发给raft数据被写入recvc通道raft的Step从recvc收到消息并修改raftLog中的日志 应用日志
raft会将达成一致的log通知给raftNode让它应用到上层的数据库数据流已经在下图用红色箭头标出流程如下
raft发现有日志需要交给raftNode调用NewReady创建Ready从raftLog读取日志并存到Ready结构体Ready结构体写入到readyc通道raftNode读到Ready结构体发现Ready结构体中包含日志raftNode会把日志写入到storage和WAL把需要应用的日志提交给状态机或数据库去修改数据raftNode处理完Ready后调用Advance函数通过advancec发送一个信号给raft告知raft传出来的Ready已经处理完毕
可以发现有2个storage1个是raftLog.Storage一个是raftNode.storageStorage是一个接口可以用来读取storage中的数据但不写入storage的数据写入是由raftNode完成的但raftNode.storage就是raft.MemoryStorage所以不稳定的、稳定的都由raft存储持久化存储由WAL负责etcd中有现成实现的WAL操作可用用来存储历史Entry、快照。
Storage接口更多信息请看Storage接口介绍。