Alta disponibilidad de base de datos en CentOS 7

CentOS 7 pronto alcanzará su fin de ciclo de vida (EOL). Esta documentación se conserva por propósitos históricos.

Alta disponibilidad en la Base de datos

El objetivo de este apartado es ofrecer una solución completa para HA en entornos de Pandora FMS. Éste es el único modelo HA con soporte oficial para Pandora FMS. Esta solución se proporciona -preinstalada- desde OUM 724 hasta 769. Este sistema reemplaza DRBD y otros sistemas HA recomendados en el pasado (724 y anteriores).

Véase “Migración de entornos HA Corosync-Pacemaker” para actualizar la alta disponibilidad de base de datos utilizada en la versión 770.

Esta es la primera implementación de DB HA de Pandora FMS y el proceso de instalación es manual casi en su totalidad, usando la consola GNU/Linux como root. En versiones futuras facilitaremos la configuración desde la interfaz gráfica (GUI).

Pandora FMS se fundamenta en una base de datos MySQL para configurar y almacenar datos. Un fallo en la base de datos puede paralizar momentáneamente la herramienta de monitorización. El clúster de la base de datos de alta disponibilidad de Pandora FMS permite desplegar fácilmente una arquitectura robusta y tolerante a los fallos.

Se trata de una característica avanzada que requiere conocimientos en sistemas GNU/Linux.

Los recursos de clúster se gestionan con Pacemaker, un gestor de recursos de clúster de alta disponibilidad avanzado y escalable. Corosync proporciona un modelo de comunicación de grupo de proceso cerrado para crear máquinas de estado replicadas. Se eligió a Percona como RDBMS por defecto por su escalabilidad, disponibilidad, seguridad y características de backup.

El replication activo/pasivo se desarrolla desde un nodo maestro único (con permiso de escritura) a cualquier número de secundarios (sólo lectura). Una dirección IP virtual siempre lleva al maestro actual. Si falla el nodo maestro, uno de los secundarios asciende a maestro y se actualiza la dirección IP virtual en consecuencia.

La herramienta de base de datos HA de Pandora FMS, pandora_ha, monitoriza el clúster y se asegura de que el servidor de Pandora FMS está en continuo funcionamiento, reiniciándolo en caso necesario. pandora_ha se monitoriza a su vez con systemd.

Se recomienda mantener 15 días de datos y eventos como máximo, para guardar durante más tiempo se debe configurar una base de datos histórico. Consulte, además, el tema “Gestión y administración de los servidores PFMS”.

En este ejemplo se configurará un clúster de dos nodos, con hosts node1 y node2. Se cambiarán los nombres de host, contraseñas, etc. según lo que necesite para que concuerde con el entorno a implementar.

Versión 759 o anterior.

Los comandos que tengan que ejecutarse en un nodo irán precedidos por el hostname de ese nodo:

node1# <command>

Los comandos que tengan que ejecutarse en todos los nodos irán precedidos de la palabra all:

all# <command>

Hay un host adicional, denominado pandorafms en el que se encuentra o se instalará Pandora FMS.

Cuando se referencie all solo se refiere a los nodos de Base de datos, el nodo adicional Pandora FMS siempre se referenciara como pandorafms y no es parte de all.

Requisitos previos

CentOS 7 pronto alcanzará su fin de ciclo de vida (EOL). Esta documentación se conserva por propósitos históricos.

Se debe instalar CentOS versión 7 en todos los hosts, y deben poder resolver los hostnames de los demás hosts.

 node1# ping node2
 PING node2 (192.168.0.2) 56(84) bytes of data.

 node2# ping node1
 PING node1 (192.168.0.1) 56(84) bytes of data.

 pandorafms# ping node1
 PING node1 (192.168.0.1) 56(84) bytes of data.

 pandorafms# ping node2
 PING node2 (192.168.0.2) 56(84) bytes of data.

Se debe instalar y ejecutar un servidor Open SSH en cada host. Suprimimos el aviso que muestra Open SSH:

all# [ -f /etc/cron.hourly/motd_rebuild ] && rm -f /etc/cron.hourly/motd_rebuild
all# sed -i -e 's/^Banner.*//g' /etc/ssh/sshd_config
all# systemctl restart sshd

La herramienta de base de datos HA de Pandora FMS no funcionará correctamente si Open SSH tiene un aviso configurado.

Generamos nuevas claves de autenticación SSH para cada host y copiamos la clave pública para cada uno de los hosts:

Se pueden generar claves para un usuario que no sea root para una posterior instalación de clúster con usuario “no root”.

node1# echo -e "\n\n\n" | ssh-keygen -t rsa
node1# ssh-copy-id -p22 root@node2
node1# ssh node2

node2# echo -e "\n\n\n" | ssh-keygen -t rsa
node2# ssh-copy-id -p22 root@node1
node2# ssh node1

pandorafms# echo -e "\n\n\n" | ssh-keygen -t rsa
pandorafms# ssh-copy-id -p22 root@node1
pandorafms# ssh-copy-id -p22 root@node2
pandorafms# ssh node1
pandorafms# ssh node2

En el nodo de Pandora FMS, copiamos el par de claves a /usr/share/httpd/.ssh/. La consola de Pandora FMS necesita recuperar el estado del clúster:

 pandorafms# cp -r /root/.ssh/ /usr/share/httpd/
 pandorafms# chown -R apache:apache /usr/share/httpd/.ssh/

Los siguientes pasos son necesarios solo si los nodos ejecutan SSH en un puerto no estándar. Debe sustituir 22 con el número de puerto correcto:

 all# echo -e "Host node1\n    Port 22">> /root/.ssh/config
 all# echo -e "Host node2\n    Port 22">> /root/.ssh/config

Instalación de Percona

Instale el paquete necesario:

 all# yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
 
 all# yum install -y Percona-Server-server-57 percona-xtrabackup-24

Para más información respecto al proceso de instalación de Percona puede consultar la documentación oficial del producto:

Una vez instalados los paquetes, asegúrese de que el servicio Percona está desactivado, ya que lo gestionará el clúster:

all# systemctl disable mysqld

Si el servicio del sistema no está desactivado, el gestor de recursos del clúster no funcionará correctamente.

A continuación, inicie el servidor Percona:

all# systemctl start mysqld

Se generará una nueva contraseña temporal conectada a /var/log/mysqld.log. Conécte al servidor Percona y cambie la contraseña de root:

all# mysql -uroot -p$(grep "temporary password" /var/log/mysqld.log | \
rev | cut -d' ' -f1 | rev)
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('Pandor4!');
mysql> UNINSTALL PLUGIN validate_password;
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('pandora');
mysql> quit

Reinstale el paquete del servidor con la opción ( flag ) ha:

pandorafms# ./pandora_server_installer --install --ha

Una vez instalado el server con las herramientas HA habilitadas, encontrará el generador de configuración para la replicación de base de datos en la ruta: /usr/share/pandora_server/util/myconfig_ha_gen.sh

Example: ./myconfig_ha_gen.sh -i serverid [-l file_location] [-d database] [-b binlog] [-u dbuser] [-p dbpass] [-s poolsize] [-h help]
Mandatory parameters:
       -i --serverid   Set the server id for the database (Mandatory)
Optional parameters:
       -l --location   Set my.cnf custom location including filename. [ default value: /etc/my.cnf ] (optional)
       -d --database   Set the database to be replicated. [ default value: pandora ] (optional)
       -b --binlog     Set binlog file. [ default value: mysql-bin ] (optional)
       -u --dbuser     Set dbuser for mysql connection and backups. [ default value: root ] (optional)
       -p --dbpass     Set dbpassword for mysql connection and backups. [ default value: pandora ] (optional)
       -s --poolsize   Set innodb_buffer_pool_size static size in M (Megabytes) or G (Gigabytes). [ default value: autocalculated ] (optional)
       -h --help       Print help.

En el caso actual en que las bases de datos no están en el mismo servidor que la aplicación, será necesario copiar el script a los nodos para ser ejecutados localmente.

pandorafms# scp /usr/share/pandora_server/util/myconfig_ha_gen.sh root@node1:/root/
pandorafms# scp /usr/share/pandora_server/util/myconfig_ha_gen.sh root@node2:/root/

Solo será necesario pasar el parámetro serverid (obligatorio) en entornos estándar y algunos parámetros opcionales para entornos personalizados.

Si el usuario por defecto o el definido no conecta a la base de datos, el script finalizará dando un error de conexión.

También se tiene la posibilidad de pasar como argumentos la base de datos, el usuario y la contraseña. De no hacerlo se usarán los configurados por defecto.

Para este caso ejecutará en ambos nodos el script solo pasando el server id si tenemos las credenciales por defecto, en caso contrario definir los parámetros necesarios.

 node1# /root/myconfig_ha_gen.sh -i 1
 node2# /root/myconfig_ha_gen.sh -i 2

Importante: Cada nodo debe tener un identificador único

Se escribirá el fichero de configuración de Percona en /etc/my.cnf donde estarán definidos el identificador del server y la configuración recomendada para la replicación de base de datos.

Debe reiniciar el servicio de mysqld para comprobar que la configuración se ha aplicado correctamente.

all# systemctl restart mysqld

Instalación de Pandora FMS

Nueva instalación de Pandora FMS

Instale Pandora FMS en la base de datos recién creada. Detenga el servidor de Pandora FMS:

pandorafms# /etc/init.d/pandora_server stop

A partir de la versión NG 754 dispone de opciones adicionales en el arranque y parada manual de Entornos de Alta Disponibilidad (HA).

Instalación de Pandora FMS existente

Detenga el servidor de Pandora FMS:

pandorafms# /etc/init.d/pandora_server stop

Haga una copia de seguridad de la base de datos de Pandora FMS:

 pandorafms# mysqldump -uroot -ppandora --databases pandora> /tmp/pandoradb.sql
 pandorafms# scp /tmp/pandoradb.sql node1:/tmp/

Ahora cargue la información a la nueva base de datos:

node1# mysql -uroot -ppandora pandora -e source "/tmp/pandoradb.sql"

Configuración de la replicación

Otorgue los privilegios necesarios para la replicación con el fin de trabajar en todas las bases de datos:

all# mysql -uroot -ppandora
mysql> GRANT ALL ON pandora.* TO 'root'@'%' IDENTIFIED BY 'pandora';
mysql> GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.*
TO 'root'@'%' IDENTIFIED BY 'pandora';
mysql> GRANT REPLICATION CLIENT, REPLICATION SLAVE, SUPER, PROCESS, RELOAD ON *.*
TO 'root'@'localhost' IDENTIFIED BY 'pandora';
mysql> GRANT select ON mysql.user TO 'root'@'%' IDENTIFIED BY 'pandora';
mysql> FLUSH PRIVILEGES;
mysql> quit

Haga una copia de seguridad de la base de datos del primer nodo y escriba el nombre y la posición del archivo del log maestro (en el ejemplo,
mysql-bin.000001 y 785):

node1# [ -e /root/pandoradb.bak ] && rm -rf /root/pandoradb.bak
node1# innobackupex --no-timestamp /root/pandoradb.bak/
node1# innobackupex --apply-log /root/pandoradb.bak/
node1# cat /root/pandoradb.bak/xtrabackup_binlog_info
mysql-bin.000001        785

Cargue la base de datos en el segundo nodo y configure para replicar desde el primer nodo (debe configurar MASTER_LOG_FILE y MASTER_LOG_POS a los valores del paso anterior):

node2# systemctl stop mysqld

node1# rsync -avpP -e ssh /root/pandoradb.bak/ node2:/var/lib/mysql/

node2# chown -R mysql:mysql /var/lib/mysql
node2# chcon -R system_u:object_r:mysqld_db_t:s0 /var/lib/mysql
node2# systemctl start mysqld
node2# mysql -uroot -ppandora
mysql> CHANGE MASTER TO MASTER_HOST='node1',
MASTER_USER='root', MASTER_PASSWORD='pandora',
MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=785;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS \G
   *************************** 1. row ***************************
                  Slave_IO_State: Waiting for master to send event
                     Master_Host: node1
                     Master_User: root
                     Master_Port: 3306
                   Connect_Retry: 60
                 Master_Log_File: mysql-bin.000002
             Read_Master_Log_Pos: 785
                  Relay_Log_File: node2-relay-bin.000003
                   Relay_Log_Pos: 998
           Relay_Master_Log_File: mysql-bin.000002
                Slave_IO_Running: Yes
               Slave_SQL_Running: Yes
                 Replicate_Do_DB: pandora
             Replicate_Ignore_DB:
              Replicate_Do_Table:
          Replicate_Ignore_Table:
         Replicate_Wild_Do_Table:
     Replicate_Wild_Ignore_Table:
                      Last_Errno: 0
                      Last_Error:
                    Skip_Counter: 0
             Exec_Master_Log_Pos: 785
                 Relay_Log_Space: 1252
                 Until_Condition: None
                  Until_Log_File:
                   Until_Log_Pos: 0
              Master_SSL_Allowed: No
              Master_SSL_CA_File:
              Master_SSL_CA_Path:
                 Master_SSL_Cert:
               Master_SSL_Cipher:
                  Master_SSL_Key:
           Seconds_Behind_Master: 0
   Master_SSL_Verify_Server_Cert: No
                   Last_IO_Errno: 0
                   Last_IO_Error:
                  Last_SQL_Errno: 0
                  Last_SQL_Error:
     Replicate_Ignore_Server_Ids:
                Master_Server_Id: 1
                     Master_UUID: 580d8bb0-6991-11e8-9a22-16efadb2f150
                Master_Info_File: mysql.slave_master_info
                       SQL_Delay: 0
             SQL_Remaining_Delay: NULL
         Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
              Master_Retry_Count: 86400
                     Master_Bind:
         Last_IO_Error_Timestamp:
        Last_SQL_Error_Timestamp:
                  Master_SSL_Crl:
              Master_SSL_Crlpath:
              Retrieved_Gtid_Set:
               Executed_Gtid_Set:
                   Auto_Position: 0
            Replicate_Rewrite_DB:
                    Channel_Name:
              Master_TLS_Version:
   1 row in set (0.00 sec)
mysql> QUIT

Debe asegurarse de que Slave_IO_Running y Slave_SQL_Running muestran Yes. Otros valores pueden ser diferentes a los del ejemplo.

Se recomienda no utilizar usuario root para la realización de este proceso. Es aconsejable dar permisos a otro usuario encargado de gestionar la base de datos para evitar posibles conflictos.

Configuración del clúster de dos nodos

Instale los paquetes necesarios:

 all# yum install -y epel-release corosync ntp pacemaker pcs

 all# systemctl enable ntpd
 all# systemctl enable corosync
 all# systemctl enable pcsd
 all# cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf
 all# systemctl start ntpd
 all# systemctl start corosync
 all# systemctl start pcsd

Detenga el servidor Percona:

node1# systemctl stop mysqld
node2# systemctl stop mysqld

Autenticación de todos los nodos en el clúster

Crear e iniciar el clúster:

all# echo hapass | passwd hacluster --stdin
node1# pcs cluster auth -u hacluster -p hapass --force node1 node2
node1# pcs cluster setup --force --name pandoraha node1 node2
node1# pcs cluster start --all
node1# pcs cluster enable --all
node1# pcs property set stonith-enabled=false
node1# pcs property set no-quorum-policy=ignore

Comprobación el estado del clúster:

node#1 pcs status
   Cluster name: pandoraha
   Stack: corosync
   Current DC: node1 (version 1.1.18-11.el7_5.2-2b07d5c5a9) - partition with quorum
   Last updated: Fri Jun  8 12:53:49 2018
   Last change: Fri Jun  8 12:53:47 2018 by root via cibadmin on node1

   2 nodes configured
   0 resources configured

   Online: [ node1 node2 ]

   No resources

   Daemon Status:
     corosync: active/disabled
     pacemaker: active/disabled
     pcsd: active/enabled

Ambos nodos deberían estar online
( Online: [ node1 node2 ] ).
Otros valores pueden ser diferentes a los del ejemplo.

Instalación del agente de replicación Pacemaker de Percona

Se puede descargar manualmente desde biblioteca PFMS.

all# cd /usr/lib/ocf/resource.d/
all# mkdir percona
all# cd percona
all# curl -L -o pacemaker_mysql_replication.zip https://pandorafms.com/library/wp-content/uploads/2019/12/pacemaker_mysql_replication.zip
all# unzip pacemaker_mysql_replication.zip
all# rm -f pacemaker_mysql_replication.zip
all# chmod u+x mysql

Configure los recursos del clúster. Sustituir < VIRT_IP > por la dirección IP virtual de preferencia:

Si se ha modificado la contraseña por defecto utilizada en esta guía para el usuario root de la base de datos, conviene actualizar replication_passwd y test_passwd respectivamente.

Los nombres de los recursos del clúster deben ser exactamente los indicados en esta guía ( pandoraip y pandoradb)

node1# export VIP='<VIRT_IP>'

node1# pcs resource create pandoradb ocf:percona:mysql config="/etc/my.cnf" \
pid="/var/run/mysqld/mysqld.pid" socket="/var/lib/mysql/mysql.sock" \
replication_user="root" replication_passwd="pandora" max_slave_lag="60" \
evict_outdated_slaves="false" binary="/usr/sbin/mysqld" datadir="/var/lib/mysql" \
test_user="root" test_passwd="pandora" op start interval="0" timeout="60s" \
op stop interval="0" timeout="60s" op promote timeout="120" op demote timeout="120" \
op monitor role="Master" timeout="30" interval="5" on-fail="restart" op monitor role="Slave" \
timeout="30" interval="10"
node1# pcs resource create pandoraip ocf:heartbeat:IPaddr2 ip=$VIP cidr_netmask=24 \
op monitor interval=20s
node1# pcs resource master master_pandoradb pandoradb meta master-max="1" \
master-node-max="1" clone-max="2" clone-node-max="1" notify="true" \
globally-unique="false" target-role="Master" is-managed="true"
node1# pcs constraint colocation add master master_pandoradb with pandoraip
node1# pcs constraint order promote master_pandoradb then start pandoraip

Comprobación el estado del clúster:

node1# pcs status
   Cluster name: pandoraha
   Stack: corosync
   Current DC: node1 (version 1.1.18-11.el7_5.2-2b07d5c5a9) - partition with quorum
   Last updated: Fri Jun  8 13:02:21 2018
   Last change: Fri Jun  8 13:02:11 2018 by root via cibadmin on node1

   2 nodes configured
   3 resources configured

   Online: [ node1 node2 ]

   Full list of resources:

    Master/Slave Set: master_pandoradb [pandoradb]
        Masters: [ node1 ]
        Slaves: [ node2 ]
    pandoraip      (ocf::heartbeat:IPaddr2):       Started node1

   Daemon Status:
     corosync: active/disabled
     pacemaker: active/disabled
     pcsd: active/enabled

Ambos nodos deberían estar online
( Online: [ node1 node2 ] ).
Otros valores pueden ser diferentes a los del ejemplo.

Configuración del clúster de dos nodos con usuario "no root"

Se realizará de manera similar a la anterior. Se deberá haber copiado las credenciales del usuario, previamente explicado, y se deberán realizar los siguientes pasos:

# All nodes:

 useradd <usuario>
 passwd <usuario>
 usermod -a -G haclient <usuario>

# Enable PCS ACL system
pcs property set enable-acl=true --force

# Create role
pcs acl role create <rol> description="RW role"  write xpath /cib

# Create PCS user - Local user
pcs acl user create <usuario> <rol>

# Login into PCS from ALL nodes
su - <usuario>
pcs status
Username: <usuario>
Password: *****

# Wait for 'Authorized' message, ignore output. Wait a second and retry 'pcs status' command

Volver al Índice de Documentación Pandora FMS