iT邦幫忙

DAY 26
7

高有效性 (High Availability) 初論 30 講系列 第 26

高有效性簡介30篇: Munin Plug-In 實作 (26)

**目前我大部份的實作都是靠 RRDTools 做基礎, 其中有幾項原因:

  1. RRD 指的是 Round Robin Database, 亦是指有時間序列的資料庫, 而處理有時間性的資料是最麻煩的, 尤其是在處理有關 Rotate (迴轉) 的問題是相當頭痛, 有人幫你處理是在好也不為過了.

  2. Visualization 視覺化是在資料處理很重要的一環, 也是很不好處理的一環, 會用 RRDTools 來處理很多人是為了幫忙畫圖, 這一點他是很不錯的繪圖工具是無庸置疑, 即使也不能說沒有更好的, 但方便性是不能否認.

  3. 在前一版的 MRTG 中, 每做一次處理就會畫一次圖, 這對系統是很大的負荷, 尤其是我們希望 Monitor System 不應該造成系統過大的負擔的前題, MRTG 只合適做小型系統的監控.

  4. RRDTools 的 DEF 與 RPN 在時間序列上是不錯的計算方式, 足以應付大部份的邏輯了.**
    當然對很多人而言, RRDtools 不是好學習的工具, 所以有人寫了很多系統去包裝起來, 之前比較有名的是 Cricket, 現在則是 Munin, 而 Munin 有許多不錯的地方:

**1. 在使用 RRDTools 最困難的就如何建立資料庫 Create 及畫圖 Graph, 而 Munin 已經幫我們做掉這個很大的環節.

  1. Munin 會自己設定排程去抓資料, 不用再去寫 Cron Job 去排程.

  2. Munin 已經內建了很多設定檔, 對 80% 的新手而言已經夠用, 不用再去學任何的進階設定.

  3. Munin 本身有 Auto Config 的功能, 甚至只要 Munin Client 這部份有所變動, Munin Server 本身不須要調整, 就可以直接使用.

  4. Munin 的 Config 提供不錯的彈性與延伸, 只要會寫 Client 的 Extension, 可以很快的由下到上被設定.**

由於 Munin 用的是 RRDTools, 所以真的要抓資料不只是可以透過 Munin Protocol 來達成, 自己去 Minin Server 去抓 .rrd 就可以實作出不少東西,

在這邊我寫一個範例, 就是 MySQL 的瓶頸的 Discovery 發現, 因為目前的 Minin Plug-In 都只是狀態的數字, 而看不出那一種問題是執行比較久造成效率瓶頸, 而在後台就有一隻程式把執行時間花比較久的 SQL 與狀態去記錄下來, 而這邊有個 Munin Plug-In 很簡單就可以把 MySQL 目前狀態記錄下來.

下面就是範例程式:

#!/usr/local/bin/php
<?php

/// Init ////////////////////////////////////////////////////////
$A_class=array(
	"net_op ## Network Operation" => array("reading from net","writing to net","sending data"),
	"sort ## Sort" => array("Sorting result"),
	"update ## Update" => array("update","updating","searching rows for update"),
	"tmp_table ## Temp Table (Disk Operation)" => array("copying to tmp table on disk"),
	"table_op ## Table Operation" => array("copying to tmp table","opening tables","closing tables","converting heap to myisam","creating tmp table","removing tmp table"),
	"flush_op ## Flush Operation" => array(),
	"cce ## Closing, Cleaning, Ending" => array("cleaning up","end"),
	"other_adm_op ## Other Administraion Operation" => array("statistics","preparing","freeing items","checking permissions"),
	"lock ## Lock" => array("locked","waiting for release of readlock"),
	"user_op ## User Operation" => array("login","executing","init")
);

/// Config Munin Plugins -- mysql_threads_state //////////////////
	if($argv[1]=="autoconf") {
		echo "yes";
		exit();
	}

	if($argv[1]=="config") {
		echo "graph_title MySQL Thread State
graph_args --base 1000
graph_vlabel times
graph_category mysql
graph_info Mysql General Thread State created by III IDEAS.\n";

		foreach($A_class as $class => $A_state) {
			$A_label=explode(" ## ",$class);
			echo $A_label[0].".label ".$A_label[1]."\n";
//			echo $A_label[0].".type DERIVE"."\n";
			echo $A_label[0].".min 0"."\n";
			echo $A_label[0].".max 500000"."\n";
		}
		exit();
	}

/// Fetch Value ///////////////////////////////////	

	$A_REV_state=array();
	foreach($A_class as $class => $A_state) {
		$A_label=explode(" ## ",$class);
		$A_class_count[$A_label[0]]=0;
		foreach($A_state as $state) {
			$A_REV_state[strtolower($state)]=$A_label[0];
		}
	}

	$A_fetch_value=array();

   mysql_connect("host", "user", "password");
   $q = mysql_query("SHOW FULL PROCESSLIST");

   while($r = mysql_fetch_row($q) ) {
      $real_state=$r[6];
      $AA_status[$real_state]++;
		if(trim($real_state)!="")
			$A_class_count[$A_REV_state[strtolower($real_state)]]++;
   }

	foreach($A_class_count as $class => $count) {
		echo $class.".value ".$count."\n";
	}
	//print_r($AA_status);
	
?>

其中當然最大的問題是 lock, 但特意把 tmp_table 這項拿出來, 因為這動作是要吃掉不少硬碟資源, 而 net_op 指的是網路傳輸的問題, 這對於跨 LAN 的 WAN 執行是很明顯的問題.

很明顯的大家可以看到這程是有直接讀取數字的部份, autoconf 及 config 這三部份, 這也是 Minin 聰明的地方, 因為高有效性的系統必然是個龐大的系統, 這樣從下到上的資訊流是讓細節的人處理細節, 上面的 Server 只要看如何包裝就好.

接下來 Nagios 不只可以直接抓 Munin 的資料, 只差沒有 Auto Config 的知道這些數值的正常範圍, 而我在後期又開發了一個把數值給 Normalization 起來, 然後自動化的去發現問題的可能性, 只是這又是另一個故事了.


上一篇
高有效性簡介30篇: 網管與監控 (25)
下一篇
高有效性簡介30篇: 書介 Building Large Scale LANs (27)
系列文
高有效性 (High Availability) 初論 30 講30

1 則留言

0
食夢黑貘
iT邦研究生 4 級 ‧ 2011-11-05 16:24:32


我真的沒想要用程式碼來充字數, 但原始碼會說話是真的, 且這是一個很不錯且簡單的實作, 很值得大家參考指教.

我要留言

立即登入留言