На сервере должен быть установлен php с поддержкой mysqli.
1. Необходимо создать базу данных, на которой будет производится мониторинг.
# mysqladmin -u root create system_monitor
2. Далее в этой базе данных необходимо создать 2 таблицы:
CREATE TABLE `master_status` (
`replication_date` datetime DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
CREATE TABLE `slave_status` (
`replication_date` datetime DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
3. После этого необходимо добавить в крон следующий скрипт. Данный скрипт производит обновление поля Дата в своей таблицы и проверяет по Дата в таблице мастера, если время с текущем временем будет расходится более чем на 5 минут, будет выслано сообщение и рассинхронизации БД.
/* vim: set expandtab sw=4 ts=4 sts=4: */
# define variable
$name = "NAME"; # name server
$ip = "1.1.1.1"; # ip address server
$alert_email = "test@example.org";
$status = "master" # variable: master | slave, master - current master server. slave - current slave server.
# init connect
define('DB_PROD_DBHOST', 'localhost');
define('DB_PROD_DBNAME', 'system_monitor');
define('DB_PROD_USER', 'system_monitor');
define('DB_PROD_PASS', 'PASS');
define('DB_PROD_CHARSET', 'UTF-8');
$db = new mysqli(DB_PROD_DBHOST, DB_PROD_USER, DB_PROD_PASS, DB_PROD_DBNAME);
if (mysqli_connect_errno()) {
if(!file_exists('alertconnect')){
touch('alertconnect');
# mail out to admins
$message = "Server Name: $name\n";
$message .= "Server IP: $ip\n";
$message .= "Not possible to make a connection to the database server\n";
mail($alert_email, "[$name] Error. BD connect failed.", $message,
"From: $alert_email \r\n"
."X-Mailer: PHP/" . phpversion());
exit;
}
}
if(file_exists('alertconnect')){
unlink('alertconnect');
# mail out to admins
$message = "Server Name: $name\n";
$message .= "Server IP: $ip\n";
$message .= "Database connection is fine.\n";
mail($alert_email, "[$name] connection is fine", $message,
"From: $alert_email \r\n"
."X-Mailer: PHP/" . phpversion());
}
$db->set_charset(DB_PROD_CHARSET);
# end
if ($status == "master"){
$update_table = "master_status";
$test_table = "slave_status";
} else {
$update_table = "slave_status";
$test_table = "master_status";
}
# update replication date
$db->query("UPDATE $update_table SET replication_date = NOW()");
# checking replication date
$result = $db->query("SELECT TIMESTAMPDIFF(MINUTE,replication_date,NOW()) FROM $test_table");
$row = $result->fetch_row();
if( $row[0]>5 ){
if(!file_exists('alertsending')){
# mail out to admins
$message = "Server Name: $name\n";
$message .= "Server IP: $ip\n";
$message .= "Database replication does not occur for {$row[0]} minutes.\n";
mail($alert_email, "[$name] AlertMSG. Replication failed", $message,
"From: $alert_email \r\n"
."X-Mailer: PHP/" . phpversion());
touch('alertsending');
}
}else{
if(file_exists('alertsending')){
unlink('alertsending');
# mail out to admins
$message = "Server Name: $name\n";
$message .= "Server IP: $ip\n";
$message .= "Database replication is fine.\n";
mail($alert_email, "[$name] Replication is fine", $message,
"From: $alert_email \r\n"
."X-Mailer: PHP/" . phpversion());
}
}
$db->close();
# end
?>
Данный скрипт необходимо повесить в cron на ежеминутное исполнение. В случае прекращения репликации вам будет выслано письмо на указанный email