![](https://img-blog.csdnimg.cn/20190131153339215.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
ETCD源码学习
用于学习etcd的源码
思维的深度
这个作者很懒,什么都没留下…
展开
-
etcd中的环形队列inflights
inflights结构体在progress.go文件中,主要用于记录当前节点已发出未收到的响应的MsgApp消息,具体实现如下type inflights struct { // the starting index in the buffer start int //记录第一条MsgApp消息的下标 // number of inflights in the buffer co...原创 2019-01-31 16:54:33 · 819 阅读 · 0 评论 -
etcd中raft协议的消息(一) —— 简述raft中的所有类型消息
etcd中的Raft算法简介 Raft 是一种为了管理复制日志的一致性算法。一致性算法是从复制状态机的背景下提出的(参考英文原文引用37)。在这种方法中,一组服务器上的状态机产生相同状态的副本,并且在一些机器宕掉的情况下也可以继续运行。复制状态机在分布式系统中被用于解决很多容错的问题。例如,大规模的系统中通常都有一个集群领导者,像 GFS、HDFS 和 RAMCloud,典型应用就是一个独...原创 2019-01-31 09:55:02 · 1461 阅读 · 0 评论 -
etcd中raft协议的消息(二) —— 选举相关的消息(MsgHup、MsgPreVote/MsgPreVoteResp、MsgVote/MsgVoteResp)
一、MsgHup消息 在raft协议中我们看到,Leader节点推动心跳计时器,而Follower节点会推动选举计时器。源码主要在etcd的github.com/etcd-io/etcd/tree/master/raft/node.go和raft.go中,raft结构体中有一个electionElapsed字段,该字段是选举计时器的指针,逻辑时钟每推进一次,该字段的值递增1,逻辑时钟是有上...原创 2019-01-31 10:39:47 · 1883 阅读 · 0 评论 -
etcd中raft协议的消息(三) ——MspApp和MsgAppResp消息
MsgApp消息 上小结我们看到节点发起选举的相关消息,当候选人通过选举成为新的Leader后,首先会调用becomeLeader方法初始化相关状态,然后会调用bcastAppend方法,该方法主要向集群中其他节点广播MsgApp消息。消息的简略流程如下: becomeLeader方法的主要功能:作用:节点赢得选举变成Leader节点1.检测当前节点如果是Foll...原创 2019-01-31 11:24:00 · 1408 阅读 · 0 评论 -
etcd中raft协议的消息(四) —— 心跳相关的消息(MsgBeat、MsgHeartbeat、MsgHeartbeatResp和MsgCheckQuorum)
MsgBeat和MsgHeartbeat消息 Leader推动心跳计时器(heartbeatElapsed),而Follower推动选举计时器(electionElapsed),选举计时器的流程前面已经提到,这里主要介绍心跳计时器。当上层模块调用Tick()时,Leader会推动心跳计时器,在tickHeartbeat函数中有详细介绍。有两种情况会是Leader向集群中其他的节点发送...原创 2019-01-31 11:46:17 · 1707 阅读 · 0 评论 -
etcd中raft协议的消息(五)—— 客户端只读相关的消息(MsgReadIndex和MsgReadIndexResp消息)
readOnly模式 在看MsgReadIndex类型的消息之前需要先对readOnly的模式有所了解,raft结构体中的readOnly作用是批量处理只读请求,只读请求有两种模式,分别是ReadOnlySafe和ReadOnlyLeaseBased,ReadOnlySafe是ETCD作者推荐的模式,因为这种模式不受节点之间时钟差异和网络分区的影响,我们主要看一下ReadOnlyS...原创 2019-01-31 13:46:26 · 1218 阅读 · 0 评论 -
etcd中raft协议的消息(六)——客户端的写请求相关的消息(MsgProp消息)
在etcd-raft模块中,客户端发往集群中的写请求是通过MsgProp消息表示的。Raft集群中只有Leader节点能够响应客户端的写入请求。 客户端请求的写操作,会通过调用Node接口的Propose函数请求到raft模块中,当Follower接收到MsgProp类型的消息会转发到Leader节点,所以MsgProp消息的主要处理是在raft.stepLead...原创 2019-01-31 13:52:42 · 1066 阅读 · 0 评论 -
etcd中raft协议的消息(七)——快照复制消息(MsgSnap消息)
MsgSnap消息 通过前面介绍的raft.sendAppend()方法可知,在Leader节点尝试向集群中的Follower节点发送MsgApp消息时,如果查找不到待发送的Entry记录(即该Follower节点对应的Progress.Next指定的Entry记录),则会尝试通过MsgSnap消息将快照数据发送到Follower节点,Follower节点之后会通过快照数据回复其自...原创 2019-01-31 13:59:41 · 1042 阅读 · 0 评论 -
etcd网络通讯层(一)——rafthttp中重要的接口
前面我们提到etcd-raft模块,etcd-raft模块并未提供网络层的相关实现,而是将待发送的消息封装进Ready实例返回给上层模块,然后由上层模块决定如何将这些消息发送到集群中的其他节点。etcd将网络层的相关实现单独封装成一个模块,也就是etcd-rafthttp模块。从而降低了etcd-raft和etcd-rafthttp之间的耦合,提高程序的可扩展性。 et...原创 2019-04-29 19:56:01 · 1489 阅读 · 0 评论 -
etcd网络层(二)——pipeline通道实现
一、pipeline结构体pipeline通道主要负责传递快照数据pipeline结构体及相关字段如下:type pipeline struct { peerID types.ID //该pipeline对应节点的ID tr *Transport //关联的rafthttp.Transport实例 picker ...原创 2019-05-07 17:57:03 · 676 阅读 · 0 评论 -
etcd网络层(三)——stream实现过程
stream消息通道主要是通过长连接的方式和对端进行数据交互,peer结构体中的stream相关数据如下(忽略V2版本):type peer struct { writer *streamWriter //负责向Stream消息通道中写消息 msgAppReader *streamReader //负责从Stream消息通道中读消息...原创 2019-05-07 18:03:53 · 1461 阅读 · 5 评论 -
etcd网络层(四)——Peer接口的实现
peer结构体是Peer接口的实现,peer是远程raft节点的代表,本地raft节点通过peer给远程raft节点发送消息每个peer有两个发送消息的基本机制:stream和pipelinestream是长连接,它始终可以传输消息。除了通常的stream,还有优化的stream用于leader发送msgApp消息,因为msgApp占了大部分的消息pipeline是一系列客户端发送请求...原创 2019-05-24 18:42:56 · 1154 阅读 · 1 评论 -
etcd网络层(五)——Transporter接口实现
一、Transport结构体type Transport struct { Logger *zap.Logger DialTimeout time.Duration // maximum duration before timing out dial of the request,dial的超时时间 // DialRetryFrequency defines the frequenc...原创 2019-05-24 18:49:06 · 1778 阅读 · 0 评论 -
etcd网络层(六)——模拟etcd网络层的stream通道维护长连接
代码如下:package mainimport ( "io" "log" "net" "fmt" "sync" "time" "strings" "strconv" "net/http" "encoding/json" "encoding/binary")func main() { peerURL1 := "http://127.0.0.1:8081" p...原创 2019-06-28 16:32:29 · 781 阅读 · 0 评论