CactiでMySQLのレプリケーション情報をグラフ化する

Cactiでmysql-cacti-templatesを使うとMySQLのレプリケーション情報をグラフ化することが出来る。

レプリケーションサーバの状態を監視する必要があったので、mysql-cacti-templatesの中にあるGraph Template: X MySQL Replication GTのグラフを作成したが、どうも値が取れてないっぽかったので値の取得ロジックを探した。

X MySQL Replication GTに関連づけられているX MySQL Replication DTは、X Get MySQL Stats/MySQL Replication IMを用いる設定になっていた。GT,DT,IMはGraphTemplate, DataTemplate, DataImputMethodの略だろうか。
X Get MySQL Stats/MySQL Replication IMはss_get_mysql_stats.phpを呼び出すようになっていたので、ソースコードを追ってみた。

   # Get SHOW SLAVE STATUS, and add it to the $status array.
   if ( $chk_options['slave'] ) {
      $result = run_query("SHOW SLAVE STATUS", $conn);
      foreach ( $result as $row ) {
         # Must lowercase keys because different MySQL versions have different
         # lettercase.
         $row = array_change_key_case($row, CASE_LOWER);
         $status['relay_log_space']  = $row['relay_log_space'];
         $status['slave_lag']        = $row['seconds_behind_master'];

         # Check replication heartbeat, if present.
         if ( $heartbeat ) {
            $result2 = run_query(
               "SELECT GREATEST(0, UNIX_TIMESTAMP() - UNIX_TIMESTAMP(ts) - 1)"
               . "FROM $heartbeat WHERE id = 1", $conn);
            $status['slave_lag'] = $result2[0][0];
         }

         # Scale slave_running and slave_stopped relative to the slave lag.
         $status['slave_running'] = ($row['slave_sql_running'] == 'Yes')
            ? $status['slave_lag'] : 0;
         $status['slave_stopped'] = ($row['slave_sql_running'] == 'Yes')
            ? 0 : $status['slave_lag'];
      }
   }

$status[‘slave_running’]と$status[‘slave_stopped’]に正しく値が入ってほしい。
しかしスレーブが止まっていると$status[‘slave_lag’]の値が0になってしまうので、スレーブが遅延なしで動いてるのか止まっているのか判断がつかない。

$heartbeatをifで比較しているところが気になったので調べてみた。
スクリプトの先頭に$heartbeat  = ”;      # db.tbl in case you use mk-heartbeat from Maatkit.と書いてあった。
Maatkitとmk-heartbeatをサラッと調べてみたところ、Maatkitとはデータベースのツール群で、mk-heartbeatはその中の一つらしかった。

よく分からずに使ってみて分かったことは、mk-heartbeatはマスターサーバに1つのテーブルと1つの行を作成して、そこの行を常に現在時間で更新するツールらしい。
そうすることでスレーブサーバにmk-heartbeatが書き込んだ時間が送られて、それを現在時間と比較することでスレーブサーバの遅延を計ることが出来る。

Maatkitはportsからインストール出来る。
# portinstall databases/maatkit

mk-heartbeat用のテーブルをマスターサーバに対して作成する。
# mk-heartbeat –create-table -h hostname -D dbname –user username -p password –update
これでテーブルの作成と同時にカラムの更新が始まる。
テーブルがすでに作成済みの時にカラムの更新をする場合は以下の文を実行。
# mk-heartbeat -D dbname –update -h hostname -u username -p password

mk-heartbeatを常に実行するために起動スクリプトを書く。参考にした記事は以下の通り。
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=rc.d&dir=jpman-5.4.0%2Fman&sect=0
http://www.jp.freebsd.org/cgi/mroff.cgi?sect=8&cmd=&lc=1&subdir=man&dir=jpman-5.4.0%2Fman&subdir=man&man=rc.subr
http://www.jp.freebsd.org/cgi/mroff.cgi?sect=8&cmd=&lc=1&subdir=man&dir=jpman-5.4.0%2Fman&subdir=man&man=rcorder

作成したスクリプト。$nameにハイフンが使えなくてはまった。

#!/bin/sh

. /etc/rc.subr

rc_debug=1

name="mkheartbeat"
rcvar=`set_rcvar`
load_rc_config ${name}

: ${mkheartbeat_enable="NO"}
: ${mkheartbeat_user="root"}
: ${mkheartbeat_dbhost="localhost"}
: ${mkheartbeat_dbname="mysql"}
: ${mkheartbeat_dbuser="root"}
: ${mkheartbeat_dbpass="pass"}

command_interpreter="perl"
command_args="-D ${mkheartbeat_dbname} -h ${mkheartbeat_dbhost} -u ${mkheartbea\
t_dbuser} -p ${mkheartbeat_dbpass} --daemonize --update"
command="/usr/local/bin/mk-heartbeat"

run_rc_command "$1"

各サーバの時間がずれていては計測できないので注意。

コメントを残す