Importante
Este artículo está obsoleto y puede contener información desactualizada. Por favor, consulta la documentación más reciente para obtener la información actualizada.
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. Especificaremos el nombre de nuestro clúster en wsrep_cluster_name. Especificaremos las IPs del otro nodo de MariaDB kb-mariadb-02 y kb-mariadb-arbiter en wsrep_cluster_address. Por último configuraremos la IP del kb-mariadb-01 en wsrep_node_address y el nombre kb-mariadb-01 en wsrep_node_name. Todo esto lo haremos en el fichero /etc/mysql/conf.d/cluster.cnf.
[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, para ello editaremos /etc/mysql/my.cnf.
#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
Especificaremos el nombre de nuestro clúster en wsrep_cluster_name. Especificaremos las IPs del otro nodo de MariaDB kb-mariadb-01 y kb-mariadb-arbiter en wsrep_cluster_address. Por último configuraremos la IP del kb-mariadb-02 en wsrep_node_address y el nombre kb-mariadb-02 en wsrep_node_name. Todo esto lo haremos en el fichero /etc/mysql/conf.d/cluster.cnf.
[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 <info@codership.com> |
| 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 en /etc/default/garb.
# 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 en vi /etc/haproxy/haproxy.cfg.
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’;
Ya tenemos funcionando nuestro clúster de MariaDB con balanceo de carga.