京東MySQL監(jiān)控之Zabbix優(yōu)化、自動(dòng)化
隨著京東業(yè)務(wù)的飛速發(fā)展, MySQL數(shù)據(jù)庫(kù)的使用更加普及、服務(wù)器量級(jí)飛速增長(zhǎng),這對(duì)京東MySQL DBA團(tuán)隊(duì)的要求也越來越高。監(jiān)控系統(tǒng)為數(shù)據(jù)庫(kù)管理和維護(hù)提供了精確的數(shù)據(jù)依據(jù),是數(shù)據(jù)庫(kù)運(yùn)維人員的千里眼和順風(fēng)耳。
準(zhǔn)確、及時(shí)、有效的監(jiān)控,能夠使運(yùn)維人員對(duì)生產(chǎn)服務(wù)系統(tǒng)運(yùn)行情況了如指掌。通過分析獲得的監(jiān)控信息,判斷被監(jiān)控?cái)?shù)據(jù)庫(kù)的運(yùn)行狀態(tài),對(duì)可能出現(xiàn)的問題進(jìn)行預(yù)測(cè),可以及時(shí)制定出適當(dāng)?shù)膬?yōu)化方案,從而保證整個(gè)系統(tǒng)正常、高效地運(yùn)行。這也就在很大程度上保證了數(shù)據(jù)庫(kù)的安全性,避免了一些不必要的損失。所以,我們有必要對(duì)Zabbix系統(tǒng)有更加深刻的認(rèn)識(shí)和理解。
一、Zabbix功能簡(jiǎn)介
zabbix是一個(gè)基于WEB界面的提供分布式系統(tǒng)監(jiān)視以及網(wǎng)絡(luò)監(jiān)視功能的企業(yè)級(jí)的開源解決方案。zabbix能監(jiān)視各種網(wǎng)絡(luò)參數(shù),保證服務(wù)器系統(tǒng)的安全運(yùn)營(yíng);并提供靈活的通知機(jī)制以讓系統(tǒng)管理員快速定位/解決存在的各種問題。這是百度百科上對(duì)zabbix上的一段定義,市面上的監(jiān)控軟件很多,為什么選擇zabbix呢?我們來看一下它的幾個(gè)特點(diǎn):
1、自動(dòng)發(fā)現(xiàn)服務(wù)器和網(wǎng)絡(luò)設(shè)備。
這功能有點(diǎn)雞肋,在多種應(yīng)用、多種設(shè)備混合場(chǎng)景下不實(shí)用,給zabbix整體運(yùn)維管理帶來不便。這在實(shí)際使用中也存在各種問題,特別是在設(shè)備種類繁多、數(shù)量較大的情況下,不建議使用這個(gè)功能,zabbix監(jiān)控添加設(shè)備結(jié)合CMDB來完成,這樣定位設(shè)備用途和添加模板將會(huì)更加準(zhǔn)確;
2、底層自動(dòng)發(fā)現(xiàn)。
這點(diǎn)很方便實(shí)用,比如自帶的自動(dòng)發(fā)現(xiàn)系統(tǒng)分區(qū)、自動(dòng)發(fā)現(xiàn)多網(wǎng)卡等。這個(gè)功能也是可以自定義的,比如監(jiān)控一臺(tái)主機(jī)上的MySQL多實(shí)例服務(wù),通過這個(gè)功能可以輕松搞定;
3、分布式的監(jiān)控體系和集中式的web管理。
zabbix支持主動(dòng)監(jiān)控和被動(dòng)監(jiān)控模式(模式是相對(duì)于客戶端來說的,主動(dòng)推監(jiān)控?cái)?shù)據(jù)給服務(wù)器端或是服務(wù)器端來拉取監(jiān)控?cái)?shù)據(jù)。建議使用主動(dòng)模式,以便減輕服務(wù)器端壓力), 并且可以實(shí)現(xiàn)秒級(jí)監(jiān)控,這點(diǎn)是一些監(jiān)控軟件達(dá)不到的,但對(duì)重要業(yè)務(wù)來說,這點(diǎn)很重要;
4、支持范圍廣。
支持監(jiān)控多種設(shè)備以及目前市面常見的各種OS、服務(wù)、日志等,可以使用自帶的agent監(jiān)控,也有無agent監(jiān)控等多種監(jiān)控方法,如SNMP;
5、靈活的監(jiān)控項(xiàng)設(shè)置。
zabbix本身已經(jīng)支持很多常見的監(jiān)控項(xiàng),用戶也可以自己寫腳本來靈活自定義監(jiān)控項(xiàng),可以靈活組合多項(xiàng)報(bào)警閾值來準(zhǔn)確報(bào)警,如監(jiān)控硬盤的報(bào)警閾值可以設(shè)置為達(dá)到硬盤空間80%并且剩余空間低于50G時(shí)報(bào)警;
6、高水平的業(yè)務(wù)視圖監(jiān)控資源,監(jiān)控情況展示方面可以垂直、水平對(duì)比展示。
比如一套數(shù)據(jù)庫(kù)的分片,可以把所有主庫(kù)的某個(gè)性能指標(biāo)做在一個(gè)Graphs中,可以方便對(duì)比各個(gè)主庫(kù)的負(fù)載情況是否均衡。也可以將多個(gè)Graphs做成一個(gè)Screens,然后在一個(gè)Screens中可以看到多種性能指標(biāo)的各種情況,方便直觀的進(jìn)行對(duì)比;
7、靈活的用戶權(quán)限設(shè)置。
支持自定義事件和郵件發(fā)送,也支持報(bào)警升級(jí)及日志審計(jì);
8、基于zabbix報(bào)警的故障自愈。
Zabbix具有規(guī)范化的故障處理流程,對(duì)報(bào)警進(jìn)行分級(jí)、分類,可以自動(dòng)處理一些低級(jí)別、固化處理方法的故障,以達(dá)到快速恢復(fù)故障的效果。這點(diǎn)很重要,做的好可以***限度的保證業(yè)務(wù)的可用性穩(wěn)定性,降低人為操作失誤風(fēng)險(xiǎn)以及人員成本;
9、強(qiáng)悍的內(nèi)置API。
幾乎所有的zabbix服務(wù)器端web頁(yè)面配置操作,都可以通過他自身的API來完成,用戶可以非常方便地對(duì)它進(jìn)行二次開發(fā),以滿足自己的自動(dòng)化運(yùn)維需求。
Zabbix***的一個(gè)缺點(diǎn)應(yīng)該就是沒有合并報(bào)警這個(gè)功能,在極端的情況下會(huì)出現(xiàn)報(bào)警風(fēng)暴。不過很多監(jiān)控軟件應(yīng)該也沒有實(shí)現(xiàn)這個(gè)功能,用戶可以通過對(duì)它進(jìn)行二次開發(fā),以實(shí)現(xiàn)合并報(bào)警的效果。
二、Zabbix的優(yōu)化
有不少企業(yè)使用zabbix監(jiān)控的設(shè)備數(shù)量達(dá)到一兩百臺(tái),運(yùn)行半年后性能極差,打開監(jiān)控圖需要很長(zhǎng)時(shí)間,甚至打不開。這個(gè)問題比較常見,主要是因?yàn)闆]有對(duì)zabbix做到合理的規(guī)劃和優(yōu)化。如果能對(duì)zabbix做出合理的優(yōu)化及架構(gòu)上的規(guī)劃,zabbix監(jiān)控幾萬臺(tái)設(shè)備還是很輕松的。
1、配置文件參數(shù)的優(yōu)化
對(duì)于較大量級(jí)、海量設(shè)備的監(jiān)控需要對(duì)zabbix相關(guān)參數(shù)進(jìn)行調(diào)整,主要包含進(jìn)程數(shù)量、緩存大小、超時(shí)時(shí)間三個(gè)方面,根據(jù)實(shí)際監(jiān)控情況對(duì)zabbix自身的參數(shù)進(jìn)行調(diào)整,禁用掉如VMware、Java等方面不使用的監(jiān)控方式:
- StartPollers=200
- StartPollersUnreachable=100
- StartTrappers=200
- StartPingers=100
- StartTimers=50
- StartDBSyncers=100
- Timeout=30
- TrapperTimeout=30
- StartProxyPollers=50
- HistoryTextCacheSize=1024M
- TrendCacheSize=1024M
- HistoryCacheSize=1024M
2、監(jiān)控項(xiàng)和報(bào)警項(xiàng)的優(yōu)化
監(jiān)控項(xiàng)越多,對(duì)zabbix數(shù)據(jù)庫(kù)和它本身的性能的考驗(yàn)就越大。精簡(jiǎn)監(jiān)控項(xiàng),只監(jiān)控必要的監(jiān)控項(xiàng),對(duì)運(yùn)維沒有幫助的監(jiān)控項(xiàng)可以取消,以減少系統(tǒng)資源的浪費(fèi)。最典型的一個(gè)MySQL監(jiān)控模板,是網(wǎng)上比較流行的percona官方出品的zabbix監(jiān)控模板,監(jiān)控項(xiàng)高達(dá)200多個(gè),基本囊括show global status中的所有項(xiàng)目,好多監(jiān)控項(xiàng)對(duì)運(yùn)維來說是沒有意義的,卻對(duì)數(shù)據(jù)庫(kù)和zabbix自身性能產(chǎn)生嚴(yán)重的影響,當(dāng)監(jiān)控量級(jí)達(dá)到一定程度后,性能之差可想而知。
監(jiān)控項(xiàng)的類型***使用數(shù)字,盡量避免使用字符。字符在數(shù)據(jù)庫(kù)中的存儲(chǔ)空間使用較大,在設(shè)置trigger時(shí)也相對(duì)麻煩,并且zabbix本身處理數(shù)字的效率要相對(duì)高。如果業(yè)務(wù)需要字符類型的監(jiān)控項(xiàng),可以適當(dāng)?shù)慕档蛿?shù)據(jù)采集的時(shí)間間隔以提高處理效率。
Trigger中,正則表達(dá)式函數(shù)last(),nodata()的速度最快,min()、max()、avg()的速度最慢。在使用過程中,盡量選擇速度較快的函數(shù)。配置Trigger時(shí),也應(yīng)注意使用正確的邏輯,錯(cuò)誤的邏輯可能導(dǎo)致數(shù)據(jù)庫(kù)查詢較慢的現(xiàn)象。
3、zabbix數(shù)據(jù)庫(kù)的優(yōu)化
對(duì)數(shù)據(jù)庫(kù)進(jìn)行分區(qū)是必須要做的,這便于刪除歷史數(shù)據(jù)。同時(shí)要關(guān)閉zabbix自身刪除歷史數(shù)據(jù)的設(shè)置。如果不做分區(qū)和刪除規(guī)則設(shè)置的話,隨著時(shí)間的推移,zabbix本身查詢和二次開發(fā)時(shí)查詢性能都會(huì)變得很低,甚至查詢不出數(shù)據(jù)。表分區(qū)的相關(guān)內(nèi)容可以參考如下文件:https://www.zabbix.org/wiki/Docs/howto/mysql_partition。
關(guān)閉zabbix自身刪除歷史數(shù)據(jù)的設(shè)置SQL語(yǔ)句如下:
- UPDATE config SET hk_events_trigger=60,hk_events_internal=60,
- hk_events_discovery=60,hk_events_autoreg=60,hk_audit=60,hk_sessions=60,
- hk_history=30,hk_history_mode=0,
- hk_history_global=1,hk_trends_mode=0,
- hk_trends_global=1,hk_trends=730,hk_services=60;
在頁(yè)面上設(shè)置位置為:
建議對(duì)歷史表中時(shí)間字段添加索引,在二次開發(fā)時(shí)這個(gè)字段用到的幾率比較大。建議對(duì)歷史數(shù)據(jù)表啟用innodb壓縮,具體做法如下:
- /*啟用innodb壓縮,設(shè)置歷史表啟用壓縮*/
- SET GLOBAL innodb_file_format='barracuda';
- SET GLOBAL innodb_file_format_max='barracuda';
- /*innodb_file_format和innodb_file_format_max要寫入my.cnf配置文件中*/
- ALTER TABLE history ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
- ALTER TABLE history_log ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
- ALTER TABLE history_str ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
- ALTER TABLE history_str_sync ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
- ALTER TABLE history_text ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
- ALTER TABLE history_uint ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
- ALTER TABLE history_uint_sync ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
- ALTER TABLE history_str ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
- ALTER TABLE history_uint_sync ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
- ALTER TABLE trends ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
- ALTER TABLE trends_uint ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
MySQL的版本建議使用PerconaDB5.6,設(shè)置thread_handling= pool-of-threads,啟用線程池。MySQL配置文件其他參數(shù)的優(yōu)化這里不多說,可以參考如鏈接中的配置文件:http://wangwei007.blog.51cto.com/68019/1623329。
4、zabbix監(jiān)控系統(tǒng)的架構(gòu)優(yōu)化
Zabbix架構(gòu)的優(yōu)化,主要原則是server端的壓力分擔(dān)到proxy端,proxy端的壓力分擔(dān)到agent端,監(jiān)控項(xiàng)采用被動(dòng)模式server端和proxy端均做高可用,防止單點(diǎn)造成監(jiān)控不可用。以下是zabbix的架構(gòu)和流程圖,僅供參考:
三、Zabbix自動(dòng)化
運(yùn)維自動(dòng)化的真諦在于解放、簡(jiǎn)化、方便運(yùn)維人員的工作,提高效率,減少人為故障,基本運(yùn)維思路是能自動(dòng)堅(jiān)決不手動(dòng),運(yùn)維人員要培養(yǎng)自己“懶”這個(gè)好習(xí)慣。自動(dòng)化的基礎(chǔ)是基礎(chǔ)信息的準(zhǔn)確性和各種配置信息規(guī)則的規(guī)范化。
1、監(jiān)控自動(dòng)化規(guī)范
約定主機(jī)名規(guī)范,以期達(dá)到見名知意的效果,見到主機(jī)名大概知道這個(gè)設(shè)備是什么業(yè)務(wù)在使用,角色是什么。出問題時(shí)運(yùn)維也可以快速的知道影響范圍和影響的嚴(yán)重性,方便運(yùn)維。主機(jī)規(guī)范一般可以包含機(jī)房信息、業(yè)務(wù)信息、業(yè)務(wù)登記、業(yè)務(wù)中的角色信息、IP等相關(guān)信息;
約定主機(jī)組的名字,這點(diǎn)主要是方便相同業(yè)務(wù)、相同研發(fā)查看自己主機(jī)的監(jiān)控,接收?qǐng)?bào)警信息,也方便zabbix本身做組圖在screen中展現(xiàn),做性能對(duì)比圖。比如數(shù)據(jù)庫(kù)的一個(gè)sharding集群,可以定義一個(gè)主機(jī)組,再做成Graphs匯總圖時(shí)方便研發(fā)直觀對(duì)比各個(gè)分片上的性能指標(biāo)是否均衡;
報(bào)警等級(jí)的規(guī)范,這個(gè)主要是用于區(qū)分報(bào)警發(fā)給誰(shuí),怎么發(fā),如何做報(bào)警升級(jí)等,還可以根據(jù)等級(jí)和監(jiān)控項(xiàng)進(jìn)行自動(dòng)處理,等級(jí)較高的優(yōu)先處理,較低的可以集中處理等;
主機(jī)維護(hù)暫停報(bào)警的規(guī)范。報(bào)警很重要,暫停監(jiān)控需謹(jǐn)慎,不建議使用自帶的Maintenance預(yù)維護(hù),主要是因?yàn)樘幱诰S護(hù)狀態(tài)的主機(jī)依然會(huì)顯示在監(jiān)控首頁(yè),雖然有標(biāo)記,但是主機(jī)量大的時(shí)候不方便運(yùn)維查看監(jiān)控。建議進(jìn)行二次開發(fā),約定處于維護(hù)狀態(tài)的主機(jī)關(guān)閉trigger,維護(hù)結(jié)束后自動(dòng)打開;
不建議手動(dòng)的修改主機(jī)監(jiān)控的各種配置,這樣容易遺忘,而且手工效率低下,容易造成各種設(shè)置和規(guī)則的混亂,后續(xù)問題堆積起來更加復(fù)雜,可維護(hù)性差。對(duì)zabbix進(jìn)行二次開發(fā)時(shí),配置的改動(dòng)需要記錄修改的原因,生效的時(shí)間段等信息;監(jiān)控的增刪改都自動(dòng)完成,各種規(guī)范用程序來約束,由程序去自動(dòng)完成。
2、部署配置的自動(dòng)化
Zabbix的服務(wù)器端和客戶端的部署較為簡(jiǎn)單,網(wǎng)上教程也比較多,把整個(gè)部署過程腳本化,然后和CMDB結(jié)合,自動(dòng)批量部署和添加主機(jī)到監(jiān)控中。部署過程可以參考此鏈接:http://wangwei007.blog.51cto.com/68019/1047953。
3、日常運(yùn)維自動(dòng)化
Zabbix自身提供了豐富的API接口,可以通過調(diào)用這些API,規(guī)范化操作配置zabbix??梢匀ttp://www.zabbix.com/documentation.php查看各個(gè)版本的使用說明,包含zabbix的各種操作;
在API的說明中,也講述了zabbix數(shù)據(jù)庫(kù)中表的數(shù)據(jù)庫(kù)字典,每個(gè)字段代表什么,都有詳細(xì)說明。zabbix的二次開發(fā)和自動(dòng)化運(yùn)維主要是調(diào)用zabbix的API和讀取zabbix的數(shù)據(jù)庫(kù)來搞定的,不建議直接對(duì)zabbix數(shù)據(jù)庫(kù)原表進(jìn)行直寫操作,一般也沒有必要。大家可以參考一下這個(gè)python寫的API:http://wangwei007.blog.51cto.com/68019/1139982。
4、報(bào)警的自動(dòng)化處理
Zabbix可以在action中設(shè)置調(diào)用系統(tǒng)命令,在保證安全的情況下,可以使用這個(gè)功能來自動(dòng)處理指定報(bào)警。設(shè)置如下圖:
用戶可以對(duì)常見的報(bào)警歸納總結(jié),對(duì)一些固定處理方法的報(bào)警,把過程腳本化,當(dāng)達(dá)到某個(gè)閾值的時(shí)候,自動(dòng)的處理,比如清理固定位置的日志等,達(dá)到報(bào)警快速恢復(fù)的目的。
5、LLD的使用
Zabbix中的LLD是一個(gè)非常好的擴(kuò)展,方便監(jiān)控主機(jī)上多實(shí)例MySQL、Redis等服務(wù)、端口、硬盤多分區(qū)、多網(wǎng)卡等情況。用戶可以自定義discovery rules,可以自動(dòng)的生成指定items、triggers、graphs等,較為靈活,極大地方便了監(jiān)控的運(yùn)維。
6、zabbix的二次開發(fā)
Zabbix的二次開發(fā)主要是對(duì)監(jiān)控?cái)?shù)據(jù)的二次分析,可以***限度地發(fā)揮這些數(shù)據(jù)的作用,從而更好的服務(wù)和指導(dǎo)運(yùn)維。
Zabbix的詳細(xì)歷史數(shù)據(jù)按照數(shù)據(jù)采集的類型存在于以下的表中:
- history,history_log,history_str,history_str_sync,history_sync,history_text,history_uint,history_uint_sync,events
zabbix的趨勢(shì)數(shù)據(jù)存放在trends,trends_uint兩張表中。趨勢(shì)數(shù)據(jù)是通過詳細(xì)的監(jiān)控?cái)?shù)據(jù)計(jì)算而來,每個(gè)監(jiān)控項(xiàng)每個(gè)小時(shí)會(huì)產(chǎn)生最小值、***值和平均值。
利用這些歷史數(shù)據(jù),可以自動(dòng)生成一些性能參數(shù)的統(tǒng)計(jì)匯總報(bào)表,比如某個(gè)性能指標(biāo)壓力較大的***00等,方便運(yùn)維排查安全隱患。通過對(duì)對(duì)報(bào)警歷史進(jìn)行分析,可以找出經(jīng)常報(bào)警的監(jiān)控項(xiàng),對(duì)可用性進(jìn)行評(píng)估等。
***,感謝我們DBA團(tuán)隊(duì)老大樊健剛樊總對(duì)本文的指導(dǎo)和建議,同時(shí)也感謝他對(duì)MySQL監(jiān)控這塊一直以來的重視和支持。
【本文是51CTO專欄作者王偉的原創(chuàng)文章,轉(zhuǎn)載請(qǐng)聯(lián)系作者本人獲取授權(quán)】