ZabbixでMySQLのレプリケーション状態を監視したいというお話(機関車トーマスの冒頭風)。
MySQLはWindows Serverで動いている。LinuxならGoogle先生にきくとちょいちょい教えてくれるんだけど、Windows版はあまり教えてくれない。
ということで、備忘録のためにも記事を残します。
環境と概要
監視サーバは、CentOS7でZabbix3.0/3.4で動作を確認。
監視対象のサーバは、WindowsServer2016/MySQL5.7 が稼働している。
レプリケーション状態の監視と謳ってはおりますが、正確にはスレーブサーバのステータスを監視するというもの。もっというと show slave status コマンドの結果からレプリケーション状態を判定する、という監視内容です。
では設定手順です。
MySQLのユーザ作成
MySQLの show slave status のコマンド実行結果から値を取得するために、Zabbix-Agent が MySQLに接続するためのユーザを作成します。
1 |
GRANT REPLICATION CLIENT ON *.* TO 'ZabbixAgentUser'@'localhost' IDENTIFIED BY 'MySQLPassword' |
以下は好きなように置き換えてください。
ZabbixAgentUser | ZabbixAgentがMySQLに接続する際のMySQLユーザ名 |
MySQLPassword | 上記ユーザのパスワード |
次に、作成したMySQLユーザのパスワードファイルを用意します。このファイルはMySQLの設定ファイルです。
1 2 3 4 |
# zabbix_my.cnf [client] user = ZabbixAgentUser password = "MySQLPassword" |
スレーブのレプリケーションステータスを取得するスクリプト
このスクリプトは Zabbix-Agent が先程作成したMySQLユーザでMySQLに接続して、show slave status コマンドをぶっ叩いて、ずらっと表示される一覧からアイテムキーで指定された項目に紐づくステータスを取得するためのスクリプトです(長い・・・汗)
Windows環境にgrepやらcutやらawkやらをインストールして値を取得するような記事もあったけど、せっかくPowerShellという便利なモノがあるので、Windowsデフォルト環境で頑張ってみる。以外といけるモノです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# check_slave_status.ps1 # 作成したMySQLユーザのパスワードファイル $UserPass_Info = "C:\zabbix-agent\mysql\zabbix_my.cnf" # MySQLに接続して実行するコマンド $MySQL_Command = "show slave status\g" # Zabbixアイテムキーの第1引数に指定された文字列(↑のshow slave statusで取得できる項目名が指定される) $Parameter = $Args[0] cd "C:\Program Files\MySQL\MySQL Server 5.7\bin" .\mysql --defaults-extra-file=$UserPass_Info -e $MySQL_Command | Select-String "\ $Parameter\:" | ForEach-Object { $($_ -split': ',2)[1] } |
cdでディレクトリ移動してから実行しているのは、Command not found.になってしまったから。パスは通っていることは確認済み。スクリプト内にパスを指定すればよかった?フルパスで指定してもだめだったから関係ないか。。。なぜでしょうか。わかる方いたらコメントいただけると喜んで顔がほころびます。
ユーザパラメーターファイルの作成
Zabbixで事前に定義されていないAgent監視をする際はこのパラメーターが必要になります。
Linuxの場合はyumでインストールすると最初から用意されているが、WindowsのZabbixAgentだと存在しないので自分で作成する。
構文は以下。
1 |
UserParameter=アイテムキー,コマンド |
今回使うのは以下。
1 |
UserParameter=mysql.slave.status[*],chcp 65001>nul&&C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File "C:\zabbix-agent\script\check_slave_status.ps1" "$1" |
先程作成したPowershell のスクリプトを呼び出しますが、その前に chcp コマンドで文字コードをUTF8に変更しています。じゃないと、文字化けしてうまく実行されない。。。WindowsのデフォルトはSJIS。
最後の $1 はアイテムキーの引数(↑でいうと*の箇所)が指定される。「*」はZabbixのWeb画面のほうから設定するアイテムキーで指定するので、↑のパラメーターは1行で良い。
このパラメータファイルをZabbixAgentが読み込めるようにZabbixAgentの設定ファイルにインクルードの設定をしてやる。どこに書いてもいいけどIncludeのセクションがConfの真ん中あたりにありました。
1 |
Include=C:\zabbix-agent\mysql\userparameter_mysql.conf |
ZabbixWeb画面での監視設定
まず、レプリケーション状態の確認コマンドを実行してみます。以下は正常の状態。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
mysql> show slave status\g *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.2.98 Master_User: replicate Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000010 Read_Master_Log_Pos: 567655 Relay_Log_File: hoge-db-relay-bin.000012 Relay_Log_Pos: 4 Relay_Master_Log_File: mysql-bin.000010 Slave_IO_Running: Yes Slave_SQL_Running: Yes : (以下省略) |
↑で表示された項目を監視することができます。例として「Slave_IO_Running」の監視設定をします。
アイテム
アイテムは以下のように指定します。
アイテム名(1) | MySQL $1 |
アイテムキー(2) | mysql.slave.status[Slave_IO_Running] |
監視間隔(3) | 1分(ご自由に) |
データ型(4) | 文字列 |
- アイテム名の $1はアイテムキーの引数が自動で入る(Zabbixのマクロ)
- アイテムキーの引数( [] の中)は show slave status コマンド結果の項目名を指定する。
- 監視間隔はご自由に設定してください。
- データ型は取得する値に応じて指定してください。おおよそ文字列か整数で良いかと。
トリガー
トリガー名(1) | {HOST.NAME} Slave_IO_Running |
条件式(2) | {HostName:mysql.slave.status[Slave_IO_Running].regexp(Yes)}=0 |
- {HOSTNAME} はZabbixのマクロ機能によって自動でホスト名が表示されます。
- regexp(Yes) はステータスがYesではない場合に異常として検知します。
例えば、Slave_IO_State の値を監視する場合の条件式は、以下のように変更すれば良いです。
- Slave_IO_Running → Slave_IO_State
- Yes → Waiting for master to send event
まとめ
いかがでしたでしょうか。
MySQLを動かす場合は基本的にLinuxが多いと思いますが、Windows版でもLinuxと同じようにレプリケーション状態(スレーブサーバのステータス)を監視することができます。
Linuxサーバでも基本的に設定することは同じですので、参考にしていただければと思います。
以上です。