Creación cluster Galera MariaDB

    Galera MariaDB nos permite crear un cluster activo-activo de bases de datos MariaDB. Esto significa que todos los nodos funcionan como primarios (activos) por lo que pueden escribir y/o leer indistintamente.
    Para ello, podemos instalar y configurar 2 Raspberry Pi por igual, con diferente IP:

  • RP01 – 10.0.1.71
  • RP02 – 10.0.1.72
  • Mi recomendación es usar siempre 3 nodos como mínimo, pero en un entorno LAB, con 2 es suficiente. Usar 3.

    Lo primero, será instalar el producto y librerías necesarias en ambos equipos:

    apt-get install mariadb-server rsync python3-software-properties -y
    

    Comentamos el parametro bind-address para que mas adelante podamos asignar las respectivas IP’s en el cluster y evitar que MariaSB

    sed -i "s/.*bind-address.*/#bind-address = 127.0.0.1/" /etc/mysql/mariadb.conf.d/50-server.cnf
    

    En RPI01 ejecutaremos:

    cat <<'EOF' > /etc/mysql/conf.d/galera.cnf
    [galera]
    wsrep_on=ON
    wsrep_provider=/usr/lib/galera/libgalera_smm.so
    binlog_format=row
    default_storage_engine=InnoDB
    innodb_autoinc_lock_mode=2
    wsrep_sst_method=rsync
    wsrep_provider_options="gmcast.peer_timeout=PT3S"
    
    wsrep_cluster_address="gcomm://10.0.1.71,10.0.1.72"
    wsrep_node_address=10.0.1.71
    wsrep_node_name="RP01"
    wsrep_notify_cmd="/scripts/galera.sh"
    
    wsrep_cluster_name="CLU01"
    bind-address=10.0.1.71
    EOF
    
    systemctl stop mariadb
    
    galera_new_cluster
    
    systemctl start mariadb
    

    En RPI02 ejecutaremos:

    cat <<'EOF' > /etc/mysql/conf.d/galera.cnf
    [galera]
    wsrep_on=ON
    wsrep_provider=/usr/lib/galera/libgalera_smm.so
    binlog_format=row
    default_storage_engine=InnoDB
    innodb_autoinc_lock_mode=2
    wsrep_sst_method=rsync
    wsrep_provider_options="gmcast.peer_timeout=PT3S"
    
    wsrep_cluster_address="gcomm://10.0.1.71,10.0.1.72"
    wsrep_node_address=10.0.1.72
    wsrep_node_name="RPI02"
    wsrep_notify_cmd="/scripts/galera.sh"
    
    wsrep_cluster_name="CLU01"
    bind-address=10.0.1.72
    EOF
    
    systemctl restart mariadb
    

    Lo tenemos.

    Ahora, lo podremos validar y monitorizar con las siguientes querys de ejemplo:

    SELECT VARIABLE_VALUE as "Núm. nodos" FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME="wsrep_cluster_size"
    
    SHOW STATUS LIKE "wsrep_cluster_size"
    
    SHOW STATUS LIKE "wsrep_cluster_status"
    
    show status like "wsrep%"
    
    SELECT * FROM information_schema.global_status WHERE variable_name IN ("WSREP_CLUSTER_STATUS","WSREP_LOCAL_STATE_COMMENT","WSREP_CLUSTER_SIZE","WSREP_EVS_DELAYED","WSREP_READY")
    

    Es importante monitorizar de forma continua el cluster para evitar mensajes anómalos como el siguiente:

    Process: 12427 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WSREP_START_POSITION (code=exited, status=1/FAILURE)
    [Warning] WSREP: no nodes coming from prim view, prim not possible
    

    En este caso, debemos recuperar las transacciones de los otros nodos por lo que ejecutaremos lo siguiente en el nodo afectado:

    systemctl stop mariadb
    sed -i 's/^safe_to_bootstrap:.*/safe_to_bootstrap: 1/' /var/lib/mysql/grastate.dat
    galera_recovery
    systemctl start mariadb
    

    Leave a Reply

    Your email address will not be published. Required fields are marked *