etcd服務出現了以下報錯
Mar 23 05:50:44 localhost etcd: failed to send out heartbeat on time (exceeded the 100ms timeout for 2.951502ms)
心跳檢測報錯主要與以下因素有關(磁盤速度、cpu性能和網絡不穩定問題):
第一,etcd使用了raft算法,leader會定時地給每個follower發送心跳,如果leader連續兩個心跳時間沒有給follower發送心跳,etcd會打印這個log以給出告警。通常情況下這個issue是disk運行過慢導致的,leader一般會在心跳包里附帶一些metadata,leader需要先把這些數據固化到磁盤上,然后才能發送。寫磁盤過程可能要與其他應用競爭,或者因為磁盤是一個虛擬的或者是SATA類型的導致運行過慢,此時只有更好更快磁盤硬件才能解決問題。etcd暴露給Prometheus的metrics指標wal fsync
duration_seconds就顯示了wal日志的平均花費時間,通常這個指標應低於10ms。
第二種原因就是CPU計算能力不足。如果是通過監控系統發現CPU利用率確實很高,就應該把etcd移到更好的機器上,然后通過cgroups保證etcd進程獨享某些核的計算能力,或者提高etcd的priority。
第三種原因就可能是網速過慢。如果Prometheus顯示是網絡服務質量不行,譬如延遲太高或者丟包率過高,那就把etcd移到網絡不擁堵的情況下就能解決問題。但是如果etcd是跨機房部署的,長延遲就不可避免了,那就需要根據機房間的RTT調整heartbeat-interval,而參數election-timeout則至少是heartbeat-interval的5倍。