Nacos 健康檢查機(jī)制
程露 Nacos committer
在上文中,我們介紹了 Nacos 注冊(cè)中心中的服務(wù)數(shù)據(jù)模型,說明了服務(wù)、實(shí)例以及集群的內(nèi)容,關(guān)系及它們的生命周期。期間健康檢查是一個(gè)被反復(fù)提及的詞語,這是由于注冊(cè)中心不應(yīng)該僅僅提供服務(wù)注冊(cè)和發(fā)現(xiàn)功能,還應(yīng)該保證對(duì)服務(wù)可用性進(jìn)行監(jiān)測,對(duì)不健康和過期的服務(wù)實(shí)例進(jìn)行標(biāo)識(shí)或剔除,維護(hù)實(shí)例的生命周期,以保證客戶端盡可能的查詢到可用的服務(wù)列表。因此本文將詳細(xì)介紹 Nacos 注冊(cè)中心中的健康檢查機(jī)制。
注冊(cè)中心的健康檢查機(jī)制
想象一下這么一個(gè)場景,你所在的地區(qū)突然發(fā)生地質(zhì)災(zāi)害,你被掩蓋在廢墟下面,搜救隊(duì)必須要知道你在廢墟里面那么才能對(duì)你進(jìn)行施救。那么有什么方法可以讓救援隊(duì)知道你在廢墟下面?第一種,你在廢墟里面大喊help! help! I am here! ,讓搜救隊(duì)知道你的位置和健康狀態(tài)。第二種,搜救隊(duì)使用了他們的專業(yè)檢查設(shè)備,探測到你正埋在廢墟下面。
這兩種檢查方式其實(shí)也可以類比到我們對(duì)于服務(wù)的探測,我們需要知道一個(gè)服務(wù)是否還健康。那么第一種方式是客戶端主動(dòng)上報(bào),告訴服務(wù)端自己健康狀態(tài),如果在一段時(shí)間沒有上報(bào),那么我們就認(rèn)為服務(wù)已經(jīng)不健康。第二種,則是服務(wù)端主動(dòng)向客戶端進(jìn)行探測,檢查客戶端是否還被能探測到。
再回到前面的場景中,如果是你在廢墟中大聲呼叫救援隊(duì)并且提供你的位置和健康信息,那么相比于搜救隊(duì)用探測設(shè)備挨著廢墟探測會(huì)使探測隊(duì)的工作量減輕很多,那么他可以專注于盡快將你救出。這也好比于注冊(cè)中心對(duì)于服務(wù)健康狀態(tài)的檢測,如果所有服務(wù)都需要注冊(cè)中心去主動(dòng)探測,由于服務(wù)的數(shù)量遠(yuǎn)大于注冊(cè)中心的數(shù)量,那么注冊(cè)中心的任務(wù)量將會(huì)比較巨大。所以我們自然而然會(huì)想到,那就都采用服務(wù)主動(dòng)上報(bào)的方式進(jìn)行健康檢查。那如果在廢墟之下的我們因?yàn)樯眢w狀況無法呼救,那么搜救隊(duì)就會(huì)放棄搜救了嗎?當(dāng)然不是,搜救隊(duì)肯定也會(huì)對(duì)廢墟進(jìn)行全面探測將你救出。類比到服務(wù)健康檢查,如果服務(wù)本身就沒法主動(dòng)進(jìn)行健康上報(bào),那么這個(gè)時(shí)候注冊(cè)中心主動(dòng)檢查健康狀態(tài)就有用武之地了。
在當(dāng)前主流的注冊(cè)中心,對(duì)于健康檢查機(jī)制主要都采用了 TTL(Time To Live)機(jī)制,即客戶端在一定時(shí)間沒有向注冊(cè)中心發(fā)送心跳,那么注冊(cè)中心會(huì)認(rèn)為此服務(wù)不健康,進(jìn)而觸發(fā)后續(xù)的剔除邏輯。對(duì)于主動(dòng)探測的方式那么根據(jù)不同的場景,需要采用的方式可能會(huì)有不同。
既然以上兩種健康檢查機(jī)制都有應(yīng)用的場景,且適用場景不一致,那么 Nacos 對(duì)于健康檢查的機(jī)制又是如何抉擇的呢?
在介紹 Nacos 的健康檢查機(jī)制之前,我們先回顧一下 Nacos 服務(wù)有什么特點(diǎn)。Nacos 提供了兩種服務(wù)類型供用戶注冊(cè)實(shí)例時(shí)選擇,分為非持久化實(shí)例(又稱臨時(shí)實(shí)例)和持久化實(shí)例(又稱永久實(shí)例)。
臨時(shí)實(shí)例只是臨時(shí)存在于注冊(cè)中心中,會(huì)在服務(wù)下線或不可用時(shí)被注冊(cè)中心剔除,臨時(shí)實(shí)例會(huì)與注冊(cè)中心保持心跳,注冊(cè)中心會(huì)在一段時(shí)間沒有收到來自客戶端的心跳后會(huì)將實(shí)例設(shè)置為不健康,然后在一段時(shí)間后進(jìn)行剔除。
永久實(shí)例在被刪除之前會(huì)永久的存在于注冊(cè)中心,且有可能并不知道注冊(cè)中心存在,不會(huì)主動(dòng)向注冊(cè)中心上報(bào)心跳,那么這個(gè)時(shí)候就需要注冊(cè)中心主動(dòng)進(jìn)行探活。
從上面的介紹我們可以看出,Nacos 中兩種健康探測方式均有被使用,Nacos 中健康檢查的整體交互如下如所示。下面我們會(huì)詳細(xì)介紹 Nacos 中對(duì)于兩種實(shí)例的健康檢查機(jī)制。
臨時(shí)實(shí)例健康檢查機(jī)制
在 Nacos 中,用戶可以通過兩種方式進(jìn)行臨時(shí)實(shí)例的注冊(cè),通過 Nacos 的 OpenAPI 進(jìn)行服務(wù)注冊(cè)或通過 Nacos 提供的 SDK 進(jìn)行服務(wù)注冊(cè)。
OpenAPI 的注冊(cè)方式實(shí)際是用戶根據(jù)自身需求調(diào)用 Http 接口對(duì)服務(wù)進(jìn)行注冊(cè),然后通過 Http 接口發(fā)送心跳到注冊(cè)中心。在注冊(cè)服務(wù)的同時(shí)會(huì)注冊(cè)一個(gè)全局的客戶端心跳檢測的任務(wù)。在服務(wù)一段時(shí)間沒有收到來自客戶端的心跳后,該任務(wù)會(huì)將其標(biāo)記為不健康,如果在間隔的時(shí)間內(nèi)還未收到心跳,那么該任務(wù)會(huì)將其剔除。
SDK 的注冊(cè)方式實(shí)際是通過 RPC 與注冊(cè)中心保持連接(Nacos 2.x 版本中,舊版的還是仍然通過 OpenAPI 的方式),客戶端會(huì)定時(shí)的通過 RPC 連接向 Nacos 注冊(cè)中心發(fā)送心跳,保持連接的存活。如果客戶端和注冊(cè)中心的連接斷開,那么注冊(cè)中心會(huì)主動(dòng)剔除該 client 所注冊(cè)的服務(wù),達(dá)到下線的效果。同時(shí) Nacos 注冊(cè)中心還會(huì)在注冊(cè)中心啟動(dòng)時(shí),注冊(cè)一個(gè)過期客戶端清除的定時(shí)任務(wù),用于刪除那些健康狀態(tài)超過一段時(shí)間的客戶端。
從上面的特點(diǎn)我們可以發(fā)現(xiàn),對(duì)于不同類型的使用方式,Nacos 對(duì)于健康檢查的特點(diǎn)實(shí)際都是相同的,都是由客戶端向注冊(cè)中心發(fā)送心跳,注冊(cè)中心會(huì)在連接斷開或是心跳過期后將不健康的實(shí)例移除。
永久實(shí)例健康檢查機(jī)制
Nacos 中使用 SDK 對(duì)于永久實(shí)例的注冊(cè)實(shí)際也是使用 OpenAPI 的方式進(jìn)行注冊(cè),這樣可以保證即使是客戶端下線后也不會(huì)影響永久實(shí)例的健康檢查。
對(duì)于永久實(shí)例的的健康檢查,Nacos 采用的是注冊(cè)中心探測機(jī)制,注冊(cè)中心會(huì)在持久化服務(wù)初始化時(shí)根據(jù)客戶端選擇的協(xié)議類型注冊(cè)探活的定時(shí)任務(wù)。Nacos 現(xiàn)在內(nèi)置提供了三種探測的協(xié)議,即 Http、TCP 以及 MySQL 。一般而言 Http 和 TCP 已經(jīng)可以涵蓋絕大多數(shù)的健康檢查場景。MySQL 主要用于特殊的業(yè)務(wù)場景,例如數(shù)據(jù)庫的主備需要通過服務(wù)名對(duì)外提供訪問,需要確定當(dāng)前訪問數(shù)據(jù)庫是否為主庫時(shí),那么我們此時(shí)的健康檢查接口,是一個(gè)檢查數(shù)據(jù)庫是否為主庫的 MySQL 命令。
由于持久化服務(wù)的實(shí)例的在被主動(dòng)刪除前一直存在的特性,探活的定時(shí)任務(wù)會(huì)不斷探測服務(wù)的健康狀態(tài),并且將無法探測成功的實(shí)例標(biāo)記為不健康。但是有些時(shí)候會(huì)有這樣的場景,有些服務(wù)不希望去校驗(yàn)其健康狀態(tài),Nacos也是提供了對(duì)應(yīng)的白名單配置,用戶可以將服務(wù)配置到該白名單,那么 Nacos 會(huì)放棄對(duì)其進(jìn)行健康檢查,實(shí)例的健康狀態(tài)也始終為用戶傳入的健康狀態(tài)。
集群模式下的健康檢查機(jī)制
一個(gè)完整的注冊(cè)中心,是應(yīng)該具備高可用的特性,即我們的注冊(cè)中心是可以集群部署作為一個(gè)整體對(duì)外提供服務(wù),當(dāng)然 Nacos 也支持這樣的特性。不同于單機(jī)部署,集群部署中我們的客戶端只和其中一個(gè)注冊(cè)中心服務(wù)保持鏈接和請(qǐng)求,但是我們的服務(wù)信息需要注冊(cè)到所有的服務(wù)節(jié)點(diǎn)上,在其他客戶端從任意一個(gè)注冊(cè)中心服務(wù)獲取服務(wù)列表時(shí)始終是所有的服務(wù)列表。在這種情況下,那么 Nacos 在集群模式下又是如何對(duì)不是和自己保持心跳連接的服務(wù)進(jìn)行健康檢查的呢?
對(duì)于集群下的服務(wù),Nacos 一個(gè)服務(wù)只會(huì)被 Nacos 集群中的一個(gè)注冊(cè)中心所負(fù)責(zé),其余節(jié)點(diǎn)的服務(wù)信息只是集群副本,用于訂閱者在查詢服務(wù)列表時(shí),始終可以獲取到全部的服務(wù)列表。臨時(shí)實(shí)例只會(huì)對(duì)其被負(fù)責(zé)的注冊(cè)中心節(jié)點(diǎn)發(fā)送心跳信息,注冊(cè)中心服務(wù)節(jié)點(diǎn)會(huì)對(duì)其負(fù)責(zé)的永久實(shí)例進(jìn)行健康探測,在獲取到健康狀態(tài)后由當(dāng)前負(fù)責(zé)的注冊(cè)中心節(jié)點(diǎn)將健康信息同步到集群中的其他的注冊(cè)中心。
在Nacos中,服務(wù)的注冊(cè)我們從注冊(cè)方式維度實(shí)際可以分為兩大類。第一類通過 SDK RPC 連接進(jìn)行注冊(cè),客戶端會(huì)和注冊(cè)中心保持鏈接。第二類,通過 OpenAPI 進(jìn)行 IP 和端口注冊(cè)。
對(duì)于第一類,如何尋找到對(duì)其負(fù)責(zé)的注冊(cè)中心節(jié)點(diǎn)呢?聰明的你肯定想到了,只需要和注冊(cè)中心集群中的任意一臺(tái)節(jié)點(diǎn)建立聯(lián)系,那么由這個(gè)節(jié)點(diǎn)負(fù)責(zé)這個(gè)客戶端就可以了。注冊(cè)中心會(huì)在啟動(dòng)時(shí)注冊(cè)一個(gè)全局的同步任務(wù),用于將其當(dāng)前負(fù)責(zé)的所有節(jié)點(diǎn)信息同步到集群中的其他節(jié)點(diǎn),其他非負(fù)責(zé)的節(jié)點(diǎn)也會(huì)創(chuàng)建該客戶端的信息,在非負(fù)責(zé)的節(jié)點(diǎn)上,連接類型的客戶端,會(huì)有一個(gè)續(xù)約時(shí)間的概念,在收到其他節(jié)點(diǎn)的同步信息時(shí),更新續(xù)約時(shí)間為當(dāng)前時(shí)間,如果在集群中的其他節(jié)點(diǎn)在一段時(shí)間內(nèi)沒有收到不是自己的負(fù)責(zé)的節(jié)點(diǎn)的同步信息,那么認(rèn)為此節(jié)點(diǎn)已經(jīng)不健康,從而達(dá)到對(duì)不是自己負(fù)責(zé)的節(jié)點(diǎn)健康狀態(tài)檢查。
對(duì)于第二類,方式其實(shí)也基本和第一類一致,OpenAPI 注冊(cè)的臨時(shí)實(shí)例也是通過同步自身負(fù)責(zé)的節(jié)點(diǎn)到其他節(jié)點(diǎn)來更新其他節(jié)點(diǎn)的對(duì)應(yīng)的臨時(shí)實(shí)例的心跳時(shí)間,保證其他節(jié)點(diǎn)不會(huì)刪除或者修改此實(shí)例的健康狀態(tài)。前面我們特別特別指明了是臨時(shí)實(shí)例而沒有說所有實(shí)例,你應(yīng)該也可能會(huì)想到這種方式對(duì)于持久化節(jié)點(diǎn)的會(huì)顯得多余,永久實(shí)例會(huì)在被主動(dòng)刪除前一直存在于注冊(cè)中心,那么我們健康檢查并不會(huì)去刪除實(shí)例,所以我們只需要在負(fù)責(zé)的節(jié)點(diǎn)永久實(shí)例健康狀態(tài)變更的時(shí)候通知到其余的節(jié)點(diǎn)即可。
小結(jié)
本文從注冊(cè)中心場景展開,詳細(xì)介紹了 Nacos 注冊(cè)中心的健康檢查機(jī)制。在 Nacos 中,針對(duì)不同類型的服務(wù)將會(huì)使用不同的健康檢查方式進(jìn)行實(shí)例生命周期的維護(hù),并通過前文提到的一致性協(xié)議使 Nacos 節(jié)點(diǎn)均能夠保持實(shí)例生命周期的一致。從本文開始,我們提及了 Nacos 注冊(cè)中心集群中,實(shí)例的健康狀態(tài)和生命周期需要保持一致,因此在下文中,我們將開始介紹 Nacos 注冊(cè)中心是如何使用 Nacos 的一致性協(xié)議,來保持?jǐn)?shù)據(jù)模型及生命周期一致。
相關(guān)知識(shí)
幼兒健康檢查制度
兒童健康檢查工作制度(12篇)
一體化身體健康檢查健康小屋體檢一體機(jī)
托幼機(jī)構(gòu)健康檢查管理PPT課件.ppt
幼兒園健康檢查制度(精選12篇)
哪些醫(yī)療機(jī)構(gòu)可承擔(dān)職業(yè)健康檢查?
幼兒園環(huán)境衛(wèi)生健康檢查制度
托幼機(jī)構(gòu)工作人員健康檢查表
職業(yè)健康檢查與獎(jiǎng)懲制度(簡單版21篇)
健康檢測一體機(jī)
網(wǎng)址: Nacos 健康檢查機(jī)制 http://www.u1s5d6.cn/newsview139835.html
推薦資訊
- 1發(fā)朋友圈對(duì)老公徹底失望的心情 12775
- 2BMI體重指數(shù)計(jì)算公式是什么 11235
- 3補(bǔ)腎吃什么 補(bǔ)腎最佳食物推薦 11199
- 4性生活姿勢(shì)有哪些 盤點(diǎn)夫妻性 10428
- 5BMI正常值范圍一般是多少? 10137
- 6在線基礎(chǔ)代謝率(BMR)計(jì)算 9652
- 7一邊做飯一邊躁狂怎么辦 9138
- 8從出汗看健康 出汗透露你的健 9063
- 9早上怎么喝水最健康? 8613
- 10五大原因危害女性健康 如何保 7828