Skip to content

Galera

Galera es un cluster multi master, lo que implica que todos los nodos son maestros, no existen esclavos.

  • Multi maestro
  • Tiene replicación síncrona
  • Se puede leer y escribir en cualquier nodo
  • Tiene un control automático de los nodos, incluso con las caídas.
  • Tiene replicación en paralelo, a nivel de fila
  • No se usan VIPS (ips virtuales)}

Cada proceso o transacción que se realice en un nodo, al realizar un commit, todo se duplica en el resto de nodos. La diferencia entre una réplica asíncrona o semi síncrona y un cluster es:

  1. La replicación tiene un gap en el que no se han realizado cambios, y en los esclavos solo podemos tener lecturas, por otro lado en un cluster, cada instancia es de lectura y escritura a través de los replica sets.

Diferencias

¿Qué diferencia el almacenamiento de galera con otros cluster?

UN ejemplo, es que en galera, cada rack, tiene sus propios datos, mientras que clusters como oracle rac cada proceso ataca a un nodo con datos. Las instancias de datos de galera son replicas entre multiples nodos.

Funcionamiento

La funcionalidad de Galera viene en forma de una librería compartida (WSREP) que se vincula al motor de base de datos.

Consiste de lo siguientes componentes: - WSREP API: interfaz y funciones de acceso a los servidores - WSREP HOOKS: integración de WSREP con el motor de base de datos - GALERA PROVIDER: implementa la API wsrep para Galera - CERTIFICATION: Controla los write sets y realiza la certificación - Write set: es el conjunto de datos que se están manejando. - REPLICATION: gestión de replicación - GCS FRAMEWORK: arquitectura para comunicación de grupo.

Pasted image 20231016213209.png

El proceso de replicación en base de certificación se describe en el siguiente diagrama de funcionamiento.

Pasted image 20231016213540.png

El conjunto de datos modificados es el write set, a este conjunto se comprobaran que no hayan colisiones entre multiples servidores, si el proceso de certificación funciona, e dan los commits, luego los write sets se van a cada servidor y esto realiza un cambio.

Galera trabaja con los global id, una vez llegado a un punto de commit, se genera un vector que se comprueba que los cambios sean validos, si 2 transacciones hacen un cambio en la misma fila, gana el que haya entrado primero en el map. Galera funciona de esta manera, porque es rara la vez que suceda una colisión, pero hay que tener en cuenta que sí pueden suceder las colisiones.

Requisitos

Los requisitos para usar galera son mínimos.

  • Servidor: como mínimo los siguientes requisitos
    • 1 GHz single core CPU
    • 512 MB RAM
    • 100 Mbps network connectivity
  • OS con alguna versión de Linux
  • SWAP en el servidor (o más RAM)
  • Desactivar SELinux para MySQL
  • Permitir el acceso a los puertos 3306, 4567, 4568 y 4444 (son los default)
  • Por lo menos 3 máquinas (pueden ser 3 VM) o 3 computadoras físicas

Información

Algunas páginas en las que podemos encontrar información sobre galera son las siguientes.

Configuración

Usaremos galera para MariaDB, con MariaDB 11.01 o superior, así que iremos a la página de MariaDB con galera con SELinux.

  1. Saber si tenemos o no configurado el entorno de Linux con el comando getenforce
    1. setenforce 0 desactivaría SELinux en la sesión actual, si queremos que se desactive de forma global deberíamos hacer lo siguiente: (ver la documentación del sistema operativo que estemos utilizando, el siguiente ejemplo es para Cent OS 7)
      1. cd /etc/
      2. ls sel*
      3. cd selinx/
      4. nano config
        1. Configurar SELINUX=permissive | targeted | disabled
        2. Si fuera MySQL, se hace con semanage permissive -a mysqld_t
  2. Crear SWAP en disco
    1. Para los que no tengan disco y quieren un fichero como swap swapon -s para ver swaps activas
    2. df -h para ver el espacio disponible
      1. cd /
      2. mkdir swap
      3. cd swap
      4. dd if=/dev/zero of=/swap/swapfile bs=1M count=512
      5. sudo chmod 600 swapfile para darle permisos al fichero de swap
      6. sudo mkswap /swap/swapfile
      7. montar el swap con sudo swapon /swap/swapfile
        1. verificar con swapon -s
        2. nano /etc/fstab
          1. Agregar las lineas /swap/swapfile none swap defaults 0 0 y guardar cambios
    3. Configurar puertos 3306, 4567, 4568 y 4444
      1. Pasted image 20231018190404.png
        1. IST: cuando dos nodos tienen que sincronizarse usan el IST, solo transfiere lo ultimo del cambio
        2. SST: copia completamente un nodo en otro
      2. Abrir puerto 3306 con firewall-cmd --zone=public --add-port=3306/tcp --permanent y repetir para los otros 4 puertos, si se esta usando arch:
        1. Instar ufw sudo pacman -S ufw
          1. sudo ufw enable
          2. sudo ufw allow 3306/tcp
          3. sudo ufw allow 4567/tcp
          4. sudo ufw allow 4568/tcp
          5. sudo ufw allow 4444/tcp
          6. sudo ufw reload
          7. revisar el estado con sudo ufw status
        2. Pasted image 20231018191319.png
          1. Si deseamos des-habilitar el firewall seria los siguientes comandos
            1. sudo ufw disable
            2. sudo systemctl disable ufw
            3. sudo ufw satus
  3. Instalar Galera para MariaDB
    1. sudo pacman -Syu
    2. Instalar MariaDB
      1. sudo pacman -S mariadb
      2. sudo mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
      3. sudo systemctl start mysqld
      4. sudo systemctl enable mysql --now
      5. sudo systemctl status mariadb y se debería ver que esta corriendo y activado
      6. mariadb --version
      7. sudo mysql_secure_installation
    3. Instalar Galera y editar parámetros
      1. sudo pacman -S galera
        1. Obtener el path con ls -l /usr/lib64/ | grep 'galera' y revisar que retorne un valor, ese sera el path de nuestro SWREP, en mi caso devuelve libgalera_smm.so -> galera/libgalera_smm.so asi que para mi el path es/user/lib64/galera/libgalera_smm.so
        2. Usar el comando ip addr para obtener la IP de nuestro computador, en la sección inet, en mi caso, para mi VM es 10.0.2.15 por lo que en el archivo de configuración pondríamos gcomm://10.0.2.15
      2. cd /etc/my.cnf.d/
        1. sudo nano server.cnf y buscar por la sección [galera]
        2. Escribir lo que está en Configuraciones de cluster
      3. Arrancar el Cluster
        1. galera_new_cluster
        2. Comprobar que el cluster funciona
          1. systemctl status mariadb debería mostrar módulos WSREP corriendo y el CGroup corriendo
          2. sudo mysql -u root -p y en la shell de MySQL ejecutar los siguientes comandos
            1. SHOW SCHEMAS;'
            2. USE mysql;
            3. SHOW TABLES; debería mostrar tablas con el nombre wsrep
            4. SELECT * FROM wsrep_cluster; debería mostrar una tabla con 1 único elemento
  4. Agregar nodos
    1. Repetir lo mismo que el paso 1 al 3 con la diferencia que hay que cambiar el wsrep_node_name y wsrep_node_address por valores que sean únicos y no se repitan

Configuraciones de cluster

################################################
################     CLUSTER     ###############
################################################
# enable replication
wsrep_on=ON # set to OFF if needed custom configuration

# point to provider
# point to SWREP library
wsrep_provider=<SWREP_PATH> 

# replication node pointer, for multiple nodes split with comma each node ip
wsrep_cluster_address=gcomm://<IP>

#binlog format
binlog_format=row

# engine
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2

# allow interfaces
# allow by IP on production
bind-address=0.0.0.0

# node config
# nodename, default is server name
wsrep_node_name=<name>
# set an IP
wsrep_node_address=<IP>

EJ

################################################
################     CLUSTER     ###############
################################################
# enable replication
# set to OFF if needed custom configuration
wsrep_on=ON 

# point to provider SWREP
wsrep_provider=/usr/lib/galera/libgalera_smm.so

# CLUSTER NODES
# replication node pointer, split with comma multiple ip connectors
wsrep_cluster_address=gcomm://172.31.47.161

#binlog format
binlog_format=row

# engine
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2

# allow interfaces
# allow by IP on production
bind-address=0.0.0.0

# node config
# nodename, default is server name
wsrep_node_name=node1
wsrep_node_address=172.31.47.161


################################################
##############     END CLUSTER     #############
################################################
################################################
################     CLUSTER     ###############
################################################
[mysqld]
#binlog format
binlog_format=row

[galera]

# enable replication
# set to OFF if needed custom configuration
wsrep_on=ON 

# point to provider SWREP
wsrep_provider=/usr/lib/galera/libgalera_smm.so

# CLUSTER NODES
# replication node pointer, split with comma multiple ip connectors
wsrep_cluster_address=gcomm://172.31.47.161

# allow interfaces
# allow by IP on production
bind-address=0.0.0.0

# node config
# nodename, default is server name
wsrep_node_name=node1
wsrep_node_address=172.31.47.161


################################################
##############     END CLUSTER     #############
################################################