Zabbixを介したMySQLマスターマスターレプリケーションの確認

MySQLマスターマスタレプリケーションを構成したら、次の論理的なステップは、このシステムの検証を構成することです。 インターネット上のチュートリアルを読むと、そのような複製が一般的な問題であり、2倍から3倍に飛ぶことが明らかになりました。 したがって、レプリケーションをまだ実行しているかどうか、または何かが発生してすべてがうまくいかなかったかどうかをチェックすることにしました。

Googleの最初の数件のクエリでは、「SHOW SLAVE STATUS \ G」とは信じられないことが示されました。問題はありますが、多くの場合、多くのことがあります。 少し考えた後、次の解決策を見つけました。



*データベースは2つのサーバー上に作成され、両方のサーバーがクラウンに書き込むプレートです。 レプリケーションは、サーバー間でデータを自動的に転送する必要があります。

*クラウンでデータを更新するために呼び出されるスクリプトが作成されます。

*プレートを読み取り、「他の」サーバーからのデータが最後に更新されたときを監視するスクリプトが作成されます。 すべてが順調であれば-1、そうでなければ0を書き込みます(このステータスはzabbiksで確認する方が簡単です)

* UserParameterはzabbixエージェントの設定に適合します。 トリガーがzabbiksに追加されます

*コーヒー



準備する


両方のサーバーで、データベースとテーブルを作成します。



create database repl_check;

use repl_check;

create table repl_status(s_id int, server_time TIMESTAMP);

insert into repl_status values(1,NOW());








レプリケーションにこのデータベースを含めることを忘れないでください、/ etc / my.cnfに行を追加してください

binlog-do-db=repl_check







両方のmysqlサーバーを再起動します。



人生の兆しを見せます


各サーバーには独自の構成と一意のserver_idがあります。 最初は、レプリケーションのためにmy.cnfで定義されているグローバル@@ server_idを使用しようとしましたが、バイナリログはコマンドを完全に送信し、各サーバーは異なるserver_idに対して実行します(つまり、最初はserver_id = 1の行を更新し、2番目はserver_idの行を更新します= 2)、そして私は苦しむことはなく、各サーバーに一意のserver_idを入力することにしました。

max_seconds_diffは、サーバーがすべてが正常であると考える最大の差です。 原則として、小さな価値があるかもしれませんが、私は狂信に陥らないことに決めました。 本当の問題がある場合は、いずれにしても3分後に見つけます。



config.php

<?php

$username="root";

$password="";

$dbname="repl_check";

$server_id=1;

$max_seconds_diff = 130;

?>








repl_update.php

<?php

include('config.php');



$sql_conn = mysql_connect("localhost",$username,$password);

if ($sql_conn == NULL)

die("failed connecting");

mysql_select_db($dbname);



$sql_query = "update repl_status set server_time=NOW() where s_id like " . intval($server_id);

mysql_query($sql_query,$sql_conn);



mysql_close($sql_conn);

?>








クラウンに追加します。 これで、毎分、両方のサーバーがデータベースを更新し、各行に独自のserver_idが追加されます

crontab -e

* * * * * php /home/myuser/scripts/check_repl/repl_update.php






すべて、タブレットは毎分更新されます。



人生の兆候を認識する。


check_repl.php

<?php

include('config.php');



$sql_conn = mysql_connect("localhost",$username,$password);

if ($sql_conn == NULL)

die("failed connecting");

mysql_select_db($dbname);



$time_result = mysql_query("select time_to_sec(timediff(NOW(), max(server_time))) as serv_time_diff from repl_status where s_id != " . intval($server_id));

$result_row = mysql_fetch_array($time_result, MYSQL_ASSOC);

$seconds_diff = intval($result_row["serv_time_diff"]);



mysql_free_result($time_result);

mysql_close($sql_conn);



if ($seconds_diff > $max_seconds_diff)

print "0"; //bad

else

print "1"; //good!

?>








便宜上、近くにスクリプトも追加しました。



check_repl.sh

#!/bin/sh

php /home/myuser/scripts/check_repl/check_repl.php








確認するには、いずれかのサーバーで「スレーブ停止」を実行する必要があり、2〜3分待ってからcheck_repl.shを実行します。 この場合、0を取得する必要があります。「スレーブスタート」を開始する場合、1分後にステータスが既に調整されているはずです。



ザビックス


この行を/etc/zabbix/zabbix_agentd.confに追加する必要があります(または構成の場所)

UserParameter=mysql_repl.check,/home/myuser/scripts/check_repl/check_repl.sh







これは、zabbix(またはzabbix_get)がmysql_repl.checkキーを使用してアイテムを要求すると、スクリプトが実行され、その値(0または1)が取得されることを意味します



その後、zabbixエージェントを再起動する必要があり、アイテムとトリガーをzabbixに追加できます。 [アイテム]の[値の表示]フィールドで、サービス状態を設定します(この場合、0はダウン、1はアップ)

mysql_repl.check

そしてそのトリガー:{MyHost:mysql_repl.check.last(0)} <1



アイテムとトリガーは両方のホストに追加する必要があることに注意してください。 レプリケーションが行われると、トリガーが点灯します。



それだけです

mysqlサーバーの高可用性を望みます。



All Articles