Mysql Galera

De notas.romsolutions.es
Ir a la navegación Ir a la búsqueda

Introducción

Actualmente estamos configurando varios servidores con el servicio de Galera Cluster en entornos con MariaDB (MySQL también admite la configuración con Galera Cluster, pero no hemos hecho la prueba). A continuación detallaremos los pasos a seguir para la configuración y uso.

Beneficios

  • True Multi-master, Active-Active Cluster Read and write to any node at any time.
  • Synchronous Replication No slave lag, no data is lost at node crash.
  • Tightly Coupled All nodes hold the same state. No diverged data between nodes allowed.
  • Multi-threaded Slave For better performance. For any workload.
  • No Master-Slave Failover Operations or Use of VIP.
  • Hot Standby No downtime during failover (since there is no failover).
  • Automatic Node Provisioning No need to manually back up the database and copy it to the new node.
  • Supports InnoDB.
  • Transparent to Applications Required no (or minimal changes) to the application.
  • No Read and Write Splitting Needed.
  • Easy to Use and Deploy.

Instalación MariaDB

Para la instalación de MariaDB, simplemente necesitamos realizar la descarga de los ficheros de binarios y descomprimirlos.

Nos descargamos el tar de ficheros binarios de MariaDB del siguiente enlace:

http://tedeco.fi.upm.es/mirror/mariadb//mariadb-<version>/bintar-linux-systemd-x86_64/mariadb-<version>-linux-systemd-x86_64.tar.gz

Ya solo nos falta descomprimir el fichero y crear un enlace para un carpeta genérica:

cd /usr/local
tar -zxf /install/mariadb-10.3.11-linux-systemd-x86_64.tar.gz
ln -s mariadb-10.3.11-linux-systemd-x86_64 mysql

Configuración MariaDB

Para configurar correctamente el servicio de MariaDB, la primera vez hace falta realizar una serie de tareas como configurar el usuario o crear la estructura inicial de las Bases de datos.

Las tareas a realizar son las siguientes:

   Creamos el usuario
   # groupadd mysql
   # useradd -r -g mysql -s /bin/false mysql
   Creamos el directorio 
   # cd /var/lib/
   # mkdir mysql
   # chown mysql:mysql mysql
   # chmod 750 mysql
   
   Creamos la estructura inicial
   # /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/var/lib/mysql
   Securizamos la instalación (es necesario que el servicio mysql esté levantado)
   # /usr/local/mysql/bin/mysqld –user=mysql
   # /usr/local/mysql/bin/mysql_secure_installation
   
   Añadimos los scripts de arranque según si es para SysV o Systemd
   SysV
   # cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql.server
   Systemd
   # cp /usr/local/mysql/support-files/systemd/mariadb.service 
/usr/lib/systemd/system/mariadb.service
   Nota: Modificar los límites en el fichero de servicio: 
   LimitNOFILE=infinity
   LimitMEMLOCK=infinity

Una vez realizada la configuración inicial, hace falta crear el fichero de configuración en /etc/my.cnf. Este fichero debe de tener, como mínimo, los siguientes parámetros:

/etc/my.cnf

[mysqld]
  max_connections=20000
  datadir=/var/lib/mysql
  log_error=/var/log/mysql/mariadb.log




Instalación de Galera Cluster

Una vez esté funcionando el servicio de MySQL/MariaDB, simplemente necesitamos instalar el paquete de Galera desde el repositorio (yum). Este paquete, lo que hace es instalar la librería (conector) de Galera Cluster.

Instalamos la librería desde el repositorio:

   # yum install galera

Configuración de Galera Cluster

Una vez instalada la librería, simplemente hace falta añadir la configuración de Galera Cluster en el fichero de configuración de MySQL/MariaDB.

Añadimos la configuración al fichero en /etc/my.cnf. El fichero debe de tener, como mínimo, los siguientes parametros: /etc/my.cnf

[galera]
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://<ipsServidoresDelCluster>"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
wsrep_cluster_name="<nombreCluster>"
bind-address=0.0.0.0
wsrep_node_address="<ipServer>"
wsrep_node_name="<nombreServer>"
wsrep_sst_method=rsync

NOTA: las IP’s del parámetro “wsrep_cluster_address” han de ir separadas por comas.

Hay que tener en cuenta que, para que puedan conectarse entre sí, los nodos deben poder verse a través de los siguientes puertos:

3306 - MySQL
4567 - Galera communication and replication
4568 - Galera IST
4444 - Galera SST

Inicialización de Galera Cluster

Para la inicialización del cluster, es necesario que haya un nodo que arranque el cluster y luego los demás nodos se van añadiendo. Este paso se realiza cuando se crea el cluster o cada vez que lo reiniciamos parando todos los nodos.

Arranque del Primer Nodo

Segun el tipo de arranque que usemos, será necesario ejecutar un comando u otro (estos comandos internamente ejecutan mysqld –wsrep-new-cluster, asi que tambien lo podríamos levantar de esta manera):
   SysV
   # service mysql bootstrap
   Systemd
   # galera_new_cluster

Hay que tener en cuenta que el primer nodo siempre tiene que ser el último que haya parado (en el caso de que sea un reinicio), ya que este será el que tenga los datos más actuales.

Arranque del resto de Nodos

En el caso del resto de nodos, simplemente debemos levantar el servicio de MySQL/MariaDB de la manera habitual. Lo único que hay que tener en cuenta es que tiene que haber la configuración de Galera en el fichero de configuración  (/etc/my.cnf):
   SysV
   # service mysql start
   Systemd
   # systemctl start mysql

Reinicio de Galera Cluster

Para el reinicio de un cluster de galera hay que tener en cuenta una serie de consideraciones. 
Tal y como comentamos en el punto anterior, si se paran todos los nodos del cluster, el cluster de Galera deja de existir, y es necesario volver a inicializarlo. Esto no significa que se pierdan los datos, simplemente dejan de estar en  cluster.
Para poder levantar el cluster de nuevo, lo primero es determinar cual es el nodo mas actualizado (el que tiene los datos más nuevos) para inicializar el cluster desde este.

Determinar el nodo más actualizado

Para determinar el cluster más actualizado simplemente es necesario ir al directorio de los datos de MySQL (en nuestro caso, /var/lib/mysql) y revisar el fichero grastate.dat. En este fichero aparecen varios parámetros:

GALERA saved state
version: 2.1
uuid:    e41cf009-2a0a-11e9-9fbd-cb9759847aa4
seqno:   598
safe_to_bootstrap: 0
El parámetro que nos interesa es seqno. El nodo que deberemos arrancar primero será el que tenga el seqno más alto. 
Si algún nodo ha crasheado el seqno será -1, y en este caso deberemos realizar un recover.


Galera Recovery

Este caso solo será necesario en el caso en que el seqno sea -1 y no podamos averiguar cual es el nodo más actualizado.

Para saber el valor del seqno será necesario levantar el mysql con la opción –wsrep_recover.

   SysV
   # mysqld –wsrep_recover
   Systemd
   # galera_recovery

Lo que hará este parámetro es levantar el mysql, mirar donde se había quedado y volver a parar. El seqno aparecerá en los logs de mysql de la siguiente manera:

[Note] Starting crash recovery...
[Note] Crash recovery finished.
[Note] Server socket created on IP: '::'.
[Note] WSREP: Recovered position: e41cf009-2a0a-11e9-9fbd-cb9759847aa4:598
La información que aparece es  “WSREP: Recovered position: <uuid>:<seqno>”

Añadir / Eleminar nodo del Galera Cluster

Tal y como hemos comentado en los anteriores puntos, una vez creado el cluster los demas nodos se pueden agregar o quitar simplemente levantando y parando el servicio de MySQL/MariaDB. Lo único a tener en cuenta es que la configuración de galera esté presente en el fichero de configuración de MySQL (/etc/my.cnf).