ETCD簡介
etcd是CoreOS團隊于2013年6月發(fā)起的開源項目,它的目標是構建一個高可用的分布式鍵值(key-value)數(shù)據(jù)庫。etcd內部采用raft協(xié)議作為一致性算法,etcd基于Go語言實現(xiàn)。
ETCD的特點
簡單:安裝配置簡單,而且提供了HTTP API進行交互,使用也很簡單
安全:支持SSL證書驗證
快速:根據(jù)官方提供的benchmark數(shù)據(jù),單實例支持每秒2k+讀操作
可靠:采用raft算法,實現(xiàn)分布式系統(tǒng)數(shù)據(jù)的可用性和一致性
ETCD 概念
Raft:etcd所采用的保證分布式系統(tǒng)強一致性的算法。
Node:一個Raft狀態(tài)機實例。
Member: 一個etcd實例。它管理著一個Node,并且可以為客戶端請求提供服務。
Cluster:由多個Member構成可以協(xié)同工作的etcd集群。
Peer:對同一個etcd集群中另外一個Member的稱呼。
Client: 向etcd集群發(fā)送HTTP請求的客戶端。
WAL:預寫式日志,etcd用于持久化存儲的日志格式。
snapshot:etcd防止WAL文件過多而設置的快照,存儲etcd數(shù)據(jù)狀態(tài)。
Proxy:etcd的一種模式,為etcd集群提供反向代理服務。
Leader:Raft算法中通過競選而產(chǎn)生的處理所有數(shù)據(jù)提交的節(jié)點。
Follower:競選失敗的節(jié)點作為Raft中的從屬節(jié)點,為算法提供強一致性保證。
Candidate:當Follower超過一定時間接收不到Leader的心跳時轉變?yōu)镃andidate開始競選。
Term:某個節(jié)點成為Leader到下一次競選時間,稱為一個Term。
Index:數(shù)據(jù)項編號。Raft中通過Term和Index來定位數(shù)據(jù)。
ETCD 數(shù)據(jù)讀寫順序
為了保證數(shù)據(jù)的強一致性,etcd集群中所有的數(shù)據(jù)流向都是一個方向,從 Leader (主節(jié)點)流向 Follower,也就是所有 Follower 的數(shù)據(jù)必須與 Leader 保持一致,如果不一致會被覆蓋。
用戶對于etcd集群所有節(jié)點進行讀寫
讀?。河捎诩核泄?jié)點數(shù)據(jù)是強一致性的,讀取可以從集群中隨便哪個節(jié)點進行讀取數(shù)據(jù)
寫入:etcd集群有l(wèi)eader,如果寫入往leader寫入,可以直接寫入,然后然后Leader節(jié)點會把寫入分發(fā)給所有Follower,如果往follower寫入,然后Leader節(jié)點會把寫入分發(fā)給所有Follower
ETCD 選舉
假設三個節(jié)點的集群,三個節(jié)點上均運行Timer(每個Timer持續(xù)時間是隨機的),Raft算法使用隨機Timer來初始化Leader選舉流程,第一個節(jié)點率先完成了Timer,隨后它就會向其他兩個節(jié)點發(fā)送成為Leader的請求,其他節(jié)點接收到請求后會以投票回應然后第一個節(jié)點被選舉為Leader。
成為Leader后,該節(jié)點會以固定時間間隔向其他節(jié)點發(fā)送通知,確保自己仍是Leader。有些情況下當Follower們收不到Leader的通知后,比如說Leader節(jié)點宕機或者失去了連接,其他節(jié)點會重復之前選舉過程選舉出新的Leader。
確保數(shù)據(jù)寫入
etcd認為寫入請求被Leader節(jié)點處理并分發(fā)給了多數(shù)節(jié)點后,就是一個成功的寫入。那么多少節(jié)點如何判定呢,假設總結點數(shù)是N,那么多數(shù)節(jié)點?Quorum=N/2+1。關于如何確定etcd集群應該有多少個節(jié)點的問題,上圖的左側的圖表給出了集群中節(jié)點總數(shù)(Instances)對應的Quorum數(shù)量,用Instances減去Quorom就是集群中容錯節(jié)點(允許出故障的節(jié)點)的數(shù)量。
所以在集群中推薦的最少節(jié)點數(shù)量是3個,因為1和2個節(jié)點的容錯節(jié)點數(shù)都是0,一旦有一個節(jié)點宕掉整個集群就不能正常工作了。
ETCD架構

從 etcd 的架構圖中我們可以看到,etcd 主要分為四個部分。
HTTP Server:用于處理用戶發(fā)送的 API 請求以及其它 etcd 節(jié)點的同步與心跳信息請求。
Store:用于處理 etcd 支持的各類功能的事務,包括數(shù)據(jù)索引、節(jié)點狀態(tài)變更、監(jiān)控與反饋、事件處理與執(zhí)行等等,是 etcd 對用戶提供的大多數(shù) API 功能的具體實現(xiàn)。
Raft:Raft 強一致性算法的具體實現(xiàn),是 etcd 的核心。
WAL:Write Ahead Log(預寫式日志),是 etcd 的數(shù)據(jù)存儲方式。除了在內存中存有所有數(shù)據(jù)的狀態(tài)以及節(jié)點的索引以外,etcd 就通過 WAL 進行持久化存儲。WAL 中,所有的數(shù)據(jù)提交前都會事先記錄日志。
Snapshot 是為了防止數(shù)據(jù)過多而進行的狀態(tài)快照;
Entry 表示存儲的具體日志內容。
通常,一個用戶的請求發(fā)送過來,會經(jīng)由 HTTP Server 轉發(fā)給 Store 進行具體的事務處理,如果涉及到節(jié)點的修改,則交給 Raft 模塊進行狀態(tài)的變更、日志的記錄,然后再同步給別的 etcd 節(jié)點以確認數(shù)據(jù)提交,最后進行數(shù)據(jù)的提交,再次同步。
ETCD部署
etcd 版本: etcd-v3.4.13-linux-amd6
集群節(jié)點
10.65.6.3? ? ?etcd-001
10.65.6.4? ? ?etcd-002
10.65.6.5? ? ?etcd-003
安裝部署
#ln -snvf /apps/svr/etcd-v3.4.13-linux-amd6 /apps/svr/etcd
#mkdir /apps/{logs,conf}/etcd -pv
節(jié)點ETCD-001配置文件:
#cat /apps/conf/etcd/etcd.conf
name: etcd-001
data-dir: /apps/dbdat/etcd
listen-client-urls: http://10.65.6.3:2379,http://127.0.0.1:2379
advertise-client-urls: http://10.65.6.3:2379
listen-peer-urls: http://10.65.6.3:2380
initial-advertise-peer-urls: http://10.65.6.3:2380
initial-cluster: etcd-001=http://10.65.6.3:2380,etcd-002=http://10.65.6.4:2380,etcd-003=http://10.65.6.5:2380
initial-cluster-token: Frank
initial-cluster-state: existing
heartbeat-interval: 1000
election-timeout: 5000
snapshot-count: 200000
logger: zap
log-package-levels: DEBUG
log-level: info
log-ouputs: /apps/logs/etcd/etcd.log
enable-v2: true
節(jié)點ETCD-002配置文件:
#cat /apps/conf/etcd/etcd.conf
#etcd-002
name: etcd-002
data-dir: /apps/dbdat/etcd
listen-client-urls: http://10.65.6.4:2379,http://127.0.0.1:2379
advertise-client-urls: http://10.65.6.4:2379
listen-peer-urls: http://10.65.6.4:2380
initial-advertise-peer-urls: http://10.65.6.4:2380
initial-cluster: etcd-001=http://10.65.6.3:2380,etcd-002=http://10.65.6.4:2380,etcd-003=http://10.65.6.5:2380
initial-cluster-token: Frank
initial-cluster-state: existing
heartbeat-interval: 1000
election-timeout: 5000
snapshot-count: 200000
logger: zap
log-package-levels: DEBUG
log-level: info
enable-v2: true
節(jié)點ETCD-003配置文件:
#cat /apps/conf/etcd/etcd.conf
#etcd-003
name: etcd-003
data-dir: /apps/dbdat/etcd
listen-client-urls: http://10.65.6.5:2379,http://127.0.0.1:2379
advertise-client-urls: http://10.65.6.5:2379
listen-peer-urls: http://10.65.6.5:2380
initial-advertise-peer-urls: http://10.65.6.5:2380
initial-cluster: etcd-001=http://10.65.6.3:2380,etcd-002=http://10.65.6.4:2380,etcd-003=http://10.65.6.5:2380
initial-cluster-token: Frank
initial-cluster-state: existing
heartbeat-interval: 1000
election-timeout: 5000
snapshot-count: 200000
logger: zap
log-package-levels: DEBUG
log-level: info
enable-v2: true
啟動配置文件
cat /usr/lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
WorkingDirectory=/apps/svr/etcd/
EnvironmentFile=-/apps/conf/etcd/etcd.conf
User=apps
# set GOMAXPROCS to number of processors
Restart=on-failure
LimitNOFILE=65536
ExecStart=/apps/svr/etcd/sbin/etcd --config-file=/apps/conf/etcd/etcd.conf
[Install]
WantedBy=multi-user.target
#systemctl? daemon-reload
#systemctl start etcd
查看etcd集群節(jié)點
etcdctl member list
2d1dafb4d8b666c4, started, etcd-003, http://10.65.6.5:2380, http://10.65.6.5:2379, false
4330f568dd163615, started, etcd-002, http://10.65.6.4:2380, http://10.65.6.4:2379, false
504e6c59d8de3997, started, etcd-001, http://10.65.6.3:2380, http://10.65.6.3:2379, false
查看集群狀態(tài)
etcdctl --endpoints=http://10.65.6.3:2379,http://10.65.6.4:2379,http://10.65.6.5:2379 endpoint health
http://10.65.6.3:2379 is healthy: successfully committed proposal: took = 3.351492ms
http://10.65.6.4:2379 is healthy: successfully committed proposal: took = 3.861589ms
http://10.65.6.5:2379 is healthy: successfully committed proposal: took = 4.066767ms