Mysql Galera
Introducción
Actualmente estamos configurando varios servidores con el servicio de Galera Cluster en entornos con MariaDB (MySQL también admite la configuración con Galera Cluster, pero no hemos hecho la prueba). A continuación detallaremos los pasos a seguir para la configuración y uso.
Beneficios
- True Multi-master, Active-Active Cluster Read and write to any node at any time.
- Synchronous Replication No slave lag, no data is lost at node crash.
- Tightly Coupled All nodes hold the same state. No diverged data between nodes allowed.
- Multi-threaded Slave For better performance. For any workload.
- No Master-Slave Failover Operations or Use of VIP.
- Hot Standby No downtime during failover (since there is no failover).
- Automatic Node Provisioning No need to manually back up the database and copy it to the new node.
- Supports InnoDB.
- Transparent to Applications Required no (or minimal changes) to the application.
- No Read and Write Splitting Needed.
- Easy to Use and Deploy.
Instalación MariaDB
Para la instalación de MariaDB, simplemente necesitamos realizar la descarga de los ficheros de binarios y descomprimirlos.
Nos descargamos el tar de ficheros binarios de MariaDB del siguiente enlace:
http://tedeco.fi.upm.es/mirror/mariadb//mariadb-<version>/bintar-linux-systemd-x86_64/mariadb-<version>-linux-systemd-x86_64.tar.gz
Ya solo nos falta descomprimir el fichero y crear un enlace para un carpeta genérica:
cd /usr/local tar -zxf /install/mariadb-10.3.11-linux-systemd-x86_64.tar.gz ln -s mariadb-10.3.11-linux-systemd-x86_64 mysql
Configuración MariaDB
Para configurar correctamente el servicio de MariaDB, la primera vez hace falta realizar una serie de tareas como configurar el usuario o crear la estructura inicial de las Bases de datos.
Las tareas a realizar son las siguientes:
Creamos el usuario # groupadd mysql # useradd -r -g mysql -s /bin/false mysql
Creamos el directorio # cd /var/lib/ # mkdir mysql # chown mysql:mysql mysql # chmod 750 mysql Creamos la estructura inicial # /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/var/lib/mysql
Securizamos la instalación (es necesario que el servicio mysql esté levantado) # /usr/local/mysql/bin/mysqld –user=mysql # /usr/local/mysql/bin/mysql_secure_installation Añadimos los scripts de arranque según si es para SysV o Systemd SysV # cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql.server Systemd # cp /usr/local/mysql/support-files/systemd/mariadb.service
/usr/lib/systemd/system/mariadb.service Nota: Modificar los límites en el fichero de servicio: LimitNOFILE=infinity LimitMEMLOCK=infinity
Una vez realizada la configuración inicial, hace falta crear el fichero de configuración en /etc/my.cnf. Este fichero debe de tener, como mínimo, los siguientes parámetros:
/etc/my.cnf
[mysqld] max_connections=20000 datadir=/var/lib/mysql log_error=/var/log/mysql/mariadb.log
Instalación de Galera Cluster
Una vez esté funcionando el servicio de MySQL/MariaDB, simplemente necesitamos instalar el paquete de Galera desde el repositorio (yum). Este paquete, lo que hace es instalar la librería (conector) de Galera Cluster.
Instalamos la librería desde el repositorio:
# yum install galera
Configuración de Galera Cluster
Una vez instalada la librería, simplemente hace falta añadir la configuración de Galera Cluster en el fichero de configuración de MySQL/MariaDB.
Añadimos la configuración al fichero en /etc/my.cnf. El fichero debe de tener, como mínimo, los siguientes parametros: /etc/my.cnf
[galera] wsrep_on=ON wsrep_provider=/usr/lib64/galera/libgalera_smm.so wsrep_cluster_address="gcomm://<ipsServidoresDelCluster>" binlog_format=row default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 wsrep_cluster_name="<nombreCluster>" bind-address=0.0.0.0 wsrep_node_address="<ipServer>" wsrep_node_name="<nombreServer>" wsrep_sst_method=rsync
NOTA: las IP’s del parámetro “wsrep_cluster_address” han de ir separadas por comas.
Hay que tener en cuenta que, para que puedan conectarse entre sí, los nodos deben poder verse a través de los siguientes puertos:
3306 - MySQL 4567 - Galera communication and replication 4568 - Galera IST 4444 - Galera SST
Inicialización de Galera Cluster
Para la inicialización del cluster, es necesario que haya un nodo que arranque el cluster y luego los demás nodos se van añadiendo. Este paso se realiza cuando se crea el cluster o cada vez que lo reiniciamos parando todos los nodos.
Arranque del Primer Nodo
Segun el tipo de arranque que usemos, será necesario ejecutar un comando u otro (estos comandos internamente ejecutan mysqld –wsrep-new-cluster, asi que tambien lo podríamos levantar de esta manera): SysV # service mysql bootstrap
Systemd # galera_new_cluster
Hay que tener en cuenta que el primer nodo siempre tiene que ser el último que haya parado (en el caso de que sea un reinicio), ya que este será el que tenga los datos más actuales.
Arranque del resto de Nodos
En el caso del resto de nodos, simplemente debemos levantar el servicio de MySQL/MariaDB de la manera habitual. Lo único que hay que tener en cuenta es que tiene que haber la configuración de Galera en el fichero de configuración (/etc/my.cnf): SysV # service mysql start
Systemd # systemctl start mysql
Reinicio de Galera Cluster
Para el reinicio de un cluster de galera hay que tener en cuenta una serie de consideraciones. Tal y como comentamos en el punto anterior, si se paran todos los nodos del cluster, el cluster de Galera deja de existir, y es necesario volver a inicializarlo. Esto no significa que se pierdan los datos, simplemente dejan de estar en cluster.
Para poder levantar el cluster de nuevo, lo primero es determinar cual es el nodo mas actualizado (el que tiene los datos más nuevos) para inicializar el cluster desde este.
Determinar el nodo más actualizado
Para determinar el cluster más actualizado simplemente es necesario ir al directorio de los datos de MySQL (en nuestro caso, /var/lib/mysql) y revisar el fichero grastate.dat. En este fichero aparecen varios parámetros:
GALERA saved state version: 2.1 uuid: e41cf009-2a0a-11e9-9fbd-cb9759847aa4 seqno: 598 safe_to_bootstrap: 0
El parámetro que nos interesa es seqno. El nodo que deberemos arrancar primero será el que tenga el seqno más alto. Si algún nodo ha crasheado el seqno será -1, y en este caso deberemos realizar un recover.
Galera Recovery
Este caso solo será necesario en el caso en que el seqno sea -1 y no podamos averiguar cual es el nodo más actualizado.
Para saber el valor del seqno será necesario levantar el mysql con la opción –wsrep_recover.
SysV # mysqld –wsrep_recover
Systemd # galera_recovery
Lo que hará este parámetro es levantar el mysql, mirar donde se había quedado y volver a parar. El seqno aparecerá en los logs de mysql de la siguiente manera:
[Note] Starting crash recovery... [Note] Crash recovery finished. [Note] Server socket created on IP: '::'. [Note] WSREP: Recovered position: e41cf009-2a0a-11e9-9fbd-cb9759847aa4:598
La información que aparece es “WSREP: Recovered position: <uuid>:<seqno>”
Añadir / Eleminar nodo del Galera Cluster
Tal y como hemos comentado en los anteriores puntos, una vez creado el cluster los demas nodos se pueden agregar o quitar simplemente levantando y parando el servicio de MySQL/MariaDB. Lo único a tener en cuenta es que la configuración de galera esté presente en el fichero de configuración de MySQL (/etc/my.cnf).