1,將數據存儲在集羣中的高可用的K-V存儲golang
2,容許應用實時監聽存儲中的K-V變化網絡
3,可以容忍單點故障 可以應對網絡分區分佈式
原理:編碼
上圖5個節點的集羣命令行
2N+1 5個節點的集羣大多數是N+1 3個節點 只要有3個節點能被賦值,那麼這個日誌就能被提交,不會被丟失3d
1-7日誌是成功被提交的日誌,8是失敗的日誌
上圖由7個節點組成的raft節點 大多數爲zn+1=7 n+1=4大多數爲4blog
1,第一任村長爲f節點並且成功賦值給了其它節點,接着down機了,而後立刻重啓,由於leader重啓了,因此從新選舉事務
a-f看誰運氣好了,每一個節點都有3個編碼爲1的日誌,任一節點均可能成爲leader,get
2,從圖能夠看出f運氣比較好第二次又被選爲村長了
此時f獲得3編碼爲2的3條日誌可是立刻又掛掉了,接着又重啓收到編碼爲3的5條日誌又掛了
此時f節點雖然日誌多 可是成功提交的和其它節點是同樣的多 編碼爲1的 2 ,3 沒有成功提交
3,編碼爲4的日誌能夠看出e爲編碼爲4的節點,並且成功複製了2條日誌給其它節點,此時e又down機了
。。。。。。。。。。。。不一一分析了。。。。。有興趣的能夠繼續分析。。。。
總結:
leader在down機重啓後發現 已經有了新的leader 此時會拉取到新的數據發現 該數據是大多數節點承認的,就會覆蓋本地的
實戰任務:
*搭建單機etcd 熟悉命令行操做
*golang調用etcd的put/get/delete/lease/watch
*使用txn事務功能 實現分佈式樂觀鎖