您好,登錄后才能下訂單哦!
服務(wù)心跳機(jī)制主要用于確認(rèn)服務(wù)的存活狀態(tài),UAVStack的心跳數(shù)據(jù)還負(fù)責(zé)上報(bào)節(jié)點(diǎn)的容器及進(jìn)程監(jiān)控?cái)?shù)據(jù),支持在前端實(shí)時(shí)查看應(yīng)用容器和進(jìn)程的運(yùn)行狀態(tài),并根據(jù)這些數(shù)據(jù)對(duì)容器和進(jìn)程做出預(yù)警。
在微服務(wù)架構(gòu)中,服務(wù)心跳是一個(gè)簡單但非常重要的機(jī)制,用于確認(rèn)微服務(wù)的存活狀態(tài)。UAVStack中的心跳是一個(gè)Http請(qǐng)求,MonitorAgent(以下簡稱MA)通過定時(shí)向HealthManager(以下簡稱HM)發(fā)送一個(gè)帶有特定報(bào)文格式的Http請(qǐng)求完成一次心跳的發(fā)送過程。心跳報(bào)文含有發(fā)送時(shí)的時(shí)間戳,用于更新HM端的數(shù)據(jù)狀態(tài)。
與普通的心跳不同,UAVStack中的心跳還負(fù)責(zé)上送MA端的應(yīng)用容器和進(jìn)程監(jiān)控?cái)?shù)據(jù)。每次發(fā)送心跳的時(shí)候,在MA端會(huì)有定時(shí)任務(wù)去收集MA所在的應(yīng)用容器心跳的基本信息,及應(yīng)用容器上的進(jìn)程數(shù)據(jù),隨著心跳數(shù)據(jù)包一起上送。
本文將首先介紹UAVStack的基礎(chǔ)心跳機(jī)制,之后對(duì)應(yīng)用容器、進(jìn)程的數(shù)據(jù)采集做詳細(xì)說明。
心跳的實(shí)現(xiàn)有很多種方式,心跳的發(fā)起可以由客戶端發(fā)起也可以由服務(wù)端發(fā)起,只需完成確認(rèn)存活這一基本功能即可。但是在一般的實(shí)現(xiàn)中,我們更傾向于客戶端主動(dòng)向服務(wù)端進(jìn)行報(bào)告,因?yàn)楫?dāng)客戶端逐漸增加,單純通過服務(wù)端的輪詢會(huì)導(dǎo)致服務(wù)端的壓力,影響性能。
在UAVStack的實(shí)現(xiàn)中,我們也采用了這樣的方式,通過客戶端(MA)主動(dòng)向服務(wù)端(HM)發(fā)送心跳信息,告知HM自身的存活情況。
一次心跳由UAV的MA和HM共同完成:
MA定時(shí)生成心跳數(shù)據(jù),攜帶MA節(jié)點(diǎn)的應(yīng)用容器信息、進(jìn)程信息以及服務(wù)信息,通過Http請(qǐng)求上報(bào)給HM;
HM負(fù)責(zé)將接收到的心跳數(shù)據(jù)存入Redis緩存,并定時(shí)掃描心跳數(shù)據(jù),確認(rèn)節(jié)點(diǎn)的存活狀態(tài)。對(duì)于隨同的應(yīng)用容器等監(jiān)控信息,會(huì)在Redis進(jìn)行暫存,后續(xù)隨著HM的定時(shí)任務(wù)最終存入OpenTSDB進(jìn)行落盤。整體的架構(gòu)如下所示:
心跳服務(wù)主要流程如上圖所示,其邏輯有以下幾步:
1)MA的定時(shí)心跳任務(wù)生成一個(gè)空心跳數(shù)據(jù),將心跳數(shù)據(jù)交給MA端的容器、進(jìn)程數(shù)據(jù)采集任務(wù)。
2)MA端的容器、進(jìn)程數(shù)據(jù)采集任務(wù)負(fù)責(zé)產(chǎn)生心跳數(shù)據(jù)的時(shí)間戳、采集節(jié)點(diǎn)的應(yīng)用容器、進(jìn)程監(jiān)控?cái)?shù)據(jù)、節(jié)點(diǎn)的基本信息、節(jié)點(diǎn)的可用服務(wù)信息等。經(jīng)過以上過程之后,心跳數(shù)據(jù)將包含以下內(nèi)容:
最后將心跳數(shù)據(jù)發(fā)送給HM。
3)HM端在接收到心跳數(shù)據(jù)之后,將其存入自身的Redis緩存。使用上報(bào)數(shù)據(jù)中的服務(wù)信息更新Redis中的服務(wù)狀態(tài),用于服務(wù)發(fā)現(xiàn)請(qǐng)求。
4)HM端在啟動(dòng)心跳接收服務(wù)時(shí),會(huì)同時(shí)啟動(dòng)心跳檢查任務(wù)。這個(gè)任務(wù)會(huì)定時(shí)掃描Redis中的心跳數(shù)據(jù),根據(jù)當(dāng)前系統(tǒng)時(shí)間與心跳時(shí)間戳的差,判斷心跳節(jié)點(diǎn)的存活狀態(tài),更新節(jié)點(diǎn)的狀態(tài),并對(duì)于過期的節(jié)點(diǎn)做刪除處理。
UAV的心跳數(shù)據(jù)除了完成心跳功能之外,還要上報(bào)節(jié)點(diǎn)的應(yīng)用容器及進(jìn)程的監(jiān)控?cái)?shù)據(jù)。
將應(yīng)用容器與進(jìn)程數(shù)據(jù)通過Http方式上報(bào)是為了保證應(yīng)用容器監(jiān)控?cái)?shù)據(jù)與應(yīng)用監(jiān)控?cái)?shù)據(jù)的隔離,通過不同方式的上送可以保證在MQ服務(wù)不能使用時(shí)不影響容器與進(jìn)程數(shù)據(jù)的采集。
本節(jié)將集中說明這些數(shù)據(jù)的采集細(xì)節(jié)。
應(yīng)用容器的數(shù)據(jù)分為兩部分:
其一是容器的基本信息,即節(jié)點(diǎn)的ID,主機(jī)名,系統(tǒng)信息和JVM信息等;
另一部分是一些簡單的實(shí)時(shí)監(jiān)控采集數(shù)據(jù),包括CPU的負(fù)載、內(nèi)存占用情況和磁盤占用情況等。這些數(shù)據(jù)在每次上報(bào)心跳數(shù)據(jù)的時(shí)候會(huì)分別從以下數(shù)據(jù)源實(shí)時(shí)采集:
不同于應(yīng)用容器數(shù)據(jù)采集,進(jìn)程的數(shù)據(jù)并不是在心跳進(jìn)程中進(jìn)行采集的,而是由專門的Feature負(fù)責(zé)。在Feature中將進(jìn)程數(shù)據(jù)采集進(jìn)一步分解成進(jìn)程端口流量數(shù)據(jù)采集以及其他數(shù)據(jù)采集。這兩者均由定時(shí)任務(wù)完成,互相協(xié)作,最終由進(jìn)程探測(cè)的定時(shí)任務(wù)更新心跳客戶端的進(jìn)程數(shù)據(jù)。
這種使用多個(gè)采集任務(wù)分別采集的方式可以針對(duì)不同的數(shù)據(jù)進(jìn)行不同頻度的采集。如對(duì)于網(wǎng)絡(luò)端口流量的采集,就可以以更長的周期進(jìn)行,以減低數(shù)據(jù)采集帶來的性能損耗。同時(shí),不同的任務(wù)也可以使用不同的線程執(zhí)行,提升執(zhí)行的效率。
進(jìn)程數(shù)據(jù)采集流程大致如下圖所示:
進(jìn)程端口流量探測(cè)定時(shí)任務(wù)每隔一定時(shí)間讀取本地變量端口列表,獲取要采集的端口號(hào)。
之后對(duì)于Windows環(huán)境,采用JPcap獲取網(wǎng)卡對(duì)象,并在網(wǎng)卡上設(shè)置tcp過濾器來統(tǒng)計(jì)一段時(shí)間內(nèi)的端口流量。對(duì)于Linux環(huán)境則是直接通過調(diào)用Python腳本打開socket,分析流過的數(shù)據(jù)包獲得。
獲得全部端口上的流量數(shù)據(jù)后,任務(wù)會(huì)將采集數(shù)據(jù)交給進(jìn)程數(shù)據(jù)采集任務(wù),更新其本地變量,同時(shí)設(shè)置本次采集的時(shí)間戳。
進(jìn)程探測(cè)定時(shí)任務(wù)由一系列子任務(wù)構(gòu)成,在任務(wù)開始的時(shí)候,會(huì)先準(zhǔn)備好一個(gè)Map結(jié)構(gòu)的數(shù)據(jù)容器,用于存放采集到的進(jìn)程信息,每個(gè)進(jìn)程由pid區(qū)分,作為Map的key。
任務(wù)會(huì)先掃描所有的進(jìn)程,獲取pid和進(jìn)程的端口。掃描到的進(jìn)程會(huì)經(jīng)過一個(gè)過濾器排除不需要采集數(shù)據(jù)的進(jìn)程,之后正式采集每個(gè)進(jìn)程上的數(shù)據(jù)。
對(duì)于每一個(gè)進(jìn)程,會(huì)通過運(yùn)行系統(tǒng)命令采集連接數(shù)、CPU、內(nèi)存占用,磁盤讀寫數(shù)據(jù)以及網(wǎng)絡(luò)端口流量數(shù)據(jù)。其中網(wǎng)絡(luò)端口流量數(shù)據(jù)是由端口流量探測(cè)任務(wù)采集并更新的本地變量,而進(jìn)程探測(cè)任務(wù)也會(huì)將掃描到的最新的端口列表更新到端口流量探測(cè)任務(wù)的本地變量。
如果應(yīng)用是部署在容器上的,則還會(huì)有對(duì)應(yīng)的容器信息采集。最后進(jìn)程探測(cè)任務(wù)會(huì)將采集到的進(jìn)程數(shù)據(jù)更新到心跳客戶端的本地變量,隨著每次心跳數(shù)據(jù)的生成被一起采集并上報(bào)。
進(jìn)程數(shù)據(jù)的采集分別來自以下數(shù)據(jù)源:
心跳數(shù)據(jù)和容器數(shù)據(jù)在通過Http上送到HM端之后,會(huì)由HM端對(duì)應(yīng)的服務(wù)進(jìn)行處理。
HM在啟動(dòng)時(shí)會(huì)啟動(dòng)自己的心跳客戶端,負(fù)責(zé)發(fā)送本機(jī)的心跳數(shù)據(jù)和采集HM所在容器的監(jiān)控?cái)?shù)據(jù)。同時(shí)還會(huì)啟動(dòng)一個(gè)心跳服務(wù),負(fù)責(zé)接收處理所有上送的心跳和容器數(shù)據(jù)信息。
心跳服務(wù)在收到心跳數(shù)據(jù)請(qǐng)求后,會(huì)根據(jù)HM的配置,判定當(dāng)前的HM是不是Master節(jié)點(diǎn)。如果HM是Master節(jié)點(diǎn),心跳服務(wù)會(huì)從Http攜帶的報(bào)文中拿出上報(bào)的數(shù)據(jù),取得上報(bào)節(jié)點(diǎn)中的可用服務(wù)用于更新服務(wù)發(fā)現(xiàn)信息,之后將數(shù)據(jù)存入后端的Redis緩存中;如果不是Master節(jié)點(diǎn),則會(huì)將數(shù)據(jù)移交至本機(jī)的心跳客戶端,由其下次發(fā)送心跳時(shí)一起上送。
這樣的設(shè)計(jì)是考慮到大規(guī)模監(jiān)控時(shí)會(huì)有跨機(jī)房的情況存在,此時(shí)各監(jiān)控節(jié)點(diǎn)往往不在同一個(gè)網(wǎng)段內(nèi),通過將同一個(gè)網(wǎng)段內(nèi)的機(jī)器上交到邊界的“網(wǎng)關(guān)”統(tǒng)一上交可解決這一問題。此時(shí)的HM即充當(dāng)著“網(wǎng)關(guān)”這一角色。
HM在啟動(dòng)的時(shí)候同時(shí)還會(huì)啟動(dòng)一個(gè)定時(shí)任務(wù),這個(gè)任務(wù)負(fù)責(zé)處理各節(jié)點(diǎn)的存活狀況。任務(wù)定時(shí)從Redis中讀取全部心跳數(shù)據(jù),依次檢查上送心跳數(shù)據(jù)中的客戶端時(shí)間戳與當(dāng)前系統(tǒng)時(shí)間戳的差值。
當(dāng)時(shí)間超過一定的上送時(shí)間間隔之后,更改對(duì)應(yīng)的節(jié)點(diǎn)存活狀態(tài)。當(dāng)超過一倍上送時(shí)間間隔,意味節(jié)點(diǎn)可能死亡,處于dying狀態(tài)。當(dāng)超過兩倍時(shí)間間隔時(shí),意味著節(jié)點(diǎn)已經(jīng)死亡。當(dāng)超過三倍時(shí)間間隔時(shí),心跳服務(wù)會(huì)刪除該節(jié)點(diǎn)的緩存記錄。
隨心跳一起上報(bào)的容器和進(jìn)程數(shù)據(jù)會(huì)隨著心跳數(shù)據(jù)一同被存入Redis中,后續(xù)由HM的其他定時(shí)任務(wù)讀取并發(fā)送給預(yù)警中心進(jìn)行處理,最終監(jiān)控指標(biāo)被格式化成特定的結(jié)構(gòu)存入OpenTSDB。
同時(shí)采集的容器數(shù)據(jù)和進(jìn)程數(shù)據(jù)會(huì)提供前端AppHub查看界面,如圖所示:
點(diǎn)擊頁面上的每一個(gè)節(jié)點(diǎn),可以查看詳細(xì)的節(jié)點(diǎn)信息,包括節(jié)點(diǎn)的操作系統(tǒng)信息、JVM信息、提供的服務(wù)和安裝的Feture等等。這些也就是前文所說的隨心跳數(shù)據(jù)上報(bào)的那部分信息。如圖所示:
心跳是微服務(wù)架構(gòu)基礎(chǔ)但重要的機(jī)制,通過定時(shí)發(fā)送心跳數(shù)據(jù),MA節(jié)點(diǎn)報(bào)告了自身的存活狀態(tài),使得HM能夠知曉當(dāng)前系統(tǒng)的運(yùn)行狀態(tài)。
同時(shí),UAVStack的心跳數(shù)據(jù)還同時(shí)負(fù)責(zé)上報(bào)節(jié)點(diǎn)的容器及進(jìn)程監(jiān)控?cái)?shù)據(jù),隨著這些數(shù)據(jù)的上報(bào),HM可以對(duì)監(jiān)控的容器和進(jìn)程做出預(yù)警,也能夠在前端實(shí)時(shí)看到應(yīng)用容器和進(jìn)程的運(yùn)行狀態(tài)。
官方網(wǎng)站:https://uavorg.github.io/main/
開源地址:https://github.com/uavorg
作者:張明明
來源:宜信技術(shù)學(xué)院
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。