1. ETCD和RAFT整體架構(gòu)

2. RAFT算法

Raft強(qiáng)一致性算法的具體實(shí)現(xiàn)Leader選舉和數(shù)據(jù)備份
http://www.itdecent.cn/p/5aed73b288f7
論文譯文
https://www.infoq.cn/article/raft-paper/
2.1 選舉
一個(gè)新的集群?jiǎn)?dòng)時(shí),或者老的leader故障時(shí),會(huì)選舉出一個(gè)新的leader.
https://www.cnblogs.com/sunsky303/p/11451755.html
選舉機(jī)制動(dòng)畫
http://thesecretlivesofdata.com/raft/
2.2 日志復(fù)制

leader必須接受客戶端的日志條目并且將他們同步到集群的所有機(jī)器
Leader選出后接受客戶端請(qǐng)求,Leader把請(qǐng)求日志作為日志條目加入到日志中,然后向其他Follower節(jié)點(diǎn)復(fù)制日志,但超過(guò)半數(shù)的日志復(fù)制成功,則Leader將日志應(yīng)用到狀態(tài)機(jī),并向客戶端返回執(zhí)行結(jié)果,同時(shí)Follower也將結(jié)果提交。如果存在Follower沒(méi)有成功復(fù)制日志,Leader會(huì)無(wú)限重試。
1,Leader提交log到WAL,并廣播每個(gè)node
2,node收到后log到WAL,并返回
3,多數(shù)node返回后,修改狀態(tài)為commit并存到DB,返回用戶
4,通知其他node,commit這條log,并保存到db
2.3 安全性
保證任何節(jié)點(diǎn)只要在它的狀態(tài)機(jī)中生效了一條日志條目,就不會(huì)在相同的key上生效另一條日志條目
3. API Server

用于處理用戶發(fā)送的API請(qǐng)求以及其它etcd節(jié)點(diǎn)的同步與心跳信息請(qǐng)求.
4. WAL

Write Ahead Log(預(yù)寫式日志),是etcd的數(shù)據(jù)存儲(chǔ)方式。除了在內(nèi)存中存有所有數(shù)據(jù)的狀態(tài)以及節(jié)點(diǎn)的索引以外,etcd就通過(guò)WAL進(jìn)行持久化存儲(chǔ)。WAL中,所有的數(shù)據(jù)提交前都會(huì)事先記錄日志。Snapshot是為了防止數(shù)據(jù)過(guò)多而進(jìn)行的狀態(tài)快照;Entry表示存儲(chǔ)的具體日志內(nèi)容.
5. KV Store
kv數(shù)據(jù)的存儲(chǔ)引擎,v3支持不同的后端存儲(chǔ),當(dāng)前采用boltdb。通過(guò)boltdb支持事務(wù)操作.
6. Node狀態(tài)

6.1 leader
負(fù)責(zé)日志的同步管理,處理來(lái)自客戶端的請(qǐng)求,與Follower保持這heartBeat的聯(lián)系
6.2?follower
剛啟動(dòng)時(shí)所有節(jié)點(diǎn)為Follower狀態(tài),響應(yīng)Leader的日志同步請(qǐng)求,響應(yīng)Candidate的請(qǐng)求,把請(qǐng)求到Follower的事務(wù)轉(zhuǎn)發(fā)給Leader
6.3?candidate
負(fù)責(zé)選舉投票,Raft剛啟動(dòng)時(shí)由一個(gè)節(jié)點(diǎn)從Follower轉(zhuǎn)為Candidate發(fā)起選舉,選舉出Leader后從Candidate轉(zhuǎn)為L(zhǎng)eader狀態(tài)。

6.3.1 靜態(tài)配置
這種方式比較適用于離線環(huán)境,在啟動(dòng)整個(gè)集群之前,你就已經(jīng)預(yù)先清楚所要配置的集群大小,以及集群上各節(jié)點(diǎn)的地址和端口信息。那么啟動(dòng)時(shí),你就可以通過(guò)配置ETCD_INITIAL_CLUSTER參數(shù)進(jìn)行etcd集群的啟動(dòng)
ETCD_INITIAL_CLUSTER="infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380"
ETCD_INITIAL_CLUSTER_STATE=new
6.3.2 動(dòng)態(tài)自發(fā)現(xiàn)配置
通過(guò)自發(fā)現(xiàn)的方式啟動(dòng)etcd集群需要事先準(zhǔn)備一個(gè)etcd集群。
如果你本地沒(méi)有可用的etcd集群,etcd官網(wǎng)提供了一個(gè)可以公網(wǎng)訪問(wèn)的etcd存儲(chǔ)地址。
6.3.3 DNS發(fā)現(xiàn)
etcd還支持使用DNS SRV記錄進(jìn)行啟動(dòng)。所以你要在DNS服務(wù)器上進(jìn)行相應(yīng)的配置