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サーバーの高可用性を望みます。