etcd源码分析
2016-05-26 15:18:08 0 举报
AI智能生成
etcd是一个高度一致的分布式键值存储系统,主要用于共享配置和服务发现。它使用Go语言编写,具有强大的读写性能和可扩展性。etcd源码分析主要包括以下几个方面:数据结构、Raft协议、存储引擎、客户端API等。数据结构是etcd的核心,包括键值对、事务日志、快照等;Raft协议是etcd实现分布式一致性的关键,通过选举、日志复制等机制保证数据的可靠性;存储引擎负责数据的持久化和读取,支持内存存储和磁盘存储;客户端API提供了丰富的功能,如增删改查、监控、安全认证等。通过对etcd源码的分析,可以深入了解其设计原理和实现细节,为实际应用提供参考。
作者其他创作
大纲/内容
代码
raft.go
Fun-newRaft
becomeFollwer
step=stepFollower方法赋值
tick=tickElection方法赋值
若超时到期,则调用Step开始新一轮竞争,发送MsgHup信息
在超时还没到的这个周期内不能发起选举
状态已经是StateLeader,直接返回
状态不是StateLeader,执行campaign
becomeCandidate
step=stepCandidate
tick=tickElection
state=StateCandidate
poll(r.id, true)
先给自己投一票
当总的票数达到机器数一半加1
成为leader,becomeLeader
step=stepLeader
tick=tickHeartBeat
state=StateLeader
复制已提交的Entry
appendEntry
send(Message(MsgVote))
给其他机器发送投票请求
main.go
etcdmain.Main()(文件:etcdmain/etcd.go)
CheckSupportArch()
检查系统架构是否匹配
NewConfig()
创建配置文件
使用标准命令行解析库flag
将初始默认变量进行绑定
config配置类
corsInfo
CPU信息
dir
数据存储目录
lpurls,lcurls (listen for peers urls, listern for client requests urls)
总共会监听两个端口,一个用于和raft集群服务器通信,一个用于和客户端通信
TickMs
心跳,默认100ms
ElectionMs
选举时间,默认1000ms
Parse()进行命令行参数解析
setupLongging()// 设置日志的输出级别,
默认是INFO,可设置为DEBUG
initialClusterFromName()
设置集群名称
cfg.dir
设置data目录
identifyDataOrDie()
测试目录可用情况
startEtcd()
启动Etcd服务
监听peers
监听clients
etcdserver.NewServer(srvcfg)
用配置文件创建etcdserver
etcdserver/server.go
switch case
!haveWAL && !cfg.NewCluster
etcdserver/raft.go : startNode()
启动状态机
raft/storage.go : NewMemoryStorage()
初始化内存
raft/node.go : StartNode()
raft/raft.go : newRaft()
term=0
becomeFollwer()
term=1
e=pb.Entry()
raftLog.append(e)
将peer的状态作为一个条目添加到log中
r.addNode(peer.ID)
n=newNode()
定义一组通道
node : go n.run(r)
监听外部事件请求
propc=n.propc(proposal channel)
... ...
<-propc
<-n.recvc
<-n.confc
配置文件改变
<-n.tickc
r.tick()
becomeFollower : r.tick = r.tickElection
stepFollower
MsgProp
MsgApp
MsgHeartbeat
MsgSnap
MsgVote
becomeCandidate : r.tick = r.tickElection
stepCandidate
becomeLeader : r.tick = r.tickHeartbeat
stepLeader
MsgBeat
MsgCheckQuorum
MsgProp
MsgVote
MsgAppResp
Follower中MsgApp处理完成
返回MsgApp Response
MsgHeartbeatResp
MsgSnapStatus
MsgUnreachable
readyc=n.readyc
... ...
readyc<-rd(准备提交到状态机)
(advance=n.advancec)
<-advancec
<-n.status
<-n.stop
advanceTicksForElection()
提前选举,但使用的不是时钟周期
而是直接循环10次
n.Tick()
n.tickc <- struct{}{}
向通道写事件
!haveWAL && cfg.NewCluster
haveWAL
r.ticker=time.Tick()
时钟会自动触发
cfg.V3demo
NewLessor()
newLessor()
go l.runLoop()
select
<-le.stopC
le.expiredC<-ls
select
<-time.After()
<-le.stopC
s.Start()启动服务
etcdserver/server.go
s.start()
EtcdServer : go s.run()
raftNode : s.r.start(s)
启动raftnode
go func()
运行匿名函数
监听外部事件请求
r.ticker=time.Tick()
<-r.ticker
r.Tick()
n.tickc<-struct{}{}
<-n.done
<-node(Node) : r.Ready()
r.Advance(){n.advancec <- struct{}{}}
raftNode : r.applyc<-ap
向通道写
r.raftStorage.Append()
应用到状态机
<-syncC
<-r.stopped
for select
监听外部时间
raftNode : <-s.r.apply()
应用到EtcdServer中
s.applyAll()
s.applySnapshot()
s.applyEntried()
s.apply()
raftpb.EntryNormal
raftpb.EntryConfChange
s.applyConfChange()
s.r.ApplyConfChange()
node结构体实现该方法
select
n.confc<-cc
<-n.done
select
<-n.confstatec
<-n.done
<-apply.raftDone
s.triggerSnapshot()
进行SnapShot
snapshot()
阻塞的snapshot
expiredLeaseC=s.lessor.ExpiredLeasesc(){return le.expiredC}
... ...
<-expiredLeaseC
<-s.errorc
<-s.stop
go s.publish()
將配置文件中其他的 member 注册到 cluster 中
go s.purgeFile()
go monitorFileDescriptor()
go s.monitorVersions()
go func(plns)
处理Peer TCP通信
ch回调函数
NewClientHandler()
Handle/HandleFunc
ServeHTTP()
Do()
POST/PUT/DELETE/QGET
Propose()
step(pb.Message{Type:pb.MsgProp})
n.propc<-pb.Message
GET
HEAD
go func(clns)
处理客户端TCP通信
ph回调函数
NewPeerHandler()
原理
术语
Raft:etcd所采用的保证分布式系统强一致性的算法。
Node:一个Raft状态机实例。
Member: 一个etcd实例。它管理着一个Node,并且可以为客户端请求提供服务。
Cluster:由多个Member构成可以协同工作的etcd集群。
Peer:对同一个etcd集群中另外一个Member的称呼。
Client: 向etcd集群发送HTTP请求的客户端。
WAL:预写式日志,etcd用于持久化存储的日志格式。
snapshot:etcd防止WAL文件过多而设置的快照,存储etcd数据状态。
Proxy:etcd的一种模式,为etcd集群提供反向代理服务。
Leader:Raft算法中通过竞选而产生的处理所有数据提交的节点。
Follower:竞选失败的节点作为Raft中的从属节点,为算法提供强一致性保证。
Candidate:当Follower超过一定时间接收不到Leader的心跳时转变为Candidate开始竞选。
Term:某个节点成为Leader到下一次竞选时间,称为一个Term。
Index:数据项编号。Raft中通过Term和Index来定位数据。
MessageType
节点间消息通信类型
MsgHup
hang up 挂起
MsgBeat
MsgProp
Proposal 消息发送
MsgApp
Append 追加信息
MsgAppResp
MsgVote
请求投票
MsgVoteResp
MsgSnap
Snapshot 快照
MsgHeartbeat
MsgHeartbeatResp
MsgUnreachable
MsgSnapStatus
MsgCheckQuorum
时钟
Tick : 100ms
heartbeat : 1ms
election : 1000ms
snapshot count = 10000
0 条评论
下一页