zabbix優化記一次慘痛的zabbix數據庫優化
最近負責公司的zabbix項目,由於前期缺少整體性能架構的規划,導致后期出一系列的問題,玩zabbix的兄弟都知道,zabbix最大的瓶頸本身不在zabbix服務,而在mysql數據庫的壓力上,因此,優化zabbix其實就是優化zabbix的配置以及zabbix的mysql了;
Zabbix 數據庫常見的優化處理方法有兩種:
01. 優化數據庫,對數據庫進行分表處理;
02. 清空數據庫中的history, history_uint表;
在接下來的方案我們就mysql數據庫分表來進行優化;
具體思路:
1. 首先下載腳本
https://github.com/itnihao/zabbixdbpartitioning
感謝hao哥提供腳本以及幫助。
2. 前期准備工作,安全起見最好安裝screen,也不怕程序卡死,關於screen的用法請參考http://www.kwx.gd/CentOSApp/CentOS-screen.html
關閉zabbix的郵件報警,也可以關閉zabbix server服務,mysql本身會鎖表
3. 在screen模式下運行腳本,
在這里需要注意的是,如果你的數據庫特別大,最好先備份,然后在修改腳本,然后分表,在修改腳本的時候需要注意的幾個地方我這里先列出來下,如下:
首先修改zabbix 數據庫和密碼 默認情況下是都是zabbix 如果你的也是這樣的話,那么不用修改,
然后修改配置文件的路徑,根據自己的自定義的路徑來修改腳本的路徑
如果手動備份了那么關閉腳本中備份.
4. 然后來查看是否創建完成;
具體實施:
1. 首先在安裝部署之前,來查看兩張圖片,然后我們就知道壓力怎么樣了,
2. 切記記得備份,關於備份就不在這里列出來了,使用mysqldump來完成備份.關閉zabbix服務器;
完整導出數據庫備份,
mysqldump -uroot -p zabbix > /www/zabbix.sql 導出數據庫結構不導出數據: mysqldump --opt -d zabbix -uroot -p > zabbix.biao.sql 關閉zabbix服務: /etc/rc.d/init.d/zabbix-server stop
3. 執行腳本,在執行腳本之前,我們先創建兩張表, history_bak和history_uint_bak,然后我們重命名原來的兩張表history和history_uint兩張表;然后把創建的兩張表變成原來的,這樣表中就沒有數據了.如下:
創建表:關於創建,可以到處zabbix數據庫的表結構,然后找到這個表就可以,還好這兩張表沒有依賴關系。
CREATE TABLE `history_bak` ( `itemid` bigint(20) unsigned NOT NULL, `clock` int(11) NOT NULL DEFAULT '0', `value` double(16,4) NOT NULL DEFAULT '0.0000', `ns` int(11) NOT NULL DEFAULT '0', KEY `history_1` (`itemid`,`clock`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `history_uint_bak` ( `itemid` bigint(20) unsigned NOT NULL, `clock` int(11) NOT NULL DEFAULT '0', `value` bigint(20) unsigned NOT NULL DEFAULT '0', `ns` int(11) NOT NULL DEFAULT '0', KEY `history_uint_1` (`itemid`,`clock`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
重命名表:
rename table history to history_bak_14_03_08; rename table history_bak to history; rename table history_uint to history_uint_bak_14_03_08; rename table history_uint_bak to history_uint;
4. 然后來執行腳本;
bash -x partitiontables.sh,可以根據提示來選擇Y/N
因為我是代bug模式輸出的腳本,輸出比較多,我在這里截幾張重要的圖片,大家已做參考:
5. 完成之后我們可以查看數據是否來看有沒有成功
生成的任務計划腳本路徑:
cat /etc/cron.daily/zabbixhousekeeping
記得要在腳本中配置郵件,因為在我們的案例中我們使用的是mutt+msmtp 腳本如下:
[root@zabbix-server-01 ~]# cat /usr/local/zabbix/cron.d/housekeeping.sh #!/bin/bash MAILTO=431054426@qq.com tmpfile=/tmp/housekeeping$$ date >$tmpfile /usr/bin/mysql --skip-column-names -B -h localhost -u zabbix -pzabbix zabbix -e "CALL create_zabbix_partitions();" >>$tmpfile 2>&1 /usr/bin/mutt -s "Zabbix MySql Partition Housekeeping" $MAILTO <$tmpfile rm -f $tmpfile [root@zabbix-server-01 ~]#
然后會收到報警郵件
也許很多人搞不明白為什么我要重命名這兩張表,然后在執行腳本來這樣做呢?更怕歷史記錄找不見呢?我做過測試,如果在不重命名history兩張表的情況下,兩天估計都分表完成, 我做過測試,我的history有8G大小,我用8個小時都沒有分表完成,更何況history_uint這個快30G的表,雖然這樣做就是無法看到歷史數據,我們可以完全搭建個LNMP或者LAMP,創建數據庫,在創建的數據庫上導入這個我們備份的mysql來查看以前的歷史記錄。或者在zabbxi server機器上做個虛擬目錄,數據庫指定到備份的服務器上;雖然這樣有點蛋疼但是這也是我目前了解最快的不丟失數據的辦法,也可以解決以后塞滿表的情況!
如果不要zabbix的歷史記錄那么就很簡單的來做了.如下: use zabbix; truncate table history; optimize table history; truncate table history_str; truncate table history_uint;