En este artículo verás como instalar y configurar un clúster de MariaDB con Galera, además podrás añadir un HAProxy para balancear la carga entre los de MariaDB.
Un clúster de MariaDB siempre hay que montarlo con un número impar de nodos. El motivo es sencillo si solo hay dos nodos y uno de los dos falla no hay manera de saber cuál es el corrupto.
Llegado este punto podrás montar un clúster con 3 nodos de MariaDB.
Para este artículo necesitarás usar 4 servidores con Ubuntu 22.04:
- kb-mariadb-01 10.20.10.26
- kb-mariadb-02 10.20.10.27
- kb-mariadb-03 10.20.10.29
- kb-haproxy-mariadb 10.20.10.28
Instalar MYSQL
Para poder configurar el Clúster lo primero que hay que hacer es instalar MYSQL en todos los nodos (En Ubuntu 22 el comando adjunto instala automáticamente galera 4):
# apt update && apt upgrade
# apt -y install mariadb-server
Para añadir seguridad a la instalación de MYSQL podéis ejecutar el siguiente script, a la opción de cambiar la contraseña de root es recomendable marcar la opción "n"
# mysql_secure_installation
Algo a tener en cuenta es que todas las BBDDs tendrán que tener el mismo formato y es recomendable utilizar el formato InnoDB, por ejemplo MyISAM actualmente no es compatible, puedes verificar el formato por defecto con:
# SHOW VARIABLES LIKE 'default_storage_engine';
Si hay alguna BBDD que no sea compatible, puedes utilizar los siguientes comandos:
# MariaDB [(none)]> use database_name;
# MariaDB [(none)]> alter table table_name engine = InnoDB;
Configurar los nodos
Ahora tienes que configurar el clúster, para ello modifica el archivo /etc/mysql/mariadb.conf.d/60-galera.cnf en todos los nodos:
[galera]
wsrep_on = ON # Permite la replicación del conjunto de escritura.
wsrep_provider = /usr/lib/galera/libgalera_smm.so #Especifica la ubicación de la biblioteca wsrep.
wsrep_cluster_name = "Galera Cluster" #Nombre para el clúster.
wsrep_cluster_address = "gcomm://10.20.10.26,10.20.10.27,10.20.10.29" #Define las IPS de los nodos.
binlog_format = row #Formato del binlog, archivo que utiliza para la replicación.
default_storage_engine = InnoDB #Siempre es recomendable este motor o bien XtraDB los demás darán problemas.
innodb_autoinc_lock_mode = 2 #Controla el comportamiento de cómo se bloquean los valores autoincrementales en las tablas InnoDB durante las inserciones.
innodb_force_primary_key = 1 #Requiere clave principal en todas las tablas.
innodb_doublewrite = 1 #Doble búfer de escritura.
# Permitir que el servidor acepte conexiones en todas las interfaces.
bind-address = 0.0.0.0 # Para que MariaDB escuche todos los puertos
# Configuraciones adicionales.
wsrep_slave_threads = 4 #Establece la cantidad de subprocesos que se utilizarán para procesar conjuntos de escritura de otros nodos. Más subprocesos pueden acelerar las replicaciones.
innodb_flush_log_at_trx_commit = 0 #Garantiza que el búfer de registro de InnoDB se escriba en el archivo una vez por segundo, en lugar de cada confirmación de transacción.
wsrep_node_name = SegundoNodo #Establece un nombre para un nodo individual, de modo que pueda identificar fácilmente cada nodo al visualizar los registros.
wsrep_node_address = "10.20.10.27" #Establece la dirección IP para un nodo individual.
# La siguiente línea guardará los mensajes de error en el error.log.
log_error = /var/log/mysql/error.log
Tendrás que modificar:
- Las IPs dentro de wsrep_cluster_address.
- El nombre de cada nodo en wsrep_node_name.
- La IP del nodo utilizado wsrep_node_name.
Ahora procederemos a parar el servicio de MariaDB.
# systemctl stop mariadb
Arrancar clúster
Ya tienes toda la configuración lista, puedes proceder a arrancar el clúster de MariaDB, para ello ejecuta en kb-mariadb-01:
# galera_new_cluster
Ahora reinicia MariaDB en los otros nodos.
# systemctl start mariadb
Puedes ver qué estado ejecutando:
# mysql -u root -p -e "SHOW STATUS LIKE 'wsrep%';"
Enter password:
+-------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+-------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
| wsrep_local_state_uuid | a9d57bc3-f737-11ee-bbf2-3f397ed75daa |
| wsrep_protocol_version | 10 |
| wsrep_last_committed | 3 |
| wsrep_replicated | 0 |
| wsrep_replicated_bytes | 0 |
| wsrep_repl_keys | 0 |
| wsrep_repl_keys_bytes | 0 |
| wsrep_repl_data_bytes | 0 |
| wsrep_repl_other_bytes | 0 |
| wsrep_received | 7 |
| wsrep_received_bytes | 760 |
| wsrep_local_commits | 0 |
| wsrep_local_cert_failures | 0 |
| wsrep_local_replays | 0 |
| wsrep_local_send_queue | 0 |
| wsrep_local_send_queue_max | 1 |
| wsrep_local_send_queue_min | 0 |
| wsrep_local_send_queue_avg | 0 |
| wsrep_local_recv_queue | 0 |
| wsrep_local_recv_queue_max | 2 |
| wsrep_local_recv_queue_min | 0 |
| wsrep_local_recv_queue_avg | 0.142857 |
| wsrep_local_cached_downto | 1 |
| wsrep_flow_control_paused_ns | 0 |
| wsrep_flow_control_paused | 0 |
| wsrep_flow_control_sent | 0 |
| wsrep_flow_control_recv | 0 |
| wsrep_flow_control_active | false |
| wsrep_flow_control_requested | false |
| wsrep_cert_deps_distance | 0 |
| wsrep_apply_oooe | 0 |
| wsrep_apply_oool | 0 |
| wsrep_apply_window | 0 |
| wsrep_apply_waits | 0 |
| wsrep_commit_oooe | 0 |
| wsrep_commit_oool | 0 |
| wsrep_commit_window | 0 |
| wsrep_local_state | 4 |
| wsrep_local_state_comment | Synced |
| wsrep_cert_index_size | 0 |
| wsrep_causal_reads | 0 |
| wsrep_cert_interval | 0 |
| wsrep_open_transactions | 0 |
| wsrep_open_connections | 0 |
| wsrep_incoming_addresses | 10.20.10.26:0,10.20.10.27:0,10.20.10.29:0 |
| wsrep_cluster_weight | 3 |
| wsrep_desync_count | 0 |
| wsrep_evs_delayed | |
| wsrep_evs_evict_list | |
| wsrep_evs_repl_latency | 0/0/0/0/0 |
| wsrep_evs_state | OPERATIONAL |
| wsrep_gcomm_uuid | a9d45264-f737-11ee-85cb-ea88e81c5deb |
| wsrep_gmcast_segment | 0 |
| wsrep_applier_thread_count | 4 |
| wsrep_cluster_capabilities | |
| wsrep_cluster_conf_id | 3 |
| wsrep_cluster_size | 3 |
| wsrep_cluster_state_uuid | a9d57bc3-f737-11ee-bbf2-3f397ed75daa |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON |
| wsrep_local_bf_aborts | 0 |
| wsrep_local_index | 2 |
| wsrep_provider_capabilities | :MULTI_MASTER:CERTIFICATION:PARALLEL_APPLYING:TRX_REPLAY:ISOLATION:PAUSE:CAUSAL_READS:INCREMENTAL_WRITESET:UNORDERED:PREORDERED:STREAMING:NBO: |
| wsrep_provider_name | Galera |
| wsrep_provider_vendor | Codership Oy <info@codership.com> |
| wsrep_provider_version | 4.9(rcece3ba2) |
| wsrep_ready | ON |
| wsrep_rollbacker_thread_count | 1 |
| wsrep_thread_count | 5 |
+-------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
Desde mysql con el comando show status like 'wsrep_cluster_size'; puedes ver directamente que estén los 3 nodos:
MariaDB [(none)]> show status like 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 3 |
+--------------------+-------+
1 row in set (0.001 sec)
Instalar y configurar HAProxy
HAProxy es un software que permite balancear carga entre varios servidores. Se suele usar para balancear servicios web, pero puede balancear cualquier servicio que funcione bajo protocolo TCP. En este caso para balancear carga entre los 3 nodos de MariaDB. Para instalar HAProxy ejecuta:
# apt update
# apt install haproxy
Ahora procede a configurar HAProxy añadiendo el siguiente código en nano/etc/haproxy/haproxy.cfg.
frontend Haproxy
bind *:3306
mode tcp
default_backend galera_cluster
backend galera_cluster
balance roundrobin
mode tcp
option tcpka
option mysql-check user haproxy
server node1 10.20.10.26:3306 check weight 1
server node2 10.20.10.27:3306 check weight 1
server node3 10.20.10.29:3306 check weight 1
frontend stats
bind *:8083
mode http
stats enable
stats refresh 10s
stats uri /stats
stats realm HAProxy\ Statistics
stats auth haproxy:TestKB
Crea un usuario para que HAProxy pueda hacer check contra los 2 nodos, en uno de los 2 nodos por ejemplo haproxy:
MariaDB [(none)]> CREATE USER haproxy@10.20.10.28;
Ahora ve al navegador y abre la web http://IP_Publica_HAProxy:8083/stats, te pedirá usuario y contraseña, introduce haproxy y TestKB.
Ya tienes funcionando el clúster de MariaDB con balanceo de carga.
Recuerda, si tienes consultas sobre esta u otra cuestión relacionada con tus servidores en Clouding, no dudes en escribir a soporte@clouding.io ¡Estamos a tu lado para lo que necesites, consúltanos!