Replicación de base de datos MariaDB con Galera Cluster (master-master)

Instalación y configuración de réplica de base de datos con MariaDB

MariaDB es un motor de base de datos derivado de MySQL con licencia GPL. Oracle compró MySQL y creó MariaDB como reemplazo de MySQL, pero añadiendo más funcionalidades y mejor rendimiento.

MariaDB permite la replicación de datos estándar que se hace con MySQL (replicación asíncrona) y “Galera Cluster” (replicación síncrona).

Galera Cluster es un clúster multi-master síncrono para MariaDB. Por el momento, solo permite replicación de bases de datos XtraDB/InnoDB. Para MyISAM todavía está en fase experimental.

Características:

  • Replicación síncrona.
  • Topología multi master (activo-activo).
  • Leer y escribir en cualquier nodo del clúster.
  • Control automático de nodo, de manera que si un nodo falla, se saca del clúster.
  • Conexión automática de nodos.
  • Replicación paralela real, a nivel de fila.
  • Conexiones directas de clientes, aspecto nativo de MariaDB.

Beneficios:

Las características anteriores ofrecen varios beneficios para una solución de clúster de base de datos, que incluye:

  • Esclavos sin retardo
  • No se pierden transacciones
  • Escalabilidad de lectura y escritura
  • Latencias de cliente más pequeñas

Podéis ver más información aquí: https://mariadb.com/kb/en/mariadb/what-is-mariadb-galera-cluster/

NOTA 1: Con la replicación estándar de MySQL, debíamos tener cuidado si tenemos IDs de tipo AUTO INCREMENT en nuestra base de datos. Para ello, teníamos que configurar “en cada máquina” los valores “auto_increment” y “auto_increment_offset”. Con Galera Cluster no es necesario, ya que con la configuración por defecto, es capaz de gestionar el AUTO INCREMENT. Esto lo calcula porque conoce exactamente cuántas máquinas hay en el cluster y aplica el valor AUTO INCREMENT que necesita automáticamente. Podéis ver más información aquí: https://mariadb.com/kb/en/mariadb/galera-cluster-system-variables/

NOTA 2: Es muy importante tener en cuenta que Galera Clúster sincronizará TODAS las bases de datos que tengas en MariaDB. De hecho, si creas una base de datos nueva, se creará también en el resto de servidores del clúster. Por tanto, si tienes bases de datos que no quieres sincronizar en la misma máquina, tienes dos opciones:

  1. Hacer una instalación independiente de MariaDB y Galera Cluster en máquinas aisladas para este fin.
  2. Utilizar la sincronización estándar y olvidarte de Galera Cluster. Con la sincronización estándar sí puedes especificar las bases de datos que quieres sincronizar.

En mi caso, tenía dos servidores web con Plesk y la base de datos de mi aplicación y yo sólo quería replicar esta última. Para que no me replicara la base de datos de Plesk, tuve que hacer el montaje de la primera opción, ya que si no, Plesk me daba errores continuamente.

Instalación de Galera Cluster

Dependiendo de la versión de MariaDB instalada, se deberá descargar Galera Cluster o no, ya que a partir de MariaDB 10.1, ya se incluye de forma predeterminada. En caso de disponer de una versión anterior, será necesario descargar e instalar de forma manual Galera Cluster o  actualizar a MariaDB 10.1.

En mi instalación actual de servidores dispongo de Centos 7 + Panel Plesk. Esta instalación venía con MariaDB 5.5, por lo que he decidido actualizar a MariaDB 10.1.19 (la última estable a fecha 15/12/2016). En caso de no tener todavía MariaDB instalada, podéis seguir los mismos pasos que detallo a continuación:

# yum update

Crear repositorio de MariaDB 10:

vi /etc/yum.repos.d/MariaDB10.repo

Escribir el siguiente contenido y guardar el archivo:

# MariaDB 10.1 CentOS repository list - created 2016-01-18 09:58 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

Parar el motor de MariaDB (en caso de tener una versión anterior instalada):

# systemctl stop mariadb

Instalar la última versión de MariaDB:

# yum -y install MariaDB-server MariaDB-client

Arrancamos MariaDB:

# systemctl start mariadb

Para terminar, ejecutamos el comando Upgrade para actualizar MariaDB:

# mysql_upgrade -uadmin -p`cat /etc/psa/.psa.shadow`

NOTA: Si tenéis MariaDB 5.5 y no podéis actualizar a 10.1, necesitaréis descargar e instalar Galera Cluster manualmente. Para ello, podéis descargarlo desde aquí: https://mariadb.com/kb/en/mariadb/mariadb-galera-cluster-10028-release-notes/

En caso de tener MariaDB 5.1 y querer actualizar a la 10.1, se requiere actualizar primero a la 5.5 y después a la 10.1.

Configurando SELinux

Para que la réplica funcione, debemos configurar las políticas de SELinux o desactivarlo. En nuestro caso lo tenemos desactivado. Podéis echar un vistazo al fichero /etc/selinux/config para ver si lo tenéis activado. También podéis ver más información aquí: https://kb.plesk.com/es/115626 y aquí: http://galeracluster.com/documentation-webpages/selinux.html.

Configuración de réplica en dos servidores (master-master)

Aunque vamos a ver un ejemplo de réplica entre dos servidores, podréis añadir más nodos sin problema.

Cada nodo del clúster necesita tener una configuración parecida. Por ello, haremos toda la configuración en la primera máquina y luego la copiaremos al otro nodo.
En nuestro caso, MariaDB está configurada para comprobar el directorio “/etc/my.cnf.d/”. Si no tenéis este directorio, puede que lo tengáis en “/etc/mysql/conf.d“. El siguiente paso será crear un nuevo fichero con el nombre que queramos y con extensión .cnf, en el que aplicaremos toda la configuración necesaria.

# vi /etc/my.cnf.d/cluster.cnf

Insertar la siguiente información (NO COPIES Y PEGUES DESDE AQUÍ, ES MUY PROBABLE QUE NO ARRANQUE EL SERVICIO. ESCRÍBELO TODO A MANO):

[galera]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0

# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so

# Galera Cluster Configuration
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://10.0.0.1,10.0.0.2"

# Galera Synchronization Configuration
wsrep_sst_method=rsync

# Galera Node Configuration
wsrep_node_address="10.0.0.1"
wsrep_node_name="node1"

Configuración Galera Cluster

 

Solamente deberéis modificar los campos marcados en rojo según la configuración que necesitéis.

En wsrep_cluster_name podéis especificar el nombre que queráis y en wsrep_cluster_address las direcciones IP de cada una de las máquinas que conforman el clúster separadas por comas.

En nuestro caso, cada una de las máquinas tienen una IP privada, por lo que especificamos la 10.0.0.1 para una máquina y la 10.0.0.2 para la otra.
Es importante poner también la dirección IP del nodo y el nombre del nodo en los dos últimos campos.

En el siguiente paso debemos lanzar un comando u otro dependiendo de la versión de MariaDB. Para versiones anteriores a la 10.1.8, debemos lanzar el siguiente comando:

# service mariadb start -wesrep-new-cluster

Para versiones 10.1.8 o superior, lanzamos simplemente:

# galera_new_cluster

Para terminar el proceso, arrancamos MariaDB en el primer nodo. En caso de tener el proceso en marcha, lo paramos primero (service mariadb stop).

# service mariadb start

Si arranca correctamente sin dar ningún error, podemos revisar si los puertos están escuchando correctamente:

# netstat -ntpl | grep sql

Deberían aparecer a la escucha los puertos 3306 y 4567.

mariadb2

En caso de que aparezca algún error al arrancar el servicio, ejecutamos el siguiente comando para comprobar qué es lo que falla:

# systemctl status mariadb.service -l

En nuestro caso, nos decía “connection timed out”:

mariadb connection timeout

 

El problema era debido a que habíamos copiado y pegado los parámetros desde un documento externo al cluster.cnf y las dobles comillas de cada parámetro las había puesto de otra manera. Cuidado con esto, si no queréis tener problemas aconsejo escribirlo todo a mano.

Ahora configuramos el fichero en el segundo nodo exactamente igual que en el primero, cambiando solamente las dos últimas líneas (wsrep_node_address y wsrep_node_name).

Y arrancamos MariaDB.

# service mariadb start

NOTA: El comando # galera_new_cluster solo debe ser lanzado en la máquina primaria, no se debe lanzar en el resto.

Abrir puertos para que haya comunicación entre los nodos

En caso de que la conexión falle, es posible que sea porque no se está permitiendo el acceso a estos dos puertos, y debemos abrirlos en el Firewall.

Los puertos que deberían estar abiertos son el 3306 y 4567.

Comandos para comprobar la replicación

# SHOW STATUS LIKE 'wsrep%';

Podéis ver todas las variables de estado del clúster en la siguiente dirección: https://mariadb.com/kb/en/mariadb/galera-cluster-status-variables/

Probando la replicación

Escribiendo en el primer nodo

  1. Creamos una base de datos en el primer nodo:
galera_nodo1# CREATE DATABASE galera;
  1. Creamos una tabla:
galera_nodo1# CREATE TABLE galera.test (id INT NOT NULL AUTO_INCREMENT, marca VARCHAR(50), modelo VARCHAR(50), color VARCHAR(30), PRIMARY KEY(id));
  1. Insertamos una fila en la tabla:
galera_nodo1# INSERT INTO galera.test (marca, modelo, color) values ("Seat", "Ibiza", "Gris");
  1. Comprobamos que la fila se ha insertado correctamente:
galera_nodo1# SELECT * FROM test;

bbdd1

 

Leyendo y escribiendo en el segundo nodo

  1. Comprobamos que la tabla y fila creada en el primer nodo ha sido creado en el segundo nodo:
galera_node2# SELECT * FROM test;

bbdd3

 

  1. Insertamos una fila en la tabla:
galera_nodo2# INSERT INTO galera.test (marca, modelo, color) values ("Ford", "Fiesta", "Azul");
  1. Comprobamos que la fila se ha insertado correctamente:
galera_nodo2# SELECT * FROM test;

bbdd4

 

Leyendo de nuevo en el primer nodo

Comprobamos que la fila insertada en el segundo nodo, se ha replicado en el primer nodo:

galera_node1# SELECT * FROM test;

bbdd5

 

Como podéis ver, Galera Cluster gestiona automáticamente el AUTO_INCREMENT para los IDs. Según el número de nodos del cluster, sabe cómo gestionar este valor. En nuestro caso, a veces hace saltos de 1, a veces de 2 y a veces de 3. Esto es debido a que Galera trabaja pensando que hay un mínimo de 3 nodos, aunque nosotros tengamos solo 2.

Conclusión

Galera Cluster es una muy buena herramienta, ya que replica los datos de manera síncrona y no tenemos que preocuparos por la posible pérdida de datos.

Documentación de apoyo:

Replicación de base de datos MariaDB con Galera Cluster (master-master)
Valora este post

Rubén González Platas

Programador web. Ayudo a empresas y emprendedores a crear su web corporativa y canal de venta online. ¿Tienes un proyecto en mente y no sabes cómo llevarlo a cabo? Contacta conmigo y te ayudaré.

2 comentarios en “Replicación de base de datos MariaDB con Galera Cluster (master-master)

  1. Buenas tardes. pongo exactemente como dices la configuración, pero mariaDB no inicia en la estación, pero si le activo el galera new cluster ahi si funciona, pero no puedo comprobar que la replicación este bien.

    • Hola Samuel,
      “galera new cluster” solo deberías hacerlo en la primera máquina. Si dices que MariaDB no inicia en la estación, puedes lanzar el comando que pone en la guía: systemctl status mariadb.service -l, a ver si te da información respecto al error.
      En cuanto a cómo probar la replicación, tienes al final del artículo algunos comandos, pero puedes utilizar cualquier gestor de MySQL, crear una fila o una nueva base de datos y comprobar que se crea también en la otra máquina automáticamente.

      Un saludo.

Deja un comentario