MySQL ha sido durante muchos años, y de hecho sigue siendo, uno de los sistemas de bases de datos más populares y utilizados en el mundo del hosting, aunque hace tiempo apareció un hermano suyo dispuesto quitarle su lugar. MariaDB, al igual que MySQL, es un servicio de manejo de bases de datos, cuenta con licencia GPL y de hecho fue creado por el desarrollador de MySQL, el conocido Monty Widenius, junto a un grupo de desarrolladores que decidieron formar parte del proyecto en forma voluntaria.
MariaDB es a menudo un aliado crucial para PHP, al desarrollar aplicaciones locales. Desafortunadamente no viene instalado por defecto en todas las distribuciones.
A continuación vamos a montar MariaDB y PhpMyAdmin para poder administrar las bases de datos que más adelante nos harán falta para crear un Blog o página web.
# Actualizar el sistema
sudo apt update && sudo apt upgrade -y
# Instalar herramientas necesarias
sudo apt install -y curl software-properties-common dirmngr
# Añadir la clave GPG del repositorio de MariaDB
curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'
# Añadir el repositorio de MariaDB 12.1 (o la versión que prefieras)
sudo sh -c "echo 'deb [signed-by=/etc/apt/keyrings/mariadb-keyring.pgp] https://deb.mariadb.org/12.1/debian trixie main' > /etc/apt/sources.list.d/mariadb.list"
# Refrescar la lista de paquetes
sudo apt update
Vamos a instalar unos cuantos paquetes para que nuestro servidor pueda ofrecernos bases de datos MariaDB del siguiente modo.
sudo apt -y install mariadb-server mariadb-client php-mysql galera-4
Una vez visto esto vamos a configurar MariaDB que formará parte de este servidor Web en el que podremos montar un Blog como WordPress o usar las bases de datos para lo que cada uno quiera.
Lo primero es iniciar MariaDB como root, ya que es el único usuario admitido
sudo su
mysql
Ahora crearemos la base de datos, en mi caso la llamare PruebaSQL.
CREATE DATABASE PruebaSQL;
Ahora crearemos el usuario de la base de datos (mi usuario será usuario y la contraseña será 123456):
CREATE USER 'usuario'@'localhost' IDENTIFIED BY '123456';
Ahora le daremos los privilegios a nuestro usuario a la base de datos creada:
GRANT ALL PRIVILEGES ON *.* TO 'usuario'@'localhost' WITH GRANT OPTION;
Ahora haremos que los cambios tengan efecto:
FLUSH PRIVILEGES;
Salimos de root
exit
y ahora podremos iniciar sesión con nuestro nuevo usuario:
mysql -u usuario -h localhost PruebaSQL -p
vamos a asegurar la instalación.
# Ejecuta el script de seguridad
sudo mariadb-secure-installation
Responde a las preguntas para establecer una contraseña de root, eliminar usuarios anónimos, etc.
Para facilitarnos manejo y la administración de nuestras bases de datos vamos a usar el entorno web PhpMyAdmin, con este software podremos crear, borrar, modificar, dar permisos, bueno podemos hacer todo a lo que se refiere a la administración de bases de datos MySQL. Comenzamos la instalación con el siguiente comando:
sudo apt-get install phpmyadmin php-mysql
Durante la instalación nos preguntara el tipo de servido web que deseamos instalar, elegimos Apache2 y presionamos continuar.
Una vez terminada la instalación abriremos un navegador e introducimos la url de nuestro servidor seguido de la ruta phpmyadmin.
http://localhost/phpmyadmin
Una que vez veamos esta pantalla vamos a configurar el idioma y el nombre de usuario para poder acceder a PhpMyAdmin.
Debeira salir phpmyadmin. El usuario sera root y la contraseña sera la que hayamos elegido anteriormente.
Si no llegara a funcionar ejecutaremos estos 2 comandos:
sudo ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf.d/phpmyadmin.conf
sudo /etc/init.d/apache2 reload
Si siguiese sin funcionar toca reiniciar. En caso de que funcione continuamos.
Respecto al nombre de usuario y el password vamos a introducir el nombre de usuario root y el password que le dimos al administrador de las bases de datos MySQL durante la instalación del sistema.
Puede suceder que hayamos instalado alguna vez MySQL para probar y nunca más lo volvimos a mirar, y dado el momento vamos a necesitarlo de vuelta, pero sorpresa, -"no recuerdo la contraseña". Esto puede ser un inconveniente y si no quieres volver a instalarlo.
Aquí les mostraré cómo acceder al servidor MySQL por la terminal SIN poner password de root, para una vez dentro que puedan cambiar el password de root.
Lo primero será detener el servicio mysql:
# service mysql stop
Esto detuvo el servicio, ahora vamos a iniciarlo pero de forma diferente, una forma que no nos pedirá password luego:
# mysqld_safe --skip-grant-tables &
Listo, ahora accedamos a la terminal de MySQL:
# mysql -u root
Verán que no les pidió password, y que ya entraron a la consola o terminal de MySQL y pueden hacer lo que les plazca, procedamos a cambiar el password del root de MySQL.
Primero entraremos a la base de datos de MySQL como tal:
# use mysql;
Luego, cambiemos el password:
# update user set password=PASSWORD("ElNuevoPassword") where user='root';
Ahora refresquemos los privilegios:
# flush privileges;
Y por último salimos:
# quit;
Listo, ya cambiamos el password del usuario root de MySQL, ahora vamos a detener el servicio e iniciarlo como debe ser:
# service mysql stop
# service mysql start
Esto es todo, ya recuperaron el control de su propio servidor MySQL
Una vez instalado, detenemos el servicio para poder configurarlo antes de iniciarlo como un clúster.
# Detener el servicio para evitar que se inicie de forma normal
sudo systemctl stop mariadb
Este es el nodo que "creará" el clúster. Crearemos un archivo de configuración específico para Galera.
Crea el archivo de configuración:
sudo nano /etc/mysql/mariadb.conf.d/60-galera.cnf
Pega el siguiente contenido. Lee los comentarios para entender cada línea.
# Archivo de configuración base para Galera Cluster
[galera]
# === Configuración obligatoria ===
# Activa el "Write-Set Replication Provider"
wsrep_on=ON
# Especifica la ubicación de la biblioteca de Galera
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# ¡IMPORTANTE! La lista de IPs de los nodos del clúster.
# Para la simulación, usaremos la IP local con puertos diferentes.
wsrep_cluster_address="gcomm://127.0.0.1:4567,127.0.0.1:4568,127.0.0.1:4569"
# Nombre para identificar el clúster
wsrep_cluster_name="mi_cluster_galera"
# Dirección IP de ESTE nodo. Crucial para que los otros lo encuentren.
wsrep_node_address="127.0.0.1:4567" # Puerto para el nodo 1
# Nombre de ESTE nodo (opcional, pero recomendado)
wsrep_node_name="nodo1"
# === Configuración recomendada ===
# Formato de log binario necesario para Galera
binlog_format=ROW
# Motor de almacenamiento por defecto
default_storage_engine=InnoDB
# Desactiva la caché de consultas, no es compatible con Galera
query_cache_size=0
# Permite al nodo recibir conexiones de cualquier IP
bind-address=0.0.0.0
El primer nodo debe iniciarse de una manera especial para que establezca un nuevo clúster.
# Este comando le dice a Galera: "Tú eres el primero, crea un nuevo clúster"
sudo galera_new_cluster
Después de ejecutarlo, puedes verificar que el nodo 1 está activo y que el tamaño del clúster es 1.
# Conéctate al cliente de MariaDB
sudo mariadb -e "SHOW GLOBAL STATUS LIKE 'wsrep_cluster_size';"
# Deberías ver esto:
# +--------------------+-------+
# | Variable_name | Value |
# +--------------------+-------+
# | wsrep_cluster_size | 1 |
# +--------------------+-------+
El primer nodo está vivo y esperando a que otros se unan.
Para simular los otros nodos en la misma máquina, no podemos usar systemctl. En su lugar, los lanzaremos manualmente con mysqld_safe, especificando directorios de datos y puertos diferentes para cada uno.
# Crear directorios para los datos de los nodos 2 y 3
sudo mkdir -p /var/lib/mysql-node2 /var/lib/mysql-node3
# Copiar el contenido inicial de la base de datos
sudo rsync -av /var/lib/mysql/ /var/lib/mysql-node2/
sudo rsync -av /var/lib/mysql/ /var/lib/mysql-node3/
# Asignar permisos correctos
sudo chown -R mysql:mysql /var/lib/mysql-node2 /var/lib/mysql-node3
Lanzaremos una segunda instancia de MariaDB que leerá la configuración de Galera pero sobreescribirá el puerto y el directorio de datos. Puede tardar un poco.
sudo mysqld_safe \
--defaults-file=/etc/mysql/my.cnf \
--wsrep_node_address="127.0.0.1:4568" \
--wsrep_node_name="nodo2" \
--port=3307 \
--datadir=/var/lib/mysql-node2 \
--socket=/run/mysqld/mysqld-node2.sock > /dev/null 2>&1 &
Hacemos lo mismo para el tercer nodo.
sudo mysqld_safe \
--defaults-file=/etc/mysql/my.cnf \
--wsrep_node_address="127.0.0.1:4569" \
--wsrep_node_name="nodo3" \
--port=3308 \
--datadir=/var/lib/mysql-node3 \
--socket=/run/mysqld/mysqld-node3.sock > /dev/null 2>&1 &
Espera unos segundos para que los nuevos nodos se sincronicen con el primero. Ahora, verifica el tamaño del clúster conectándote a cualquiera de los tres nodos.
# Verificar en el nodo 1 (puerto por defecto 3306)
sudo mariadb -e "SHOW GLOBAL STATUS LIKE 'wsrep_cluster_size';"
# Verificar en el nodo 2 (puerto 3307)
sudo mariadb -P 3307 -e "SHOW GLOBAL STATUS LIKE 'wsrep_cluster_size';"
# Verificar en el nodo 3 (puerto 3308)
sudo mariadb -P 3308 -e "SHOW GLOBAL STATUS LIKE 'wsrep_cluster_size';"
En los tres casos, la salida debería ser:
# +--------------------+-------+
# | Variable_name | Value |
# +--------------------+-------+
# | wsrep_cluster_size | 3 |
# +--------------------+-------+
Has configurado y simulado con éxito un clúster MariaDB Galera de 3 nodos en una sola máquina Debian. Ahora, cualquier escritura que hagas en un nodo (por ejemplo, crear una base de datos o una tabla) se replicará instantáneamente en los otros dos
Aquí está el procedimiento que debes seguir cada vez que reinicies tu máquina.
El primer nodo debe iniciarse de una manera especial para que establezca un nuevo "Componente Primario" (es decir, que cree el clúster desde cero).
# Usa este comando especial SOLO para el primer nodo después de un apagado total
sudo galera_new_cluster
Este comando ejecuta systemctl start mariadb con las opciones necesarias para que el nodo1 (el que usa la configuración por defecto) se convierta en el punto de partida del clúster.
Antes de continuar, asegúrate de que el primer nodo se ha iniciado correctamente y se ve a sí mismo como un clúster de tamaño 1.
# Conéctate al nodo 1 (puerto por defecto 3306)
sudo mariadb -e "SHOW GLOBAL STATUS LIKE 'wsrep_cluster_size';"
# La salida debe ser:
# +--------------------+-------+
# | Variable_name | Value |
# +--------------------+-------+
# | wsrep_cluster_size | 1 |
# +--------------------+-------+
Si ves 1, puedes proceder a iniciar los demás nodos.
Ahora, inicia los otros dos nodos de la misma forma que lo hiciste durante la instalación inicial, usando mysqld_safe. Estos nodos detectarán automáticamente el clúster existente creado por el nodo1 y se unirán a él.
sudo mysqld_safe \
--defaults-file=/etc/mysql/my.cnf \
--wsrep_node_address="127.0.0.1:4568" \
--wsrep_node_name="nodo2" \
--port=3307 \
--datadir=/var/lib/mysql-node2 \
--socket=/run/mysqld/mysqld-node2.sock > /dev/null 2>&1 &
sudo mysqld_safe \
--defaults-file=/etc/mysql/my.cnf \
--wsrep_node_address="127.0.0.1:4569" \
--wsrep_node_name="nodo3" \
--port=3308 \
--datadir=/var/lib/mysql-node3 \
--socket=/run/mysqld/mysqld-node3.sock > /dev/null 2>&1 &
Espera unos 10-15 segundos para que los nodos se sincronicen. Luego, comprueba el tamaño del clúster desde cualquier nodo para confirmar que los tres están activos y comunicándose.
# Por ejemplo, desde el nodo 2
sudo mariadb -P 3307 -e "SHOW GLOBAL STATUS LIKE 'wsrep_cluster_size';"
La salida ahora debería mostrar 3, confirmando que tu clúster está completamente operativo de nuevo.