數(shù)據(jù)庫監(jiān)控系統(tǒng)建設,看看運維團隊是如何實現(xiàn)的
1. 背景
數(shù)據(jù)庫監(jiān)控作為數(shù)據(jù)庫配套建設不可或缺的一環(huán),可以及時發(fā)現(xiàn)機器和數(shù)據(jù)庫性能問題,并幫助止損。伴魚早期借助開源prometheus系統(tǒng)對數(shù)據(jù)庫和機器進行監(jiān)控,來滿足我們?nèi)粘5谋O(jiān)控告警需求,但在這過程中,我們還是發(fā)現(xiàn)一些使用不太方便的地方,主要體現(xiàn)在以下幾個方面:
- 數(shù)據(jù)庫以集群為單位,集群成員的變動需要修改prometheus對應的監(jiān)控配置文件,無法自動修改
- 機器指標和數(shù)據(jù)庫指標采集分屬不同的exporter,難以集群或機器維度同時展示兩類指標
- 集群和機器告警配置差異化以及告警時間段抑制,配置不太靈活
- 日常巡檢和監(jiān)控大盤難以定制
基于以上監(jiān)控告警需求,并結合在對prometheus、阿里云數(shù)據(jù)庫監(jiān)控等一些優(yōu)秀的監(jiān)控系統(tǒng)架構調(diào)研的基礎上,設計了伴魚數(shù)據(jù)庫監(jiān)控系統(tǒng)。相比其它監(jiān)控系統(tǒng),新系統(tǒng)包含以下核心功能:
- 基于集群維度的機器和數(shù)據(jù)庫指標采集,集群成員變動,無需修改配置
- 支持集群和機器維度的機器指標和數(shù)據(jù)庫性能指標數(shù)據(jù)的同時展示
- 通過報警模版,支持報警的差異化配置
- 支持報警時間段抑制和靈活的報警策略
- 靈活定制監(jiān)控大盤,方便巡檢需求
下面從數(shù)據(jù)庫監(jiān)控整體架構詳細介紹下監(jiān)控各組件設計以及背后設計的一些想法。
2. 監(jiān)控整體架構
伴魚數(shù)據(jù)庫監(jiān)控整體架構,如下圖所示。
各組件的功能,說明如下:
- agent模塊,功能類似prometheus exporter組件,暴露metric接口,接收請求采集數(shù)據(jù)
- schedule模塊,獲取監(jiān)控任務,并根據(jù)集群名從db config service服務獲取具體的集群信息,然后按照監(jiān)控任務配置的采集時間間隔,定時到對應的agent拉取metrics
- monitor模塊,負責監(jiān)控數(shù)據(jù)存儲/查詢、數(shù)據(jù)分析和規(guī)則報警
- alarm模塊,公司內(nèi)部報警服務,支持釘釘和電話報警
- http server模塊,負責監(jiān)控任務、報警模版和報警規(guī)則的配置以及監(jiān)控數(shù)據(jù)的查詢展示
2.1 數(shù)據(jù)采集
伴魚的數(shù)據(jù)庫監(jiān)控,目前主要分數(shù)據(jù)庫服務監(jiān)控和主機監(jiān)控兩類,對應著數(shù)據(jù)采集分主機指標采集和數(shù)據(jù)庫性能指標采集兩種。監(jiān)控具體采集哪些指標,我們參照了業(yè)界一些優(yōu)秀開源監(jiān)控系統(tǒng),比如阿里云數(shù)據(jù)庫服務監(jiān)控,來采集我們的監(jiān)控指標數(shù)據(jù)。
- 主機指標,包含CPU利用率、磁盤IO使用率、磁盤空間使用率、磁盤空間使用量、機器負載和內(nèi)存使用率
- Mongodb服務指標,包含連接數(shù)、讀寫隊列長度、服務進出流量、游標數(shù)量和請求量等
- Redis服務指標,包含內(nèi)存使用率、請求數(shù)、服務進出流量、每秒失效key個數(shù)和key查找命中率等
- TiDB服務指標,通過讀取tidb自帶的prometheus獲取數(shù)據(jù),獲取的指標包含raft-store cpu、comprocessor cpu和durition等
針對具體的指標數(shù)據(jù)采集,我們設計了四種agent。其中node agent負責采集機器指標數(shù)據(jù),因為機器某些指標采集需要在本機執(zhí)行系統(tǒng)命令,所以node agent在機器初始化時部署。數(shù)據(jù)庫服務agent部署在公司內(nèi)部的k8s容器內(nèi),多副本方式,支持采集指標動態(tài)添加。比如TiDB指標的采集,如下圖所示,如果想增加某個指標采集,只需動態(tài)添加對應的指標項和查詢語句即可。
2.2 任務調(diào)度
schedule任務調(diào)度模塊負責監(jiān)控任務的調(diào)度執(zhí)行,如下圖所示。程序在啟動時加載監(jiān)控任務,在指定采集時間間隔,通過集群名稱從db config service獲取對應的集群信息(包括ip、端口和集群角色),調(diào)度對應的任務執(zhí)行數(shù)據(jù)采集。每個集群任務成功采集后,會通知monitor模塊進行報警分析。
2.3 數(shù)據(jù)存儲
監(jiān)控數(shù)據(jù)存儲我們選用了當前流行的時序數(shù)據(jù)庫InfluxDB,主要基于以下幾點考慮:
- InfluxDB部署簡單,無需任何外部依賴即可獨立部署
- 提供類似于SQL的查詢語言,接口友好,使用方便,如下圖所示
- 提供靈活的數(shù)據(jù)保存策略(Retention Policy)來設置數(shù)據(jù)的保留時間
- 高性能寫入,最新的數(shù)據(jù)都保存在內(nèi)存中,標簽允許對列進行索引實現(xiàn)快速查詢
2.4 報警規(guī)則
通過監(jiān)控任務,靈活配置數(shù)據(jù)采集時間間隔,在采集到監(jiān)控數(shù)據(jù)后,我們可以做細粒度的報警策略。報警規(guī)則如何設計,我們做了如下考慮:
- 集群報警配置應盡可能簡單
- 集群報警支持差異化配置
- 報警粒度靈活配置
基于以上要求,我們從報警模版、報警指標和報警策略三個方面設計了報警規(guī)則。
2.4.1 報警模版
報警模版由規(guī)則名稱、角色、指標、閥值和策略五個部分組成,如下圖所示。
通過服務報警模版,我們可以很方便的將報警指標和策略拼接成規(guī)則應用到各服務集群進行報警,同時還可以輕松實現(xiàn)個別集群報警的差異化配置。報警模版應用到服務集群,如下圖所示。
模版中一條規(guī)則,簡單點說,其實就是報警觸發(fā)條件。如何執(zhí)行報警,其實就是將一條規(guī)則映射成一條數(shù)據(jù)庫查詢語句,查詢滿足的條件的數(shù)據(jù)是否達到報警閥值。比如下面這條規(guī)則,簡單介紹下是如何做映射的。
首先,我們看一下監(jiān)控表中已經(jīng)采集到對應指標的監(jiān)控數(shù)據(jù),如下圖所示。
其次,集群在任務采集時,我們可以拿到具體的集群信息,包括ip、端口和角色。報警服務根據(jù)報警模版里的規(guī)則,將具體的規(guī)則映射成查詢語句,如下圖所示。
最后,把滿足報警規(guī)則的服務,按照集群、主機和角色維度報警出來,如下圖所示。
2.4.2 報警指標
報警指標可以理解為我們需要監(jiān)控的項目,比如CPU使用率、機器負載和磁盤空間等,如下圖所示。
數(shù)據(jù)指標采集項比較多,我們可以選擇我們關心的或者能快速反應服務問題的指標作為報警指標。這里的指標名稱與報警模版中的規(guī)則名稱一一對應,即將規(guī)則名稱與數(shù)據(jù)庫表及查詢條件映射起來。
2.4.3 報警策略
目前,報警策略分為兩種,如下圖所示。每次采集完數(shù)據(jù),都會通知monitor模塊觸發(fā)規(guī)則分析,檢查是否達到報警閥值。報警每觸發(fā)一次,都會檢查上一次報警時間,保證在報警時間間隔內(nèi),不會重復報警。
2分鐘內(nèi),8次(每分鐘采集4次數(shù)據(jù))中有4次滿足條件,釘釘告警
2分鐘內(nèi),8次(每分鐘采集4次數(shù)據(jù))中有4次滿足條件,釘釘和電話同時告警,配置如下圖所示
2.5 監(jiān)控數(shù)據(jù)展示
數(shù)據(jù)監(jiān)控不僅可以為我們提供準實時狀態(tài)展現(xiàn),還能幫助做故障回溯、風險預測和大盤監(jiān)控。日常問題處理和故障復盤,我們希望在一個頁面既能查看一個集群各角色的機器指標,又能看到各角色的數(shù)據(jù)庫性能指標,而不用在各個指標頁面來回跳轉(zhuǎn),如下圖所示。
同時,我們可以利用采集的監(jiān)控數(shù)據(jù),定制我們的數(shù)據(jù)庫監(jiān)控大盤。有了監(jiān)控大盤,我們可以做日常巡檢,及時發(fā)現(xiàn)性能風險,如下圖所示。
比如我們通過tidb大盤巡檢,發(fā)現(xiàn)集群延時升高,并及時將其解決,減少風險,如下圖所示
3. 總結
伴魚數(shù)據(jù)庫監(jiān)控系統(tǒng)已經(jīng)運行近半年,在這期間,日常巡檢和報警幫助我們發(fā)現(xiàn)了多起數(shù)據(jù)庫性能問題,并及時加以解決。目前,監(jiān)控系統(tǒng)還有一些待完善的地方,比如告警收斂、時序數(shù)據(jù)庫高可用等問題。未來,我們將繼續(xù)深挖監(jiān)控系統(tǒng)的潛力,為伴魚數(shù)據(jù)庫保駕護航。