心跳Server端設計:
server端的(de)心(xin)(xin)跳設計(ji)要稍微復雜一(yi)些,為了保證server端主從切(qie)換(huan)過程中,client不發(fa)生斷連。client端與(yu)server在建立(li)心(xin)(xin)跳時,server端需(xu)要將心(xin)(xin)跳信息進行(xing)持久化。因此server的(de)心(xin)(xin)跳需(xu)要依賴(lai)一(yi)個可(ke)靠的(de)存儲系(xi)統(tong),一(yi)般選(xuan)擇(ze)zookeeper,etcd這種分布式協調組件。
與server的心跳建立:

a. worker2啟(qi)動后只有(you)master的列(lie)表,并不(bu)知道哪(na)個(ge)是(shi)leader,因(yin)此先廣播bootstrap信(xin)息。
b. 只(zhi)有(you)leader節點(dian)響(xiang)應bootstrap信息,leader生成session id并持(chi)久(jiu)化,只(zhi)有(you)持(chi)久(jiu)化成功后才可以返(fan)回(hui)bootstrap ack 給worker2,并標記worker2為Up。
c. leader將分配的(de)(de)session id 自己(ji)的(de)(de)epoch等信息(xi)返回給(gei)worker2。worker2收到(dao)ack信息(xi)本地記錄leader的(de)(de)epoch,sessionid等信息(xi)作為后續發送(song)心跳的(de)(de)憑證(zheng),并進入connected狀態。
d. bootstrap ack消息還需要攜帶(dai),心(xin)跳超時時間(jian),假心(xin)跳超時時間(jian)。
server端故障切主:

a. leader故障后(hou),新的(de)leader接管了業務,并且(qie)從持久化存(cun)儲中load起worker2的(de)相關信息,主要(yao)是sessionid信息。
b. 新leader加載(zai)worker2的心跳信息(xi)后,會(hui)重新計時,只要worker2在(zai)超時時間內重新發(fa)送(song)心跳就(jiu)不會(hui)產生斷連事(shi)件。
c. 為了server切(qie)主過(guo)程中,不對原有(you)心跳有(you)影響,server端故障切(qie)換時延一般設置為,server端與client端心跳的(de)0.6.
d. worker2收到(dao)新(xin)的HB ack后(hou)更(geng)新(xin)新(xin)的leader地址與epoch信息,整個流程(cheng)對外是透明的。
leader與worker同時故障:
因為存在(zai)leader與worker同時故(gu)障場景,例如:worker與leader在(zai)同一臺服(fu)務(wu)器(qi),而服(fu)務(wu)器(qi)掉(diao)電或者(zhe)服(fu)務(wu)器(qi)重啟(qi)。這種場景下我們也(ye)要求故(gu)障檢(jian)測也(ye)可以(yi)發現worker發生過故(gu)障。

a. leader與worker2 同時故障(zhang),leader切主并加(jia)載worker2的(de)心跳(tiao)信(xin)息。
b. 這時新(xin)leader不會認(ren)為worker2發生了故障,而(er)是會重新(xin)計時,等待(dai)worker2的HB消息(xi)。
c. 由于worker2故障了(le),因此(ci)新leader等不(bu)到worker2的HB消息,最(zui)終(zhong)會(hui)導致(zhi)leader發現worker2超時。
d. 即使(shi)在(zai)超(chao)時(shi)時(shi)間(jian)內,worker2重啟,worker2重啟后會(hui)(hui)先發送bootstrap消(xiao)息(xi),新leader收到worker2的bootstrap消(xiao)息(xi)后會(hui)(hui)先忽略,因(yin)為此時(shi)worker2還(huan)在(zai)Up狀態,不會(hui)(hui)接(jie)收bootstrap消(xiao)息(xi)只會(hui)(hui)接(jie)收HB消(xiao)息(xi)。
e. 等leader發現(xian)worker2超時后,將worker2的(de)狀態設(she)置(zhi)為down,這時worker2的(de)bootstrap消息才會被處理。
從上面(mian)的(de)(de)流(liu)程可(ke)以看出,無論leader和worker如何故障(zhang),都不會(hui)影響故障(zhang)事(shi)件(jian)的(de)(de)檢測(ce)(ce),最終都會(hui)檢測(ce)(ce)出來,只是有可(ke)能延遲。