MariaDB Galera Cluster es una solución de replicación sincrónica que asegura alta disponibilidad para bases de datos en entornos críticos como OpenStack Mitaka. A continuación, se detalla su implementación paso a paso.
Características principales
Este clúster ofrece replicación de datos en teimpo real entre todos los nodos, permitiendo operaciones de lectura y escritura en cualquier punto. Cada nodo contiene una copia completa de la base de datos, lo que elimina retardos de sincronización y proporciona tolerancia a fallos. Sin embargo, la adición de nuevos nodos puede bloquear tablas durante la sincronización, y la falta de estabilidad en la red puede causar problemas de consistencia. Solo es compatible con los motores de almacenamiento InnoDB y XtraDB.
Flujo de trabajo
Durante una transacción, los cambios se agrupan en un write-set antes de ser confirmados. Este conjunto se envía a los demás nodos para una verificación basada en claves primarias. Si la verificación es exitosa, la transacción se aplica en todos los nodos; de lo contrario, se descarta.
Proceso de instalación
Realice los siguientes comandos en los tres nodos del clúster:
# instalar paquetes necesarios
sudo yum install MariaDB-Galera-server MariaDB-client galera -y
Después de la instalación, inicie y asegure la base de datos:
# iniciar el servicio
sudo systemctl start mariadb
# ejecutar el script de seguridad
sudo mysql_secure_installation
Cree un usuario para la autenticación del clúster:
# acceder a la base de datos
mysql -u root -p
# en el prompt de MariaDB
GRANT ALL PRIVILEGES ON *.* TO 'cluster_admin'@'%' IDENTIFIED BY 'contraseña_segura' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;
Detenga el servicio en todos los nodos:
sudo systemctl stop mariadb
Configuración del clúster
Edite el archivo de configuración en cada nodo con los parámetros correspondientes. A continuación, un ejemplo para el primer nodo (nodo-db1 con IP 10.0.0.1):
[mariadb]
query_cache_size=0
binlog_format=ROW
default_storage_engine=innodb
innodb_autoinc_lock_mode=2
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address=gcomm://10.0.0.2,10.0.0.3
wsrep_cluster_name='cluster_os'
wsrep_node_address='10.0.0.1'
wsrep_node_name='nodo-db1'
wsrep_sst_method=rsync
wsrep_sst_auth=cluster_admin:contraseña_segura
Para el segundo nodo (nodo-db2 con IP 10.0.0.2):
[mariadb]
query_cache_size=0
binlog_format=ROW
default_storage_engine=innodb
innodb_autoinc_lock_mode=2
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address=gcomm://10.0.0.1,10.0.0.3
wsrep_cluster_name='cluster_os'
wsrep_node_address='10.0.0.2'
wsrep_node_name='nodo-db2'
wsrep_sst_method=rsync
wsrep_sst_auth=cluster_admin:contraseña_segura
Para el tercer nodo (nodo-db3 con IP 10.0.0.3):
[mariadb]
query_cache_size=0
binlog_format=ROW
default_storage_engine=innodb
innodb_autoinc_lock_mode=2
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address=gcomm://10.0.0.1,10.0.0.2
wsrep_cluster_name='cluster_os'
wsrep_node_address='10.0.0.3'
wsrep_node_name='nodo-db3'
wsrep_sst_method=rsync
wsrep_sst_auth=cluster_admin:contraseña_segura
Inicio del clúster
El primer nodo debe iniciarse en modo bootstrap para establecer el clúster:
# en nodo-db1
sudo galera_new_cluster
# en nodo-db2 y nodo-db3
sudo systemctl start mariadb
Verificación del clúster
Conéctese a cualquier nodo y ejecute comandos para verificar el estado:
# acceder a la base de datos
mysql -u root -p
# comprobar el tamaño del clúster
SHOW STATUS LIKE 'wsrep_cluster_size';
# revisar el estado global
SHOW GLOBAL STATUS LIKE 'ws%';
Los valores esperados incluyen: wsrep_cluster_status en Primary, wsrep_ready en ON, y wsrep_cluster_size en 3, indicando un clúster funcional con tres nodos.
Prueba de replicación
Cree una base de datos de prueba y verifique su existencia en otros nodos para confirmar la replicación sincrónica.
# en un nodo
CREATE DATABASE test_db;
# en otro nodo
SHOW DATABASES;
Configuración adicional
Después de configurar el clúster, ajuste los parámetros de rendimiento en el archivo server.cnf. Por ejemplo, para el nodo con IP 10.0.0.1:
[mariadb-10.0]
port = 3306
bind_address = 10.0.0.1
tmpdir = /tmp
skip-external-locking
skip-name-resolve
max_connections = 3600
innodb_flush_log_at_trx_commit = 2
innodb_log_file_size = 100M
innodb_log_files_in_group = 5
thread_concurrency = 24
innodb_thread_concurrency = 24
innodb_commit_concurrency = 24
character-set-server = utf8
collation-server = utf8_general_ci
event_scheduler = ON
max_allowed_packet = 20M
Repita esta configuración en los demás nodos, ajustendo bind_address a sus IPs respectivas.
Nota importante: Si todos los nodos se detienen, reinicie primero el último que se apagó, ya que contendrá los datos más recientes y permitirá una recuperación limpia del clúster.