sql >> Base de Datos >  >> RDS >> MariaDB

Mi DBA está enfermo:consejos de conmutación por error de base de datos para administradores de sistemas

El mejor escenario es que, en caso de falla de la base de datos, tenga un buen Plan de Recuperación de Desastres (DRP) y un entorno de alta disponibilidad con un proceso de conmutación por error automático, pero... ¿qué sucede si falla por alguna razón inesperada? ¿Qué sucede si necesita realizar una conmutación por error manual? En este blog, compartiremos algunas recomendaciones a seguir en caso de que necesite una conmutación por error de su base de datos.

Comprobaciones de verificación

Antes de realizar cualquier cambio, debe verificar algunas cosas básicas para evitar nuevos problemas después del proceso de conmutación por error.

Estado de replicación

Es posible que, en el momento de la falla, el nodo esclavo no esté actualizado debido a una falla en la red, una carga alta u otro problema, por lo que debe asegurarse de que su el esclavo tiene toda (o casi toda) la información. Si tiene más de un nodo esclavo, también debe verificar cuál es el nodo más avanzado y elegirlo para la conmutación por error.

por ejemplo:vamos a comprobar el estado de replicación en un servidor MariaDB.

MariaDB [(none)]> SHOW SLAVE STATUS\G

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.100.110

Master_User: rpl_user

Master_Port: 3306

Connect_Retry: 10

Master_Log_File: binlog.000014

Read_Master_Log_Pos: 339

Relay_Log_File: relay-bin.000002

Relay_Log_Pos: 635

Relay_Master_Log_File: binlog.000014

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Last_Errno: 0

Skip_Counter: 0

Exec_Master_Log_Pos: 339

Relay_Log_Space: 938

Until_Condition: None

Until_Log_Pos: 0

Master_SSL_Allowed: No

Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

Last_IO_Errno: 0

Last_SQL_Errno: 0

Replicate_Ignore_Server_Ids:

Master_Server_Id: 3001

Using_Gtid: Slave_Pos

Gtid_IO_Pos: 0-3001-20

Parallel_Mode: conservative

SQL_Delay: 0

SQL_Remaining_Delay: NULL

Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it

Slave_DDL_Groups: 0

Slave_Non_Transactional_Groups: 0

Slave_Transactional_Groups: 0

1 row in set (0.000 sec)

En el caso de PostgreSQL, es un poco diferente ya que necesita verificar el estado de los WAL y comparar los aplicados con los obtenidos.

postgres=# SELECT CASE WHEN pg_last_wal_receive_lsn()=pg_last_wal_replay_lsn()

postgres-# THEN 0

postgres-# ELSE EXTRACT (EPOCH FROM now() - pg_last_xact_replay_timestamp())

postgres-# END AS log_delay;

 log_delay

-----------

         0

(1 row)

Credenciales

Antes de ejecutar la conmutación por error, debe verificar si su aplicación/usuarios podrán acceder a su nuevo maestro con las credenciales actuales. Si no está replicando los usuarios de su base de datos, es posible que se hayan cambiado las credenciales, por lo que deberá actualizarlas en los nodos esclavos antes de cualquier cambio.

por ejemplo:puede consultar la tabla de usuarios en la base de datos mysql para comprobar las credenciales de usuario en un servidor MariaDB/MySQL:

MariaDB [(none)]> SELECT Host,User,Password FROM mysql.user;

+-----------------+--------------+-------------------------------------------+

| Host            | User | Password                                  |

+-----------------+--------------+-------------------------------------------+

| localhost       | root | *CD7EC70C2F7DCE88643C97381CB42633118AF8A8 |

| localhost       | mysql | invalid                                   |

| 127.0.0.1       | backupuser | *AC01ED53FA8443BFD3FC7C448F78A6F2C26C3C38 |

| 192.168.100.100 | cmon         | *F80B5EE41D1FB1FA67D83E96FCB1638ABCFB86E2 |

| 127.0.0.1       | root | *CD7EC70C2F7DCE88643C97381CB42633118AF8A8 |

| ::1             | root | *CD7EC70C2F7DCE88643C97381CB42633118AF8A8 |

| localhost       | backupuser | *AC01ED53FA8443BFD3FC7C448F78A6F2C26C3C38 |

| 192.168.100.112 | user1        | *CD7EC70C2F7DCE88643C97381CB42633118AF8A8 |

| localhost       | cmonexporter | *0F7AD3EAF21E28201D311384753810C5066B0964 |

| 127.0.0.1       | cmonexporter | *0F7AD3EAF21E28201D311384753810C5066B0964 |

| ::1             | cmonexporter | *0F7AD3EAF21E28201D311384753810C5066B0964 |

| 192.168.100.110 | rpl_user     | *EEA7B018B16E0201270B3CDC0AF8FC335048DC63 |

+-----------------+--------------+-------------------------------------------+

12 rows in set (0.001 sec)

En el caso de PostgreSQL, puede usar el comando '\du' para conocer los roles, y también debe verificar el archivo de configuración pg_hba.conf para administrar el acceso de los usuarios (no las credenciales). Entonces:

postgres=# \du

                                       List of roles

    Role name     |             Attributes         | Member of

------------------+------------------------------------------------------------+-----------

 admindb          | Superuser, Create role, Create DB                          | {}

 cmon_replication | Replication                                                | {}

 cmonexporter     |                                             | {}

 postgres         | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

 s9smysqlchk      | Superuser, Create role, Create DB                          | {}

Y pg_hba.conf:

# TYPE DATABASE USER ADDRESS METHOD

host replication  cmon_replication  localhost  md5

host  replication  cmon_replication  127.0.0.1/32  md5

host  all  s9smysqlchk  localhost  md5

host  all  s9smysqlchk  127.0.0.1/32  md5

local   all            all                   trust

host    all            all 127.0.0.1/32 trust

Acceso a la red/cortafuegos

Las credenciales no son el único problema posible para acceder a su nuevo maestro. Si el nodo está en otro centro de datos, o si tiene un firewall local para filtrar el tráfico, debe verificar si tiene permiso para acceder o incluso si tiene la ruta de red para llegar al nuevo nodo maestro.

por ejemplo:iptables. Permitamos el tráfico de la red 167.124.57.0/24 y verifiquemos las reglas actuales después de agregarlo:

$ iptables -A INPUT  -s 167.124.57.0/24 -m state --state NEW  -j ACCEPT

$ iptables -L -n

Chain INPUT (policy ACCEPT)

target     prot opt source               destination

ACCEPT     all -- 167.124.57.0/24      0.0.0.0/0 state NEW

Chain FORWARD (policy ACCEPT)

target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination

por ejemplo:rutas. Supongamos que su nuevo nodo maestro está en la red 10.0.0.0/24, su servidor de aplicaciones está en 192.168.100.0/24 y puede llegar a la red remota usando 192.168.100.100, entonces en su servidor de aplicaciones, agregue la ruta correspondiente:

$ route add -net 10.0.0.0/24 gw 192.168.100.100

$ route -n

Kernel IP routing table

Destination     Gateway Genmask         Flags Metric Ref Use Iface

0.0.0.0         192.168.100.1 0.0.0.0         UG 0 0 0 eth0

10.0.0.0        192.168.100.100 255.255.255.0   UG 0 0 0 eth0

169.254.0.0     0.0.0.0 255.255.0.0     U 1027 0 0 eth0

192.168.100.0   0.0.0.0 255.255.255.0   U 0 0 0 eth0

Puntos de acción

Después de verificar todos los puntos mencionados, debería estar listo para realizar las acciones para la conmutación por error de su base de datos.

Nueva dirección IP

Como promoverá un nodo esclavo, la dirección IP maestra cambiará, por lo que deberá cambiarla en su aplicación o acceso de cliente.

Usar un Load Balancer es una excelente manera de evitar este problema/cambio. Después del proceso de conmutación por error, Load Balancer detectará que el maestro anterior está fuera de línea y (según la configuración) enviará el tráfico al nuevo para que lo escriba, por lo que no es necesario que cambie nada en su aplicación.

p. ej.:Veamos un ejemplo de configuración de HAProxy:

listen  haproxy_5433

        bind *:5433

        mode tcp

        timeout client  10800s

        timeout server  10800s

        balance leastconn

        option tcp-check

        server 192.168.100.119 192.168.100.119:5432 check

        server 192.168.100.120 192.168.100.120:5432 check

En este caso, si un nodo está inactivo, HAProxy no enviará tráfico allí y enviará el tráfico solo al nodo disponible.

Reconfigurar los nodos esclavos

Si tiene más de un nodo esclavo, luego de promocionar uno de ellos, debe reconfigurar el resto de los esclavos para conectarse al nuevo maestro. Esta podría ser una tarea que requiere mucho tiempo, según la cantidad de nodos.

Verificar y configurar las copias de seguridad

Después de tener todo en su lugar (nuevo maestro promovido, esclavos reconfigurados, aplicación escribiendo en el nuevo maestro), es importante tomar las medidas necesarias para evitar un nuevo problema, por lo que las copias de seguridad son imprescindibles en Este paso. Lo más probable es que tuviera una política de copias de seguridad ejecutándose antes del incidente (si no es así, debe tenerla segura), por lo que debe verificar si las copias de seguridad aún se están ejecutando o lo harán en la nueva topología. Es posible que tuviera las copias de seguridad ejecutándose en el antiguo maestro o utilizando el nodo esclavo que ahora es el maestro, por lo que debe verificarlo para asegurarse de que su política de copias de seguridad seguirá funcionando después de los cambios.

Supervisión de la base de datos

Cuando realiza un proceso de conmutación por error, la supervisión es imprescindible antes, durante y después del proceso. Con esto, puede prevenir un problema antes de que empeore, detectar un problema inesperado durante la conmutación por error o incluso saber si algo sale mal después. Por ejemplo, debe monitorear si su aplicación puede acceder a su nuevo maestro verificando la cantidad de conexiones activas.

Métricas clave para monitorear

Veamos algunas de las métricas más importantes a tener en cuenta:

  • Retraso de replicación
  • Estado de replicación
  • Número de conexiones
  • Errores/uso de la red
  • Carga del servidor (CPU, Memoria, Disco)
  • Base de datos y registros del sistema

Restaurar

Por supuesto, si algo salió mal, debe poder retroceder. Bloquear el tráfico al nodo anterior y mantenerlo lo más aislado posible podría ser una buena estrategia para esto, por lo que, en caso de que necesite revertir, tendrá el nodo anterior disponible. Si la reversión es después de algunos minutos, dependiendo del tráfico, probablemente necesitará insertar los datos de estos minutos en el maestro anterior, así que asegúrese de tener también su nodo maestro temporal disponible y aislado para tomar esta información y aplicarla nuevamente. .

Automatizar el proceso de conmutación por error con ClusterControl

Al ver todas estas tareas necesarias para realizar una conmutación por error, lo más probable es que desee automatizarla y evitar todo este trabajo manual. Para ello, puede aprovechar algunas de las funciones que ClusterControl puede ofrecerle para diferentes tecnologías de base de datos, como autorrecuperación, copias de seguridad, administración de usuarios, monitoreo, entre otras funciones, todo desde el mismo sistema.

Con ClusterControl puede verificar el estado de la replicación y su retraso, crear o modificar credenciales, conocer el estado de la red y del host, y aún más verificaciones.

Usando ClusterControl también puede realizar diferentes acciones de clúster y nodo, como promover esclavo , reinicie la base de datos y el servidor, agregue o elimine nodos de la base de datos, agregue o elimine nodos del balanceador de carga, reconstruya un esclavo de replicación y más.

Con estas acciones, también puede revertir su conmutación por error si es necesario mediante la reconstrucción y promoción el maestro anterior.

ClusterControl cuenta con servicios de monitoreo y alertas que te ayudan a saber qué está pasando o incluso si algo pasó anteriormente.

También puede usar la sección del tablero para tener una vista más fácil de usar sobre el estado de sus sistemas.

Conclusión

En caso de que falle la base de datos maestra, querrá tener toda la información disponible para tomar las medidas necesarias lo antes posible. Tener un buen DRP es la clave para mantener su sistema funcionando todo (o casi todo) el tiempo. Este DRP debe incluir un proceso de conmutación por error bien documentado para tener un RTO (objetivo de tiempo de recuperación) aceptable para la empresa.