Tutoriales

Script de shell para monitorear la replicación de MariaDB y enviar notificaciones por correo electrónico

[*]

HHay un script de shell simple para notificar una falla de la réplica secundaria de solo lectura (esclavo) del servidor MariaDB por correo electrónico y notificación de inserción. La replicación de datos maestro-esclavo le permite copiar bases de datos a múltiples servidores MariaDB. Es útil para realizar copias de seguridad, recuperar datos, equilibrar la carga y mucho más. Aprenda a configurar la replicación de MariaDB protegida por SSL entre un servidor maestro y esclavo.

Los términos maestro y esclavo se usaban en la replicación de MariaDB / MySQL en el pasado, pero ahora se prefieren los términos primario y de réplica. Actualmente MariaDB es Code, y la documentación elimina estas referencias y las reemplaza con primarias y réplicas. Hasta que estas variables se actualicen en el software principal, este script utiliza términos históricos.

Cuando se trata de la supervisión de la replicación, los scripts examinan principalmente las tres cosas «Slave_IO_Running», «Slave_SQL_Running» y «Seconds_Behind_Master» (el retraso entre el maestro y el esclavo) y el último código de error.

Requisitos del script de shell para monitorear la replicación de MariaDB

  1. Obviamente, necesita un clúster MariaDB que funcione.
  2. Sistema de correo electrónico en funcionamiento para enviar correos electrónicos salientes. Aprenda a configurar Postfix y a configurar AWS SES con Postfix MTA.
  3. Pushover acceso a la API de pago o gratuito para enviar notificaciones automáticas a su dispositivo Android o Apple iOS. Vea cómo enviar / enviar un mensaje a iOS y Android desde la CLI de Linux.
  4. Cáscara de Bash

Script de shell para monitorear la replicación de MariaDB y enviar notificaciones por correo electrónico sobre el estado del servidor

Aquí está mi script de shell de ejemplo para notificar el estado del servidor MariaDB secundario de solo lectura:

#!/usr/bin/env bash
# Set mysql/mariadb login info 

# default is root but I set up admin user with less permission 
_user="admin"   
_pass="MariaDB_ADMIN_USER_PASSWORD"
_host="localhost"

_out="/tmp/mysql-status.$$"
_errs=()
_m_vars='Slave_IO_Running|Slave_SQL_Running|Seconds_Behind_Master|Last_Errno'
_is_error_found="false"
_alert_limit=60

# Email settings 
FROM="[email protected]"
TO="[email protected]"

# Grab keys and bash function  for pushover API 
source ~/bin/cli_app.sh

# Send html email to "$TO" from "$FROM" 
html_email() sendmail -f "$FROM" "$TO"

    # Push message to my mobile device 
	push_to_mobile "$0" "$SUBJECT
	 Hostname : $HOSTNAME
	 Date: $(date)
	 Errors:
	 $( IFS=$'n'; echo "$MSG[*]" 

## main ##
mysql -u "$_user" -h "$_host" -p"$_pass" 
-e 'SHOW SLAVE STATUS G;' 
| grep -E -i "$_m_vars" > "$_out" || html_email "Can't connect to local mysql/mariadb server." 


IFS='|'
for v in $_m_vars
do
  value=$(awk -F':' -v m="$v:" '$0 ~ m  gsub(/ /, "", $2); print $2 ' "$_out")
  if [ "$v" == "Slave_IO_Running" ]
  then
      [[ "$value" != "Yes" ]] &&  _errs=("$_errs[@]" "<p>The I/O thread for reading the master's binary log not found ($v: $value)</p>");
      				 _is_error_found="true"; 
  fi
  if [ "$v" == "Slave_SQL_Running" ]
  then
      [[ "$value" !=  "Yes" ]] &&  _errs=("$_errs[@]" "<p>The SQL thread for executing events in the relay log is ($v: $value)</p>");
      				 _is_error_found="true"; 
  fi
  if [ "$v" == "Seconds_Behind_Master" ]
  then
      [ "$value" == "NULL" ] &&  _errs=("$_errs[@]" "<p>The slave server is in undefined or unknown state ($v: $value)</p>"); 
      				  _is_error_found="true"; 
      if [[ $value =~ ^[0-9]+$ ]]
      then
          [ "$value" -gt $_alert_limit ] &&  _errs=("$_errs[@]" "<p>The Slave server is behind the master for at least $_alert_limit seconds ($v: $value)</p>");
                                              _is_error_found="true"; 
      fi
  fi
  if [ "$v" == "Last_Errno" ]
  then
      [ "$value" -ne 0 ] &&  _errs=("$_errs[@]" "<p>The slave SQL thread receives an error ($v: $value</p>)");
                                _is_error_found="true"; 
  fi

done

# Send email and push message when error found 
[ $_is_error_found == "true" ] && html_email "$_errs[@]"

# Cleanup 
[ -f "$_out" ] && rm -f "$_out"

Configuré un trabajo cron para monitorear mi servidor esclavo MariaDB como este:

*/5 * * * * root /root/bin/check-mysql-slave-server-health

Así es como se ve un correo electrónico:

Notificación de desplazamiento para mi teléfono móvil:

Resumir

La replicación de MariaDB es enorme porque ofrece alta disponibilidad para leer datos. Por supuesto, deberá modificar la aplicación para enviar solicitudes de lectura a réplicas y solicitudes de escritura al servidor primario. Sin embargo, ya no uso este modelo. En su lugar, recomiendo configurar un clúster Galera de tres nodos, una biblioteca de replicación genérica síncrona multi-primaria (maestra) para bases de datos transaccionales utilizadas en MySQL y MariaDB. Compartiré este script si alguien todavía usa un modelo anterior.

🐧 Obtenga los últimos tutoriales sobre temas de SysAdmin, Linux / Unix, Open Source y DevOps a través de:

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba