引言
實習公司爲了給某一個客戶做MySQL業務優化,需要做一個監控,對客戶的日常MySQL做一些基本的使用情況監控,監控一段時間後做一些優化。
監控環境
一共四臺需要監控的MySQL主機,一臺跳轉機,其中四臺MySQL主機的三臺爲一主一從一備份,另一臺主機爲單節點的MySQL
這四臺MySQL主機命名爲mysql_master1,mysql_master2,mysql_slave1,mysql_single,操作系統都是centos4.6
這四臺主機只能通過跳轉機jumper進行訪問,而且jumper只提供2222端口的ssh服務。一切數據都需要從這個端口獲得
要求監控MySQL的所有庫的連接情況,總連接情況,MySQL資源使用情況:CPU,內存等,系統的資源使用情況:CPU,內存,IO,磁盤等等。
對於三臺一主一從一備集羣要監控主從複製狀態,主從複製延遲等信息。
解決方案
集羣比較小,直接使用check_nrpe插件進行信息收集,然後在跳轉機上進行顯示即可。
但是爲了效果好,需要配置一個pnp的環境。問題層出不斷啊
check_nrpe SSL握手失敗:
check_nrpe官方有check_nrpe trouble的文檔。可以找到一些常見問題的處理辦法。
爲了安裝check_nrpe需要安裝ssl庫,在每臺MySQL主機whereis openssl 發現都安裝了SS。OK直接編譯安裝
出現SSL握手問題,發現SSL的版本不同導致,好吧。到SSL官網下一個統一1.0版本,安裝搞定。
在編譯check_nrpe的時候用--with-ssl-inc以及--with-ssl-lib制定手動安裝ssl庫的位置。
這裏又是遇到問題,指定了安裝路徑,還是找不到libssl庫,好吧,受不鳥了,修改了一下configure腳步文件,直接寫死SSL庫位置,順利編譯安裝check_nrpe
然後需要指定一下LD_LIBRARY_PATH,加入ssl庫的位置,否則運行check_nrpe時候找不到ssl動態庫。
pnp安裝
由於jumper跳轉機的系統是4.6,在安裝pnp時各種錯誤,pnp需要rddtool畫圖庫,這個庫各種依賴,與系統自身安裝的很多包不兼容,centos4.6的源已經停用,只能更換爲centos4.9的源進行使用,但還是各種庫不兼容,版本不匹配等等的問題,最後實在是不想在折騰了,在公司找了臺服務器安裝了nagios+pnp環境,跳轉機只作爲收集信息使用,將信息收集過來,使用公司的服務器進行顯示效果。架構圖如下
使用linux下的dia一個簡單的畫圖軟件畫的,比較醜。
從圖上看思路就比較清晰了,顯示界面的主機通過check_ssh對jumper發送server check指令。即調用jumper上的check_nrpe插件檢查四臺MySQL主機,四臺MySQL上都運行着nrpe服務端口採用默認端口5666。然後通過jumper將信息反饋給nagios+pnp顯示出來即可。
這裏使用check_ssh需要配置免登陸 可以參考http://chenlb.iteye.com/blog/211809
注:安裝的nagios版本爲4.0+,使用pnp的默認配置是不行的,需要使用bulk配置纔可以。
監控腳步
監控腳步格式在之前的文章中說明過,這裏針對性能數據進行說明腳步說明格式。
- 'label'=value[UOM];[warn];[crit];[min];[max]
-
注意:
1. 多個性能數據之間用空格分割
2. label 可以包含任何字符
3. 如果label中包含空格、等號、或者單引號,則label需要用單引號來括起來
4. warn/crit/min/max可以爲null值
value, min and max只能爲負號“-” “0到9” 和小數點“.” 並且單位必須統一
例如:cpu_user=0.5%;99.9;-9;
5. 如果UOM單位是%,則min和max不需要再指定
6. UOM單位可以是如下: 默認空,表示數量(用於用戶數、處理器數等)
s 表示秒(也可以用us,ms)
% 表示百分比
B 表示字節(也可以用KB,MB,TB,GB)
c 一個連續的計數(如:接口傳輸的字節數)
性能日誌轉儲
日誌轉儲是必須的不同多說。本來打算使用插件NDOutils, 不知道爲什麼編譯直接core dump。好吧。。。那我就不存數據庫了直接存文件裏吧。
默認的處理性能數據的pnp腳步是process_perfdata.pl 默認這個perl腳步會在性能數據文件超過10M時直接將文件truncate掉,所以該起來也比較容易直接將truncate之前copy一下文件即可如下
#
# Write to Logfile
#
sub print_log {
my $out = shift;
my $severity = shift;
if ( $severity <= $conf{LOG_LEVEL} ) {
open( LOG, ">>" . $conf{LOG_FILE} ) || die "Can't open logfile ($conf{LOG_FILE}) ", $!;
if ( -s LOG > $conf{LOG_FILE_MAX_SIZE} ) {
# truncate( LOG, 0 );
# printf( LOG "File truncated" );
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime;
$year += 1900;
$mon += 1;
my $filename = sprintf ("/usr/local/pnpnagios/var/history/%d-%02d-%02d-%02d-%02d-%02d.log", $year,$mon,$mday,$hour,$min,$sec);
copy ($conf{LOG_FILE}, $filename);
truncate( LOG, 0);
}
my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime(time);
printf( LOG "%02d-%02d-%02d %02d:%02d:%02d [%d] [%d] %s\n", $year + 1900, $mon + 1, $mday, $hour, $min, $sec, $$, $severity, $out );
close(LOG);
}
}
如果覺得10M大小轉儲起來日誌文件太多可以修改一下LOG_FILE_MAX_SIZE的大小。最後的成果圖如下:下圖爲單擊mysql主機的總連接數性能數據圖。