Clúster de MariaDB con Galera y HAProxy en Ubuntu 18.04

En este artículo os vamos a enseñar como instalar y configurar un clúster de MariaDB con Galera, además añadiremos un HAProxy para balancear la carga entre 2 nodos 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.
Llegados este punto podemos montar nuestro clúster con 3 nodos de MariaDB o 2 nodos + Galera Arbitrator. Galera Arbitrator no participa en la replicación, recibe los mismos datos que todos los demás nodos y participa a la hora de tomar decisiones. Con lo cual si hay un problema en un nodo prevalecerá la respuesta del nodo no corrupto + Galera Arbitrator.

En este artículo vamos a usar 4 servidores con Ubuntu 18.04:

  • kb-mariadb-arbiter 10.20.10.33
  • kb-mariadb-01 10.20.10.34
  • kb-mariadb-02 10.20.10.35
  • kb-haproxy-mariadb 10.20.10.36

Instalar y configurar kb-mariadb-01

Para instalar MariaDB lo primero que haremos es añadir los repositorios de MariaDB correspondientes a Ubuntu 18.04 y luego instalaremos MariaDB:
# apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
# add-apt-repository 'deb [arch=amd64] http://mirror.zol.co.zw/mariadb/repo/10.3/ubuntu bionic main'
# apt update && apt install mariadb-server

Ahora que ya tenemos MariaDB instalado procederemos a configurar el clúster. En la línea 18 especificaremos el nombre de nuestro clúster. En la línea 19 especificaremos las IPs del otro nodo de MariaDB kb-mariadb-02 y kb-mariadb-arbiter. En la línea 27 configuraremos la IP del kb-mariadb-01 y en la línea 28 el nombre kb-mariadb-01.

[mysqld]
query_cache_size=0
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
query_cache_type=0
bind-address=0.0.0.0
innodb_file_per_table
collation-server = utf8_general_ci
init-connect = 'SET NAMES utf8'
character-set-server = utf8
join_buffer_size = 1M
# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
#wsrep_provider_options="gcache.size=32G"
# Galera Cluster Configuration
wsrep_cluster_name="kb_mariadb_cluster"
wsrep_cluster_address="gcomm://10.20.10.35,10.20.10.33"

# Galera Synchronization Congifuration
wsrep_sst_method=rsync
#wsrep_sst_auth=user:pass

# Galera Node Configuration
# ESPECIFICAR LOS DATOS DEL SERVIDOR LOCAL
wsrep_node_address="10.20.10.34"
wsrep_node_name="kb-mariadb-01"

Ahora procederemos a parar el servicio de MariaDB.
# systemctl stop mariadb
Configuraremos variables y haremos que MariaDB escuche en todas las IPs.

#bind-address           = 127.0.0.1
max_connections = 500
expire_logs_days = 5
wait_timeout          = 28800
max_allowed_packet = 1G
connect_timeout = 6

Instalar y configurar kb-mariadb-02

Para instalar MariaDB lo primero que haremos es añadir los repositorios de MariaDB correspondientes a Ubuntu 18.04 y luego instalaremos MariaDB:
# apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
# add-apt-repository 'deb [arch=amd64] http://mirror.zol.co.zw/mariadb/repo/10.3/ubuntu bionic main'
# apt update && apt install mariadb-server

Ahora que ya tenemos MariaDB instalado procederemos a configurar el clúster. En la línea 18 especificaremos el nombre de nuestro clúster. En la línea 19 especificaremos las IPs del otro nodo de MariaDB kb-mariadb-01 y kb-mariadb-arbiter. En la línea 27 configuraremos la IP del kb-mariadb-02 y en la línea 28 el nombre kb-mariadb-02.

[mysqld]
query_cache_size=0
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
query_cache_type=0
bind-address=0.0.0.0
innodb_file_per_table
collation-server = utf8_general_ci
init-connect = 'SET NAMES utf8'
character-set-server = utf8
join_buffer_size = 1M
# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
#wsrep_provider_options="gcache.size=32G"
# Galera Cluster Configuration
wsrep_cluster_name="kb_mariadb_cluster"
wsrep_cluster_address="gcomm://10.20.10.34,10.20.10.33"

# Galera Synchronization Congifuration
wsrep_sst_method=rsync
#wsrep_sst_auth=user:pass

# Galera Node Configuration
# ESPECIFICAR LOS DATOS DEL SERVIDOR LOCAL
wsrep_node_address="10.20.10.35"
wsrep_node_name="kb-mariadb-02"

Ahora procederemos a parar el servicio de MariaDB:
# systemctl stop mariadb

Ahora nos copiaremos los ficheros de configuración de MariaDB del nodo kb-mariadb-01:
# scp 10.20.10.34:/etc/mysql/debian.cnf /etc/mysql/
# scp 10.20.10.34:/etc/mysql/my.cnf /etc/mysql/

Arrancar clúster

Ya tenemos toda la configuración lista, procederemos arrancar el clúster de MariaDB, para ello ejecutaremos en kb-mariadb-01:
# galera_new_cluster
Ahora arrancaremos MariaDB en el segundo nodo kb-mariadb-02:
# systemctl start mariadb
Podemos ver que está funcionando el clúster ejecutando:
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep%';"

+------------------------------+--------------------------------------+
| Variable_name | Value |
+------------------------------+--------------------------------------+
| wsrep_apply_oooe | 0.000000 |
| wsrep_apply_oool | 0.000000 |
| wsrep_apply_window | 0.000000 |
| wsrep_causal_reads | 0 |
| wsrep_cert_deps_distance | 0.000000 |
| wsrep_cert_index_size | 0 |
| wsrep_cert_interval | 0.000000 |
| wsrep_cluster_conf_id | 2 |
| wsrep_cluster_size | 2 |
| wsrep_cluster_state_uuid | 6e923943-9e67-11e9-b2bb-e27d46dd5c77 |
| wsrep_cluster_status | Primary |
| wsrep_cluster_weight | 2 |
| wsrep_commit_oooe | 0.000000 |
| wsrep_commit_oool | 0.000000 |
| wsrep_commit_window | 0.000000 |
| wsrep_connected | ON |
| 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_flow_control_paused | 0.000000 |
| wsrep_flow_control_paused_ns | 0 |
| wsrep_flow_control_recv | 0 |
| wsrep_flow_control_sent | 0 |
| wsrep_gcomm_uuid | 6e912571-9e67-11e9-9021-6b0cd63bb1cd |
| wsrep_incoming_addresses | 10.20.10.34:3306,10.20.10.35:3306 |
| wsrep_last_committed | 0 |
| wsrep_local_bf_aborts | 0 |
| wsrep_local_cached_downto | 18446744073709551615 |
| wsrep_local_cert_failures | 0 |
| wsrep_local_commits | 0 |
| wsrep_local_index | 0 |
| wsrep_local_recv_queue | 0 |
| wsrep_local_recv_queue_avg | 0.000000 |
| wsrep_local_recv_queue_max | 1 |
| wsrep_local_recv_queue_min | 0 |
| wsrep_local_replays | 0 |
| wsrep_local_send_queue | 0 |
| wsrep_local_send_queue_avg | 0.000000 |
| wsrep_local_send_queue_max | 1 |
| wsrep_local_send_queue_min | 0 |
| wsrep_local_state | 4 |
| wsrep_local_state_comment | Synced |
| wsrep_local_state_uuid | 6e923943-9e67-11e9-b2bb-e27d46dd5c77 |
| wsrep_open_connections | 0 |
| wsrep_open_transactions | 0 |
| wsrep_protocol_version | 9 |
| wsrep_provider_name | Galera |
| wsrep_provider_vendor | Codership Oy <[email protected]> |
| wsrep_provider_version | 25.3.26(r3857) |
| wsrep_ready | ON |
| wsrep_received | 6 |
| wsrep_received_bytes | 427 |
| wsrep_repl_data_bytes | 0 |
| wsrep_repl_keys | 0 |
| wsrep_repl_keys_bytes | 0 |
| wsrep_repl_other_bytes | 0 |
| wsrep_replicated | 0 |
| wsrep_replicated_bytes | 0 |
| wsrep_thread_count | 2 |
+------------------------------+--------------------------------------+
61 rows in set (0.004 sec)

Como podemos ver en “wsrep_cluster_size” el clúster está formado por 2 nodos.

Instalar y configurar arbiter

Ahora que ya tenemos nuestros 2 nodos funcionando vamos a configurar un tercero con Galera Arbitrator, como hemos comentado al principio no replicará los datos de MySQL pero si que recibirá los cambios, con lo cual ante una incongruencia en algún nodo ayudará a decidir que nodo no tiene fallos. Para instalar Arbitrator ejecutaremos:
# apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
# add-apt-repository 'deb [arch=amd64] http://mirror.zol.co.zw/mariadb/repo/10.3/ubuntu bionic main'
# apt install galera-arbitrator-3

Ahora crearemos un fichero de configuración indicando los datos del clúster existente:

# Copyright (C) 2012 Coedership Oy
# This config file is to be sourced by garb service script.

# A space-separated list of node addresses (address[:port]) in the cluster
GALERA_NODES="10.20.10.34:4567 10.20.10.35:4567"

# Galera cluster name, should be the same as on the rest of the nodes.
GALERA_GROUP="kb_mariadb_cluster"

# Optional Galera internal options string (e.g. SSL settings)
# see http://www.codership.com/wiki/doku.php?id=galera_parameters
GALERA_OPTIONS="pc.wait_prim=no" 

Ya podemos arrancar y habilitar galera arbitrator:
# systemctl start garb
# systemctl enable garb

Podemos comprobar que se ha añadido arbiter ejecutando en alguno de los 2 nodos con MariaDB:
# mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size';"

+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+

Instalar y configurar HAProxy

HAProxy es un software que nos 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 usaremos HAProxy para balancear carga entre nuestros 2 nodos de MariaDB. Para instalar HAProxy ejecutaremos:
# apt install haproxy
Ahora procederemos a configurar HAProxy añadiendo el siguiente código:

listen stats
        bind *:8083
        mode http
        stats enable
        stats uri /stats
        stats realm HAProxy\ Statistics
        stats auth haproxy:TestKB
# Load Balancing for Galera Cluster
listen kb-galera
     bind *:3306
     balance source
     mode tcp
     option tcpka
     option mysql-check user haproxy
     server kb-mariadb-01 10.20.10.34:3306 check weight 1
     server kb-mariadb-02 10.20.10.35:3306 check weight 1

Crearemos un usuario para que HAProxy pueda hacer check contra los 2 nodos, en uno de los 2 nodos crearemos un usuario haproxy:
MariaDB [(none)]> CREATE USER ‘haproxy’@’10.20.10.36’;

To write a comment on this article, fill out the form below. Fields marked with an asterisk (*) are required.