成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

node服務(wù)的監(jiān)控預(yù)警系統(tǒng)架構(gòu)

ethernet / 1646人閱讀

摘要:業(yè)務(wù)量計(jì)算和數(shù)據(jù)打點(diǎn)這里提到的業(yè)務(wù)量,指的是監(jiān)控預(yù)警系統(tǒng)所關(guān)注的數(shù)據(jù)業(yè)務(wù),如內(nèi)存和利用率吞吐量和響應(yīng)時間。其中,內(nèi)存和利用率可以通過下的相關(guān)命令如來查詢,響應(yīng)時間和吞吐量則通過中間件實(shí)現(xiàn)粗略統(tǒng)計(jì)。

需求背景

目前node端的服務(wù)逐漸成熟,在不少公司內(nèi)部也開始承擔(dān)業(yè)務(wù)處理或者視圖渲染工作。不同于個人開發(fā)的簡單服務(wù)器,企業(yè)級的node服務(wù)要求更為苛刻:

高穩(wěn)定性、高可靠性、魯棒性以及直觀的監(jiān)控和報(bào)警

想象下一個存在安全隱患且沒有監(jiān)控預(yù)警系統(tǒng)的node服務(wù)在生產(chǎn)環(huán)境下運(yùn)行的場景,當(dāng)某個node實(shí)例掛掉的情況下,運(yùn)維人員或者對應(yīng)開發(fā)維護(hù)人員無法立即知曉,直到客戶或者測試人員報(bào)告bugs才開始解決問題。在這段無人處理的時間內(nèi),損失的訂單數(shù)和用戶的忠誠度和信任度將是以后無法彌補(bǔ)的,因此對于node程序的業(yè)務(wù)開發(fā)者而言,這就要求代碼嚴(yán)謹(jǐn)、異常處理完備;對于node框架的維護(hù)者而言,則需要提供完善的監(jiān)控預(yù)警系統(tǒng)。

功能

當(dāng)一個服務(wù)進(jìn)程在后端運(yùn)行時(daemon),作為開發(fā)者我們關(guān)注的信息主要有以下幾點(diǎn):

服務(wù)進(jìn)程是否正在運(yùn)行,isalive

服務(wù)進(jìn)程的內(nèi)存使用率,是否存在未回收(釋放)的內(nèi)存

服務(wù)進(jìn)程的cpu使用率,在計(jì)算量大的情況下是否需要分片處理、延時處理

服務(wù)進(jìn)程的實(shí)時響應(yīng)時間和吞吐量

而作為一個運(yùn)維人員,關(guān)注的不僅僅是node服務(wù)進(jìn)程的相關(guān)信息,還包括物理主機(jī)的使用狀況:

物理硬盤所剩存儲空間

內(nèi)存、cpu使用率

網(wǎng)絡(luò)接入是否正常

可以看出,不管是針對主機(jī)還是進(jìn)程進(jìn)行監(jiān)控,我們的關(guān)注點(diǎn)大多數(shù)是資源使用率和業(yè)務(wù)量處理能力,因此我們的監(jiān)控預(yù)警系統(tǒng)也著重實(shí)現(xiàn)這些功能。

系統(tǒng)簡易架構(gòu)

目前生產(chǎn)環(huán)境下的node服務(wù)大多采用多進(jìn)程或者cluster模式,而且為了響應(yīng)突發(fā)流量往往采用多機(jī)部署,因此監(jiān)控和預(yù)警的目標(biāo)實(shí)體就是多物理(虛擬)機(jī)下的多個子進(jìn)程。

比如,目前node服務(wù)在單機(jī)上往往采用1+n的進(jìn)程模型:所謂1,即1個主進(jìn)程;n,表示n個工作進(jìn)程,而且這些工作進(jìn)程是從主進(jìn)程上fork出來,同時根據(jù)經(jīng)驗(yàn),n的值往往等同于主機(jī)的cpu核心數(shù),充分利用其并行能力。那么,采用該種進(jìn)程模型的node服務(wù)部署在線上4臺物理機(jī)上,我們需要監(jiān)控的則是4xn個進(jìn)程,這涉及到了分布式數(shù)據(jù)同步的問題,需要尋找一種方法實(shí)現(xiàn)高效、準(zhǔn)確和簡易的數(shù)據(jù)存和讀,并且盡可能的保證這些數(shù)據(jù)的可靠性。

在這里,筆者采用了分布式數(shù)據(jù)一致系統(tǒng)ZooKeeper(下文簡寫為ZK)實(shí)現(xiàn)數(shù)據(jù)的存和讀。之所以沒有采用傳統(tǒng)的數(shù)據(jù)庫是由于讀寫表的性能,如為了防止多個進(jìn)程同時寫表造成沖突必須進(jìn)行鎖表等操作,而且讀寫硬盤的性能相對內(nèi)存讀寫較低;之所以沒有采用IPC+事件機(jī)制實(shí)現(xiàn)多進(jìn)程通信,主要是由于node提供的IPC通信機(jī)制僅限于父子進(jìn)程,對于不同主機(jī)的進(jìn)程無法進(jìn)行通信或者實(shí)現(xiàn)復(fù)雜度較高,因此也并未采用該種方式。

采用ZK來實(shí)現(xiàn)多節(jié)點(diǎn)下的數(shù)據(jù)同步,可在保證集群可靠性的基礎(chǔ)上達(dá)到數(shù)據(jù)的最終一致性,對于監(jiān)控系統(tǒng)而言,不需要時刻都精確的數(shù)據(jù),因此數(shù)據(jù)的最終一致性完全滿足系統(tǒng)的需求。ZK服務(wù)集群通過paxos算法實(shí)現(xiàn)選舉,并采用ZK獨(dú)特的算法實(shí)現(xiàn)數(shù)據(jù)在各個集群節(jié)點(diǎn)的同步,最終抽象為一個數(shù)據(jù)層。這樣ZK客戶端就可以通過訪問ZK集群的任意一個服務(wù)節(jié)點(diǎn)獲取或讀寫相同的數(shù)據(jù),用通俗的語言來形容,就是ZK客戶端看到的所有ZK服務(wù)節(jié)點(diǎn)都有相同的數(shù)據(jù)。

另外,ZK提供了一種臨時節(jié)點(diǎn),即ephemeral。該節(jié)點(diǎn)與客戶端的會話session相綁定,一旦會話超時或者連接斷開,該節(jié)點(diǎn)就會消失,并觸發(fā)對應(yīng)事件,因此利用該種特性可以設(shè)置node服務(wù)的isalive(是否存活)功能。不過,目前node社區(qū)針對ZK的客戶端還不是很完善(主要是文檔),筆者采用node-zookeeper-client模塊并且針對所有接口promise化,這樣在進(jìn)行多級znode開發(fā)時更可讀。


上圖是筆者設(shè)計(jì)的監(jiān)控預(yù)警系統(tǒng)的架構(gòu)圖,這里需要著重關(guān)注一下幾點(diǎn):

ZooKeeper部署與znode節(jié)點(diǎn)使用

單機(jī)內(nèi)部node進(jìn)程的進(jìn)程模型:1+n+1

precaution進(jìn)程的工作內(nèi)容以及與master和worker的通信方式

下面著重詳述以上幾點(diǎn)。

ZooKeeper部署與編碼細(xì)節(jié)

上節(jié)已提到,ZooKeeper抽象為一個數(shù)據(jù)一致層,它是由多個節(jié)點(diǎn)組成的存儲集群,因此在具體的線上環(huán)境下,ZK集群是由多個線上主機(jī)搭建而成,所有的數(shù)據(jù)都是存儲在內(nèi)存中,每當(dāng)對應(yīng)工作進(jìn)程的數(shù)據(jù)發(fā)生變化時則修改對應(yīng)znode節(jié)點(diǎn)的數(shù)據(jù),在具體實(shí)現(xiàn)中每個znode節(jié)點(diǎn)存儲的是json數(shù)據(jù),便于node端直接解析。

在具體的代碼中,我們需要注意的是ZK客戶端會話超時和網(wǎng)絡(luò)斷開重連的問題。默認(rèn),ZK客戶端會幫助我們完成網(wǎng)絡(luò)斷開后重連過程的簡歷,而且在重新連接的過程中會攜帶上次斷開連接的session id,這樣在session未超時的前提下仍會綁定之前的數(shù)據(jù);但是當(dāng)session超時的情況下,對應(yīng)session id的數(shù)據(jù)將會被清空,這就需要我們的自己處理這種情況,又稱作現(xiàn)場恢復(fù)。其實(shí),在監(jiān)控系統(tǒng)中,由于需要實(shí)時查詢對應(yīng)節(jié)點(diǎn)數(shù)據(jù),需要始終保持session,在設(shè)定session expire時間的情況下終究會出現(xiàn)ZK客戶端會話超時的情況,因此需要我們實(shí)現(xiàn)現(xiàn)場恢復(fù),需要注意。

進(jìn)程模型

大多數(shù)開發(fā)者為了提高node程序的并行處理能力,往往采用一個主進(jìn)程+多個工作進(jìn)程的方式處理請求,這在不需要監(jiān)控預(yù)警系統(tǒng)的前提下是可以滿足要求的。但是,隨著監(jiān)控預(yù)警功能的加入,有很多人估計(jì)會把這些功能加入到主進(jìn)程,這首先不說主進(jìn)程工作職能的混亂,最主要的是額外增加了風(fēng)險(xiǎn)性(預(yù)警系統(tǒng)的職能之一就是打點(diǎn)堆快照,并提醒開發(fā)者。因此主進(jìn)程內(nèi)執(zhí)行查詢、打點(diǎn)系統(tǒng)資源、發(fā)送郵件等工作存在可能的風(fēng)險(xiǎn))。因此為了主進(jìn)程的功能單一性和可靠性,創(chuàng)建了一個precaution進(jìn)程,該進(jìn)程與主進(jìn)程同級。

采用1+n+1模型并不會影響請求處理效率,工作進(jìn)程的職能仍是處理請求,因此新的進(jìn)程模型完全兼容之前的代碼,需要做的就是在主進(jìn)程和precaution進(jìn)程執(zhí)行的代碼中添加業(yè)務(wù)部分代碼。

通信方式

在監(jiān)控預(yù)警系統(tǒng)中,需要實(shí)現(xiàn)precaution進(jìn)程<-->master進(jìn)程、master進(jìn)程<-->worker進(jìn)程、precaution進(jìn)程<-->worker進(jìn)程的雙向通信,如打點(diǎn)內(nèi)存,需要由precaution進(jìn)程通知對應(yīng)worker進(jìn)程,worker進(jìn)行打點(diǎn)完成后發(fā)送消息給precaution進(jìn)程,precaution進(jìn)行處理后發(fā)送郵件通知。

首先,worker與master的通信走的是node提供的IPC通道,需要注意的是IPC通道只能傳輸字符串和可結(jié)構(gòu)化的對象??山Y(jié)構(gòu)化的對象可以用一個公式簡易表述:

o = JSON.parse(JSON.stringify(o))

如RegExp的實(shí)例就不是可結(jié)構(gòu)化對象。

其次,worker和precaution的通信是通過master作為橋梁實(shí)現(xiàn)的,因此其中的關(guān)節(jié)點(diǎn)就在于precaution與master的通信。

最后,precaution與master的通信采用domain socket機(jī)制實(shí)現(xiàn),這兩個進(jìn)程是只是兩個node實(shí)例而已,因此無法采用node提供的IPC機(jī)制,而進(jìn)程間通信可以采用其他方法如:命名管道、共享內(nèi)存、信號量和消息隊(duì)列等,采用這些方法實(shí)現(xiàn)固然簡單,但是缺點(diǎn)在于兩個進(jìn)程耦合度相對較高,如命名管道需要創(chuàng)建具體的管道文件并且對管道文件大小有限制。使用domain socket,最大的好處就是靈活制定通信協(xié)議,且易于擴(kuò)展。

node的net模塊提供了domain socket的通信方式,與網(wǎng)絡(luò)服務(wù)器類似,采用domain通信的服務(wù)器偵聽的不是端口而是sock文件,采用這種方式實(shí)現(xiàn)全雙工通信。

業(yè)務(wù)量計(jì)算和數(shù)據(jù)打點(diǎn)

這里提到的業(yè)務(wù)量,指的是監(jiān)控預(yù)警系統(tǒng)所關(guān)注的數(shù)據(jù)業(yè)務(wù),如內(nèi)存和cpu利用率、吞吐量(request per minute)和響應(yīng)時間。其中,內(nèi)存和cpu利用率可以通過linux下的相關(guān)命令如top來查詢,響應(yīng)時間和吞吐量則通過koa中間件實(shí)現(xiàn)粗略統(tǒng)計(jì)。不過為了方便開發(fā)者把精力集中到業(yè)務(wù)上去而非兼容底層操作系統(tǒng),建議使用pidusage模塊完成資源利用率的測量,而針對吞吐量筆者并未找到相關(guān)的工具進(jìn)行測量,僅在中間件中粗略計(jì)算得出。

在precaution進(jìn)程中,設(shè)置了兩個閾值。一個是warning值,當(dāng)使用內(nèi)存大小超過了該值則進(jìn)行日志打點(diǎn),并開始周期性的node堆內(nèi)存打點(diǎn);另一個是danger值,超過該值則進(jìn)行內(nèi)存打點(diǎn)并發(fā)送郵件提醒,根據(jù)附件中的近三個快照分析內(nèi)存。

總結(jié)

采用上述監(jiān)控預(yù)警架構(gòu),可以有效的實(shí)現(xiàn)多節(jié)點(diǎn)下多進(jìn)程的監(jiān)控,在確保進(jìn)程可靠性的基礎(chǔ)上完成侵入性較小的、安全性較高的、可擴(kuò)展性強(qiáng)的實(shí)現(xiàn)。以后不管是臨時擴(kuò)張主機(jī)節(jié)點(diǎn)還是更改子進(jìn)程數(shù)量,都可以瞬時在UI界面上直觀體現(xiàn),如

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/81081.html

相關(guān)文章

  • 這么多監(jiān)控組件,總有一款適合你

    摘要:典型實(shí)現(xiàn)不同的監(jiān)控模塊,側(cè)重于不同領(lǐng)域,有著不同的職責(zé)。指標(biāo)收集方面,支持多樣化的組件將被優(yōu)先下使用。以上談了這么多,僅僅是聊了一下收集方面而已。 更多文章,請移步微信公眾號《小姐姐味道》 mp原文 https://mp.weixin.qq.com/s?__...監(jiān)控是分布式系統(tǒng)的必備組件,能夠起到提前預(yù)警、問題排查、評估決策等功效,乃行走江湖、居家必備之良品。 監(jiān)控系統(tǒng)概要 功能劃分...

    simon_chen 評論0 收藏0
  • 這么多監(jiān)控組件,總有一款適合你

    摘要:典型實(shí)現(xiàn)不同的監(jiān)控模塊,側(cè)重于不同領(lǐng)域,有著不同的職責(zé)。指標(biāo)收集方面,支持多樣化的組件將被優(yōu)先下使用。以上談了這么多,僅僅是聊了一下收集方面而已。 更多文章,請移步微信公眾號《小姐姐味道》 mp原文 https://mp.weixin.qq.com/s?__...監(jiān)控是分布式系統(tǒng)的必備組件,能夠起到提前預(yù)警、問題排查、評估決策等功效,乃行走江湖、居家必備之良品。 監(jiān)控系統(tǒng)概要 功能劃分...

    wpw 評論0 收藏0
  • 雷神 Thor —— TiDB 自動化運(yùn)維平臺

    摘要:相當(dāng)于分布式數(shù)據(jù)庫的大腦,一方面負(fù)責(zé)收集和維護(hù)數(shù)據(jù)在各個節(jié)點(diǎn)的分布情況,另一方面承擔(dān)調(diào)度器的角色,根據(jù)數(shù)據(jù)分布狀況以及各個存儲節(jié)點(diǎn)的負(fù)載來采取合適的調(diào)度策略,維持整個系統(tǒng)的平衡與穩(wěn)定。原文鏈接雷神自動化運(yùn)維平臺 作者:瞿鍇,同程藝龍資深 DBA 背景介紹 隨著互聯(lián)網(wǎng)的飛速發(fā)展,業(yè)務(wù)量可能在短短的時間內(nèi)爆發(fā)式地增長,對應(yīng)的數(shù)據(jù)量可能快速地從幾百 GB 漲到幾百個 TB,傳統(tǒng)的單機(jī)數(shù)據(jù)庫提...

    RayKr 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<