首頁(yè) 資訊 Nacos 健康檢查機(jī)制

Nacos 健康檢查機(jī)制

來(lái)源:泰然健康網(wǎng) 時(shí)間:2024年11月27日 23:38

程露 Nacos committer

在上文中,我們介紹了 Nacos 注冊(cè)中心中的服務(wù)數(shù)據(jù)模型,說(shuō)明了服務(wù)、實(shí)例以及集群的內(nèi)容,關(guān)系及它們的生命周期。期間健康檢查是一個(gè)被反復(fù)提及的詞語(yǔ),這是由于注冊(cè)中心不應(yīng)該僅僅提供服務(wù)注冊(cè)和發(fā)現(xiàn)功能,還應(yīng)該保證對(duì)服務(wù)可用性進(jìn)行監(jiān)測(cè),對(duì)不健康和過(guò)期的服務(wù)實(shí)例進(jìn)行標(biāo)識(shí)或剔除,維護(hù)實(shí)例的生命周期,以保證客戶(hù)端盡可能的查詢(xún)到可用的服務(wù)列表。因此本文將詳細(xì)介紹 Nacos 注冊(cè)中心中的健康檢查機(jī)制。

注冊(cè)中心的健康檢查機(jī)制

想象一下這么一個(gè)場(chǎng)景,你所在的地區(qū)突然發(fā)生地質(zhì)災(zāi)害,你被掩蓋在廢墟下面,搜救隊(duì)必須要知道你在廢墟里面那么才能對(duì)你進(jìn)行施救。那么有什么方法可以讓救援隊(duì)知道你在廢墟下面?第一種,你在廢墟里面大喊help! help! I am here! ,讓搜救隊(duì)知道你的位置和健康狀態(tài)。第二種,搜救隊(duì)使用了他們的專(zhuān)業(yè)檢查設(shè)備,探測(cè)到你正埋在廢墟下面。
這兩種檢查方式其實(shí)也可以類(lèi)比到我們對(duì)于服務(wù)的探測(cè),我們需要知道一個(gè)服務(wù)是否還健康。那么第一種方式是客戶(hù)端主動(dòng)上報(bào),告訴服務(wù)端自己健康狀態(tài),如果在一段時(shí)間沒(méi)有上報(bào),那么我們就認(rèn)為服務(wù)已經(jīng)不健康。第二種,則是服務(wù)端主動(dòng)向客戶(hù)端進(jìn)行探測(cè),檢查客戶(hù)端是否還被能探測(cè)到。
image.png
再回到前面的場(chǎng)景中,如果是你在廢墟中大聲呼叫救援隊(duì)并且提供你的位置和健康信息,那么相比于搜救隊(duì)用探測(cè)設(shè)備挨著廢墟探測(cè)會(huì)使探測(cè)隊(duì)的工作量減輕很多,那么他可以專(zhuān)注于盡快將你救出。這也好比于注冊(cè)中心對(duì)于服務(wù)健康狀態(tài)的檢測(cè),如果所有服務(wù)都需要注冊(cè)中心去主動(dòng)探測(cè),由于服務(wù)的數(shù)量遠(yuǎn)大于注冊(cè)中心的數(shù)量,那么注冊(cè)中心的任務(wù)量將會(huì)比較巨大。所以我們自然而然會(huì)想到,那就都采用服務(wù)主動(dòng)上報(bào)的方式進(jìn)行健康檢查。那如果在廢墟之下的我們因?yàn)樯眢w狀況無(wú)法呼救,那么搜救隊(duì)就會(huì)放棄搜救了嗎?當(dāng)然不是,搜救隊(duì)肯定也會(huì)對(duì)廢墟進(jìn)行全面探測(cè)將你救出。類(lèi)比到服務(wù)健康檢查,如果服務(wù)本身就沒(méi)法主動(dòng)進(jìn)行健康上報(bào),那么這個(gè)時(shí)候注冊(cè)中心主動(dòng)檢查健康狀態(tài)就有用武之地了。
image.png
在當(dāng)前主流的注冊(cè)中心,對(duì)于健康檢查機(jī)制主要都采用了 TTL(Time To Live)機(jī)制,即客戶(hù)端在一定時(shí)間沒(méi)有向注冊(cè)中心發(fā)送心跳,那么注冊(cè)中心會(huì)認(rèn)為此服務(wù)不健康,進(jìn)而觸發(fā)后續(xù)的剔除邏輯。對(duì)于主動(dòng)探測(cè)的方式那么根據(jù)不同的場(chǎng)景,需要采用的方式可能會(huì)有不同。

既然以上兩種健康檢查機(jī)制都有應(yīng)用的場(chǎng)景,且適用場(chǎng)景不一致,那么 Nacos 對(duì)于健康檢查的機(jī)制又是如何抉擇的呢?
在介紹 Nacos 的健康檢查機(jī)制之前,我們先回顧一下 Nacos 服務(wù)有什么特點(diǎn)。Nacos 提供了兩種服務(wù)類(lèi)型供用戶(hù)注冊(cè)實(shí)例時(shí)選擇,分為非持久化實(shí)例(又稱(chēng)臨時(shí)實(shí)例)和持久化實(shí)例(又稱(chēng)永久實(shí)例)。
臨時(shí)實(shí)例只是臨時(shí)存在于注冊(cè)中心中,會(huì)在服務(wù)下線或不可用時(shí)被注冊(cè)中心剔除,臨時(shí)實(shí)例會(huì)與注冊(cè)中心保持心跳,注冊(cè)中心會(huì)在一段時(shí)間沒(méi)有收到來(lái)自客戶(hù)端的心跳后會(huì)將實(shí)例設(shè)置為不健康,然后在一段時(shí)間后進(jìn)行剔除。
永久實(shí)例在被刪除之前會(huì)永久的存在于注冊(cè)中心,且有可能并不知道注冊(cè)中心存在,不會(huì)主動(dòng)向注冊(cè)中心上報(bào)心跳,那么這個(gè)時(shí)候就需要注冊(cè)中心主動(dòng)進(jìn)行探活。
從上面的介紹我們可以看出,Nacos 中兩種健康探測(cè)方式均有被使用,Nacos 中健康檢查的整體交互如下如所示。下面我們會(huì)詳細(xì)介紹 Nacos 中對(duì)于兩種實(shí)例的健康檢查機(jī)制。
Nacos兩種實(shí)例健康檢查機(jī)制

臨時(shí)實(shí)例健康檢查機(jī)制

在 Nacos 中,用戶(hù)可以通過(guò)兩種方式進(jìn)行臨時(shí)實(shí)例的注冊(cè),通過(guò) Nacos 的 OpenAPI 進(jìn)行服務(wù)注冊(cè)或通過(guò) Nacos 提供的 SDK 進(jìn)行服務(wù)注冊(cè)。
OpenAPI 的注冊(cè)方式實(shí)際是用戶(hù)根據(jù)自身需求調(diào)用 Http 接口對(duì)服務(wù)進(jìn)行注冊(cè),然后通過(guò) Http 接口發(fā)送心跳到注冊(cè)中心。在注冊(cè)服務(wù)的同時(shí)會(huì)注冊(cè)一個(gè)全局的客戶(hù)端心跳檢測(cè)的任務(wù)。在服務(wù)一段時(shí)間沒(méi)有收到來(lái)自客戶(hù)端的心跳后,該任務(wù)會(huì)將其標(biāo)記為不健康,如果在間隔的時(shí)間內(nèi)還未收到心跳,那么該任務(wù)會(huì)將其剔除。
SDK 的注冊(cè)方式實(shí)際是通過(guò) RPC 與注冊(cè)中心保持連接(Nacos 2.x 版本中,舊版的還是仍然通過(guò) OpenAPI 的方式),客戶(hù)端會(huì)定時(shí)的通過(guò) RPC 連接向 Nacos 注冊(cè)中心發(fā)送心跳,保持連接的存活。如果客戶(hù)端和注冊(cè)中心的連接斷開(kāi),那么注冊(cè)中心會(huì)主動(dòng)剔除該 client 所注冊(cè)的服務(wù),達(dá)到下線的效果。同時(shí) Nacos 注冊(cè)中心還會(huì)在注冊(cè)中心啟動(dòng)時(shí),注冊(cè)一個(gè)過(guò)期客戶(hù)端清除的定時(shí)任務(wù),用于刪除那些健康狀態(tài)超過(guò)一段時(shí)間的客戶(hù)端。
從上面的特點(diǎn)我們可以發(fā)現(xiàn),對(duì)于不同類(lèi)型的使用方式,Nacos 對(duì)于健康檢查的特點(diǎn)實(shí)際都是相同的,都是由客戶(hù)端向注冊(cè)中心發(fā)送心跳,注冊(cè)中心會(huì)在連接斷開(kāi)或是心跳過(guò)期后將不健康的實(shí)例移除。
image.png

永久實(shí)例健康檢查機(jī)制

Nacos 中使用 SDK 對(duì)于永久實(shí)例的注冊(cè)實(shí)際也是使用 OpenAPI 的方式進(jìn)行注冊(cè),這樣可以保證即使是客戶(hù)端下線后也不會(huì)影響永久實(shí)例的健康檢查。
對(duì)于永久實(shí)例的的健康檢查,Nacos 采用的是注冊(cè)中心探測(cè)機(jī)制,注冊(cè)中心會(huì)在持久化服務(wù)初始化時(shí)根據(jù)客戶(hù)端選擇的協(xié)議類(lèi)型注冊(cè)探活的定時(shí)任務(wù)。Nacos 現(xiàn)在內(nèi)置提供了三種探測(cè)的協(xié)議,即 Http、TCP 以及 MySQL 。一般而言 Http 和 TCP 已經(jīng)可以涵蓋絕大多數(shù)的健康檢查場(chǎng)景。MySQL 主要用于特殊的業(yè)務(wù)場(chǎng)景,例如數(shù)據(jù)庫(kù)的主備需要通過(guò)服務(wù)名對(duì)外提供訪問(wèn),需要確定當(dāng)前訪問(wèn)數(shù)據(jù)庫(kù)是否為主庫(kù)時(shí),那么我們此時(shí)的健康檢查接口,是一個(gè)檢查數(shù)據(jù)庫(kù)是否為主庫(kù)的 MySQL 命令。
image.png
由于持久化服務(wù)的實(shí)例的在被主動(dòng)刪除前一直存在的特性,探活的定時(shí)任務(wù)會(huì)不斷探測(cè)服務(wù)的健康狀態(tài),并且將無(wú)法探測(cè)成功的實(shí)例標(biāo)記為不健康。但是有些時(shí)候會(huì)有這樣的場(chǎng)景,有些服務(wù)不希望去校驗(yàn)其健康狀態(tài),Nacos也是提供了對(duì)應(yīng)的白名單配置,用戶(hù)可以將服務(wù)配置到該白名單,那么 Nacos 會(huì)放棄對(duì)其進(jìn)行健康檢查,實(shí)例的健康狀態(tài)也始終為用戶(hù)傳入的健康狀態(tài)。

集群模式下的健康檢查機(jī)制

一個(gè)完整的注冊(cè)中心,是應(yīng)該具備高可用的特性,即我們的注冊(cè)中心是可以集群部署作為一個(gè)整體對(duì)外提供服務(wù),當(dāng)然 Nacos 也支持這樣的特性。不同于單機(jī)部署,集群部署中我們的客戶(hù)端只和其中一個(gè)注冊(cè)中心服務(wù)保持鏈接和請(qǐng)求,但是我們的服務(wù)信息需要注冊(cè)到所有的服務(wù)節(jié)點(diǎn)上,在其他客戶(hù)端從任意一個(gè)注冊(cè)中心服務(wù)獲取服務(wù)列表時(shí)始終是所有的服務(wù)列表。在這種情況下,那么 Nacos 在集群模式下又是如何對(duì)不是和自己保持心跳連接的服務(wù)進(jìn)行健康檢查的呢?
image.png
對(duì)于集群下的服務(wù),Nacos 一個(gè)服務(wù)只會(huì)被 Nacos 集群中的一個(gè)注冊(cè)中心所負(fù)責(zé),其余節(jié)點(diǎn)的服務(wù)信息只是集群副本,用于訂閱者在查詢(xún)服務(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)行健康探測(cè),在獲取到健康狀態(tài)后由當(dāng)前負(fù)責(zé)的注冊(cè)中心節(jié)點(diǎn)將健康信息同步到集群中的其他的注冊(cè)中心。
在Nacos中,服務(wù)的注冊(cè)我們從注冊(cè)方式維度實(shí)際可以分為兩大類(lèi)。第一類(lèi)通過(guò) SDK RPC 連接進(jìn)行注冊(cè),客戶(hù)端會(huì)和注冊(cè)中心保持鏈接。第二類(lèi),通過(guò) OpenAPI 進(jìn)行 IP 和端口注冊(cè)。
對(duì)于第一類(lèi),如何尋找到對(duì)其負(fù)責(zé)的注冊(cè)中心節(jié)點(diǎn)呢?聰明的你肯定想到了,只需要和注冊(cè)中心集群中的任意一臺(tái)節(jié)點(diǎn)建立聯(lián)系,那么由這個(gè)節(jié)點(diǎn)負(fù)責(zé)這個(gè)客戶(hù)端就可以了。注冊(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)建該客戶(hù)端的信息,在非負(fù)責(zé)的節(jié)點(diǎn)上,連接類(lèi)型的客戶(hù)端,會(huì)有一個(gè)續(xù)約時(shí)間的概念,在收到其他節(jié)點(diǎn)的同步信息時(shí),更新續(xù)約時(shí)間為當(dāng)前時(shí)間,如果在集群中的其他節(jié)點(diǎn)在一段時(shí)間內(nèi)沒(méi)有收到不是自己的負(fù)責(zé)的節(jié)點(diǎn)的同步信息,那么認(rèn)為此節(jié)點(diǎn)已經(jīng)不健康,從而達(dá)到對(duì)不是自己負(fù)責(zé)的節(jié)點(diǎn)健康狀態(tài)檢查。
image.png
對(duì)于第二類(lèi),方式其實(shí)也基本和第一類(lèi)一致,OpenAPI 注冊(cè)的臨時(shí)實(shí)例也是通過(guò)同步自身負(fù)責(zé)的節(jié)點(diǎn)到其他節(jié)點(diǎn)來(lái)更新其他節(jié)點(diǎn)的對(duì)應(yīng)的臨時(shí)實(shí)例的心跳時(shí)間,保證其他節(jié)點(diǎn)不會(huì)刪除或者修改此實(shí)例的健康狀態(tài)。前面我們特別特別指明了是臨時(shí)實(shí)例而沒(méi)有說(shuō)所有實(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)即可。
image.png

小結(jié)

本文從注冊(cè)中心場(chǎng)景展開(kāi),詳細(xì)介紹了 Nacos 注冊(cè)中心的健康檢查機(jī)制。在 Nacos 中,針對(duì)不同類(lèi)型的服務(wù)將會(huì)使用不同的健康檢查方式進(jìn)行實(shí)例生命周期的維護(hù),并通過(guò)前文提到的一致性協(xié)議使 Nacos 節(jié)點(diǎn)均能夠保持實(shí)例生命周期的一致。從本文開(kāi)始,我們提及了 Nacos 注冊(cè)中心集群中,實(shí)例的健康狀態(tài)和生命周期需要保持一致,因此在下文中,我們將開(kāi)始介紹 Nacos 注冊(cè)中心是如何使用 Nacos 的一致性協(xié)議,來(lái)保持?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)懲制度(簡(jiǎn)單版21篇)
健康檢測(cè)一體機(jī)

網(wǎng)址: Nacos 健康檢查機(jī)制 http://www.u1s5d6.cn/newsview139835.html

推薦資訊