調優(Tuning)
etcd默認設置適用於網絡低延遲。但網絡延遲高,如網絡跨域數據中心,那麼心跳間隔和選舉超時的設置就需要優化(tuning).
網絡慢不僅僅由於延遲,還可能被Leader和follower的低速磁盤IO影響。每一次超時設置應該包含一個請求發出到響應成功的時間。
時間參數
當一個節點掛掉(stalls)變慢或者下線,分佈式一致性協議(distributed consensus protocol)依賴兩個時間參數保證領導力切換。
第一個參數叫心跳間隔(Heartbeat Interval)。它代表leader通知所有的followers,他還是Leader的頻率。最佳實踐,它應該被設置爲節點之間網絡往返時間(round-trip time)。etcd默認心跳間隔是100ms。
第二個參數是選舉超時(Election TimeoutRTT)。它表示follower在多久後還沒有收到leader的心跳,它自己就變成Leader。etcd的默認選舉超時是1000ms。
調整參數需要做一些權衡。心跳間隔推薦設置爲節點之前的最大RTT,一般可設置爲RTT的0.5-1.5倍。如果心跳間隔太短,etcd會發送沒必要心跳增加CPU和網絡的使用率。另外,過長的心跳間隔會增長選舉超時時間。過長的選舉超時導致要更長的時間才能發現Leader故障。測量RTT最簡單方法就是用PING工具。
選舉超時應該基於心跳間隔和節點的平均RTT去設置。選舉超時應該至少是RTT的10倍,這樣才能視爲網絡延遲出現方差(variance)。例如,節點間的RTT是10ms,那麼超時時間至少應該是100ms。
選舉超時時間最大限制是50000ms(50s), 只有etcd被部署在全球範圍內時,才應該使用這個值。美國大陸的RTT是130ms,美國和日本的RTT是350-400ms。如果不均勻的網絡性能或者常規的網絡延遲和丟失,會引起多次網絡重試,所以5s是一個安全的RTT最高值。5s是心跳間隔的最高值,所以超時時間最高值應該是50s。
一個集羣中的所有節點應該設置一樣的心跳間隔和選舉超時。如果設置不一樣可能使集羣不穩定。
默認值可以被命令行參數或環境參數覆蓋,單位是ms。
# 令行參數:
$ etcd --heartbeat-interval=100 --election-timeout=500
# 環境參數:
$ ETCD_HEARTBEAT_INTERVAL=100 ETCD_ELECTION_TIMEOUT=500 etcd
快照(Snapshots)
etcd追加key的變更到日誌中。這些日誌用一行記錄一個key的變更,日誌就不斷的增長。當簡單使用etcd時這些日誌增長不會有問題,但大集羣的時候日誌就會越來越多。
爲了避免大量日誌,etcd會定期製作快照。這些快照通過保存日誌裏的修改到當前狀態和移除老的日誌去壓縮日誌。
快照優化
創建快照對於v2版是昂貴的,所有隻有當更改記錄操作一定數量後,纔會製作快照。默認,是每10000次更改纔會製作快照。如果etcd的內存和磁盤使用率過高,可以降低這個閥值(threshold)。
# Command line arguments:
$ etcd --snapshot-count=5000
# Environment variables:
$ ETCD_SNAPSHOT_COUNT=5000 etcd
磁盤
etcd集羣對磁盤的延遲非常敏感。因爲etcd需要存儲變更日誌,多個進程操作磁盤可能引起更高的fsync延遲。這些可能引起etcd丟失心跳,請求超時或者Leader臨時丟失。可以通過提高etcd進程的磁盤優先級。
在Linux, etcd的磁盤優先級可以通過ionic去配置
# best effort, highest priority
$ sudo ionice -c2 -n0 -p `pgrep etcd`
網絡
如果etcd的Leader服務大量併發客戶端,這就會導致follower的請求的處理被延遲因爲網絡延遲。follower的send buffer中能看到錯誤的列表。
dropped MsgProp to 247ae21ff9436b2d since streamMsg's sending buffer is full
dropped MsgAppResp to 247ae21ff9436b2d since streamMsg's sending buffer is full
這些錯誤可以通過提高Leader的網絡優先級來提高follower的請求的響應。可以通過流量控制機制來提高
tc qdisc add dev eth0 root handle 1: prio bands 3
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip sport 2380 0xffff flowid 1:1
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip dport 2380 0xffff flowid 1:1
tc filter add dev eth0 parent 1: protocol ip prio 2 u32 match ip sport 2739 0xffff flowid 1:1
tc filter add dev eth0 parent 1: protocol ip prio 2 u32 match ip dport 2739 0xffff flowid 1:1
官方原文地址:https://github.com/etcd-io/etcd/blob/master/Documentation/tuning.md
參考翻譯文章:https://zhuanlan.zhihu.com/p/29806621