周 浩,蔡永健,顧丹鵬,陳肖勇
(1.中國電建集團華東勘測設計研究院有限公司,浙江 杭州 311100;2.浙江華東工程數(shù)字技術有限公司)
最新的DB-Engines 中,MySQL 以1211.53 分高居第二,在開源的關數(shù)據(jù)庫當中排名第一[1]。但是MySQL 也有不少缺點,隨著數(shù)據(jù)不斷增加,MySQL 的InnoDb 引擎[2]在執(zhí)行SQL 時,性能會顯著下降,根據(jù)B+樹[3]的特點,MySQL 的最大單表存儲約在1000 萬。開發(fā)人員濫用SQL 和索引造成MySQL 的性能急劇下降,在高并發(fā)的環(huán)境可能造成服務雪崩的災難性故障。為了避免故障,MySQL運維工程師需要一套完整的方案提前預警。Prometheus是一個開源的監(jiān)測和預警工具集,能夠提供豐富的度量指標、高度可定制的云原生監(jiān)控系統(tǒng)。它能夠?qū)崟r采集MySQL 的關鍵指標。Grafana是一款開源數(shù)據(jù)可視化工具,可以完美集成Prometheus API,做數(shù)據(jù)監(jiān)控和數(shù)據(jù)統(tǒng)計,支持告警功能,根據(jù)用戶自定義的查詢規(guī)則制定不同的告警策略,讓MySQL DBA 實時的監(jiān)控數(shù)據(jù)庫運行狀態(tài),提前給上層業(yè)務發(fā)出風險預警;同時也能夠讓開發(fā)工程師充分了解SQL 的運行狀態(tài),從而調(diào)整不同的策略,來糾正容易引發(fā)故障的SQL,保證項目的穩(wěn)定。
Prometheus 是一個高度可定制的云原生監(jiān)控系統(tǒng)[4],為現(xiàn)代DevOps[5]工作提供關鍵組件,監(jiān)視云原生應用,與Kubernetes[6]完美協(xié)同,能夠抓取或拉取應用程序的時間序列數(shù)據(jù)。
Prometheus 將數(shù)據(jù)存儲成時間序列,每個時序列數(shù)據(jù)都具有帶時間戳的數(shù)據(jù)流,每一個數(shù)據(jù)流都由其指標(Metric)和一組鍵值對的標簽唯一標識。它提供Counter,Gauge,Histogram,Summary 四種指標類型。Counter 是一個累加器,隨著時間不停累加;Gauge 可以上下浮動;Histogram 表示一段時間內(nèi)指定區(qū)間的數(shù)據(jù)的分組統(tǒng)計;Summary 能夠提供樣本的累加,求和以及求百分比的功能。在Prometheus 中每一個提供HTTP的服務都稱之為一個實例(Instance)。而有相同實例集合可以稱之為作業(yè)(Job)。Exporter 是目標監(jiān)控系統(tǒng)收集的數(shù)據(jù)轉(zhuǎn)化為對應的文本格式,并且對外提供HTTP協(xié)議的接口,供Prometheus定期采集數(shù)據(jù)。
易管理性,Prometheus 只有單獨的一個二進制文件,不存在任何第三方依賴,基于Pull模型的架構可以在任何環(huán)境搭建監(jiān)控系統(tǒng)。
靈活的數(shù)據(jù)模型,監(jiān)控數(shù)據(jù)是由值、時間戳和標簽表組成的,監(jiān)控數(shù)據(jù)完全記錄在標簽表里。
Prometheus支持監(jiān)控數(shù)據(jù)采集階段對數(shù)據(jù)的標簽表鏡像修改,使其具備強大的擴展能力。
良好的性能,強大的查詢能力。
Prometheus 官方提供的在硬件資源滿足情況下,單個實例Prometheus可以處理數(shù)以百萬計的監(jiān)控指標和數(shù)十萬個數(shù)據(jù)點,并且內(nèi)置了強大的PromQL,提供了大量數(shù)據(jù)計算函數(shù),應用于數(shù)據(jù)可視化及告警。
健全的生態(tài),Prometheus 可以迅速在應用程序里集成,目前已支持Java、JMX、Python、Go、MySQL 等多種客戶端SDK。
Grafana 是一個跨平臺的開源的度量分析和可視化工具,它可以將采集的監(jiān)控數(shù)據(jù)進行可視化的展示,并且及時通知監(jiān)控的告警信息。
DashBoard,儀表盤。Row,DashBoard 的基本組成單元,一個DashBoard 可以包含一個或者多個Row。Panel 是Row 展示的信息,支持表格,列表,熱圖等多種方式。Query Editor 是查詢編輯器,用來指定獲取數(shù)據(jù)。支持PromQL查詢。
Grafana支持多種客戶端圖表,支持熱圖,折線圖,柱狀圖,餅狀圖,圖表等多種展示方式,支持多種不同的時間序列存儲。每個數(shù)據(jù)源都有一套特定的查詢編輯器與Prometheus完美協(xié)同?;趦x表盤可以添加豐富的報警規(guī)則,以及報警策略。Grafana 可以支持企業(yè)郵箱,短信,釘釘?shù)韧扑凸ぞ邅韺崿F(xiàn)報警。
Linux操作系統(tǒng)自身不支持Prometheus,但Prometheus官方提供了NodeExporter 來實現(xiàn)對Linux 操作系統(tǒng)主機的監(jiān)控數(shù)據(jù)采集。如圖1 所示,它可以提供操作系統(tǒng)層的幾乎所有監(jiān)控,例如CPU 利用率,內(nèi)存,磁盤空間,I/O,以及網(wǎng)絡帶寬。并且它還提供很多內(nèi)核公開的額外監(jiān)控指標,從負載均衡到主板溫度等等。Node Exporter 通過腳本從Linux 內(nèi)核采集到監(jiān)控數(shù)據(jù),Prometheus 通過輪詢策略,不斷從Linux Node Exporter 拉取數(shù)據(jù)存儲到時序數(shù)據(jù)庫中,供給Grafana去展示。
圖1 LinuxOS監(jiān)控原理圖
MySQL 也不提供端點,Prometheus 無法直接從MySQL Sever獲取監(jiān)控指標。MySQL Server Exporter恰好解決這個問題。如圖2 所示,它和Node Exporter的工作原理類似,通過底層應用程序從目標應用程序中提取監(jiān)控指標,然后通過RESTAPI 公開這些指標,提供給Prometheus采集。
圖2 MySQL Sever監(jiān)控原理圖
工程數(shù)據(jù)中心項目是基于SpringCloud 為基礎組件,運用微服務思想設計的一套對工程數(shù)據(jù)的挖掘,分析的數(shù)據(jù)中臺產(chǎn)品。
根據(jù)第三章的工作原理,首先需要將Node Exporter下載安裝到主機服務器。解壓啟動Node Exporter以后將Node Exporter 服務添加為開機啟動,然后將Node Exporter 與Prometheus 進行關聯(lián)。在Prometheus 主機目錄中找到配置文件,修改staticconfigs配置就可以采集nodeexporter提供的數(shù)據(jù)。Static config配置如下:
node_cpu_seconds_total是CPU的信息的重要采集指標。它是一個Counter類型的指標,用來標識每個核下面的各個模式的占用時間。node_meory_Memtotal_bytes是內(nèi)存數(shù)據(jù)監(jiān)控的重要指標,這些監(jiān)控數(shù)據(jù)來源于Linux 系統(tǒng)中的/proc/meminfo 文件。磁盤數(shù)據(jù)的主要指標是node_disk_read_time_seconds_total,它來源于Linux 系統(tǒng)中的/proc/disktats 文件。文件的監(jiān)控數(shù)據(jù)metric 都是以“node_filesytem_”開始,數(shù)據(jù)類型都為Gauge 類型。網(wǎng)絡相關監(jiān)控數(shù)據(jù)的所有“metric”都以“node_work”開始,可分為發(fā)送和監(jiān)控兩類。如圖3 所示,通過Grafana 可以完成對主機的CPU,內(nèi)存,文件,網(wǎng)絡等核心指標的監(jiān)控。
圖3 主機監(jiān)控圖
為了獲取MySQL Server 自身的監(jiān)控數(shù)據(jù),需要使用MySQL Exporter,然后將Prometheus 與MySQL Exporter 進行關聯(lián),修改Prometheus 的啟動配置,添加MySQL Exporter的targets,配置如下。
MySQL Exporter 啟動以后,Prometheus 就可以采集Metric 指標。MySQL 的查詢吞吐量,查詢執(zhí)行性能,連接和緩沖池使用是其重要的監(jiān)控指標。MySQL內(nèi)部提供一個Questions 的內(nèi)部計數(shù)器,對應監(jiān)控指標為mysql_global_status_questions,用來描述查詢吞吐量。Slow queries 可以用做慢查詢的監(jiān)控,當SQL執(zhí)行時間超過long_query_time 參數(shù)時,計數(shù)器就會增加,對應的指標mysql_globals_status_slow_queries也會增加。為了防止MySQL 過載運行,DBA 需要根據(jù)業(yè)務進行評估設置合理的客戶端連接的數(shù)量。MySQL 啟動的時候根據(jù)my.cnf 文件的max_connections 設置最大連接數(shù),也可以根據(jù)mysql_global_variables_max_connections 查看當前最大的連接數(shù),mysql_global_status_threads_connected 記錄已存在的連接數(shù),DBA 根據(jù)上述連接數(shù)的指標來監(jiān)控MySQL的連接。InnoDB是MySQL的默認引擎,使用緩沖池來緩存表和索引的數(shù)據(jù),可以通過mysql_global_status_innodb指標進行查看InnoDB 的運行指標。上述指標采集完成以后,如圖4所示,可以通過Grafana查看MySQL Server的監(jiān)控。
圖4 數(shù)據(jù)庫監(jiān)控圖
本文介紹了通過Prometheus 實現(xiàn)對MySQL 主機和MySQL Server 的監(jiān)控實踐,為企業(yè)的數(shù)據(jù)存儲提供技術保障。數(shù)據(jù)庫的監(jiān)控,在微服務的監(jiān)控體系下僅僅是一小部分的內(nèi)容,因此,完善整個微服務自上而下的全鏈路監(jiān)控是保障系統(tǒng)穩(wěn)定和用戶體驗必不可少的措施,也是我今后探索的方向。