Aprendamos a instalar y configurar MariaDB, un popular sistema de gestión de bases de datos relacionales (RDBMS) MySQL de código abierto.

Está desarrollado por la comunidad y tiene la opción de soporte comercial. MariaDB ha sido concebido para ser altamente compatible con MySQL aunque existen algunas desviaciones.

En este artículo, cubriremos la instalación y configuración de MariaDB en Ubuntu 20.x y CentOS 7.x/8.x y al final revisaremos algunas de las mejores prácticas para asegurar y mejorar su rendimiento.

MariaDB en Ubuntu

En Ubuntu 20.x, MariaDB está disponible directamente desde sus repositorios por defecto. Utilizaremos apt para esta tarea.

Primero actualice los datos de los repositorios apt mediante:

$ sudo apt update

Una vez actualizados los datos de los repositorios, ejecute:

$ sudo apt install mariadb-server

Esto instalará MariaDB y los paquetes necesarios. Confirme con ‘Y’ cualquier pregunta que le aparezca durante la ejecución del comando anterior.

¿Desea continuar? [S/n] Y

MariaDB en CentOS 7.x

Para CentOS 7.x, la versión de MariaDB disponible en el repositorio por defecto de CentOS es la 5.x. Vamos a instalar la última versión disponible de MariaDB.

Para ello, necesitamos configurar primero un repositorio yum adicional. MariaDB proporciona una forma sencilla de utilizar el script mariadb_repo_setup. Para obtener la configuración del repositorio, ejecute los siguientes comandos en su sistema CentOS 7.x:

$ sudo yum install wget
$ wget https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
$ chmod x mariadb_repo_setup
$ sudo ./mariadb_repo_setup

Este script configurará el repositorio yum necesario para instalar la última versión de MariaDB automáticamente. En el momento de escribir este artículo, es la 10.x.

O en caso de que quiera ir por el camino manual, puede configurar un repositorio yum manual creando un nuevo archivo repo como:

$ sudo vi /etc/yum.repos.d/MariaDB.repo

A continuación, añada los siguientes detalles al archivo repo y guárdelo:

[mariadb]
nombre = MariaDB
baseurl = http://yum.mariadb.org/10.5/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

Ahora para instalar MariaDB, ejecute el siguiente comando:

$ sudo yum install MariaDB-server

Confirme cualquier pregunta que aparezca durante la instalación introduciendo ‘y’:

¿Está bien [y/d/N]: y

Esto completa la instalación del servidor MariaDB y los paquetes dependientes.

MariaDB en CentOS 8.x

Para CentOS 8.x, la versión disponible en los repositorios por defecto es la 10.3 o posterior. Podemos instalar directamente MariaDB utilizando el comando DNF:

sudo dnf install mariadb-server

Si no, para obtener la última versión disponible, puede seguir el camino manual como se indica en la sección anterior para CentOS 7.x y con eso debería funcionar.

Iniciando MariaDB

En una máquina Ubuntu, tendrá el servicio MariaDB funcionando justo después de la instalación mientras que para CentOS, tenemos que habilitar e iniciar manualmente los servicios pertinentes.

En cualquier caso, tanto para Ubuntu como para CentOS, ejecute los siguientes comandos para iniciar el servicio MariaDB, habilitarlo en el arranque y verificarlo:

$ sudo systemctl start mariadb.service
$ sudo systemctl enable mariadb.service
$ sudo systemctl status mariadb.service

Salida:

$ sudo systemctl start mariadb.service
$ sudo systemctl enable mariadb.service
Creado enlace simbólico de /etc/systemd/system/multi-user.target.wants/mariadb.service a /usr/lib/systemd/system/mariadb.service.
$ sudo systemctl status mariadb.service
● mariadb.service - Servidor de base de datos MariaDB 10.5.8
   Cargado: cargado (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
  Cargado /etc/systemd/system/mariadb.service.d
           └─migrated-from-my.cnf-settings.conf
   Activo: activo (en ejecución) desde jue 2020-12-31 13:20:04 IST; hace 13s
     Documentación: man:mariadbd(8)
           https://mariadb.com/kb/en/library/systemd/
 PID principal: 13521 (mariadbd)
   Estado: "Tomando sus peticiones SQL ahora..."
   Grupo CG: /system.slice/mariadb.service
           └─13521 /usr/sbin/mariadbd

Dec 31 13:20:04 centos7vm mariadbd<x><x><x><x><x><x><x><x>[13521]</x></x></x></x></x></x></x></x>: 2020-12-31 13:20:04 0 [Nota] InnoDB: 10.5.8 iniciado; número de secuencia de registro 45118; id de transacción 20
Dec 31 13:20:04 centos7vm mariadbd<x><x><x><x><x><x><x><x>[13521]</x></x></x></x></x></x></x></x>: 2020-12-31 13:20:04 0 [Nota] El plugin 'FEEDBACK' está desactivado.
Dec 31 13:20:04 centos7vm mariadbd<x><x><x><x><x><x><x><x>[13521]</x></x></x></x></x></x></x></x>: 2020-12-31 13:20:04 0 [Nota] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
Dec 31 13:20:04 centos7vm mariadbd<x><x><x><x><x><x><x><x>[13521]</x></x></x></x></x></x></x></x>: 2020-12-31 13:20:04 0 [Nota] InnoDB: Carga de pool(s) de buffer completada en 201231 13:20:04
Dec 31 13:20:04 centos7vm mariadbd<x><x><x><x><x><x><x><x>[13521]</x></x></x></x></x></x></x></x>: 2020-12-31 13:20:04 0 [Nota] Socket de servidor creado en IP: '::'.
Dec 31 13:20:04 centos7vm mariadbd<x><x><x><x><x><x><x><x>[13521]</x></x></x></x></x></x></x></x>: 2020-12-31 13:20:04 0 [Nota] Lectura de todas las entradas Master_info realizada con éxito
Dec 31 13:20:04 centos7vm mariadbd<x><x><x><x><x><x><x><x>[13521]</x></x></x></x></x></x></x></x>: 2020-12-31 13:20:04 0 [Nota] Añadido nuevo Master_info '' a la tabla hash
Dec 31 13:20:04 centos7vm mariadbd<x><x><x><x><x><x><x><x>[13521]</x></x></x></x></x></x></x></x>: 2020-12-31 13:20:04 0 [Nota] /usr/sbin/mariadbd: listo para conexiones.
31 dic 13:20:04 centos7vm mariadbd<x><x><x><x><x><x><x><x>[13521]</x></x></x></x></x></x></x></x>: Versión: '10.5.8-MariaDB' socket: '/var/lib/mysql/mysql.sock' puerto: 3306 Servidor MariaDB
31 dic 13:20:04 centos7vm systemd[1]: Iniciado MariaDB 10.5.8 servidor de base de datos.
$

Asegurando MariaDB

Como primer paso tras la instalación de MariaDB, debemos asegurar su despliegue estableciendo una contraseña de root, deshabilitando el inicio de sesión remoto de root, eliminando la base de datos de prueba así como los usuarios anónimos y, por último, recargando los privilegios.

Ejecute el siguiente comando para endurecer MariaDB:

$ sudo mysql_secure_installation

Puede seguir las indicaciones predeterminadas con las acciones sugeridas a menos que tenga un requisito específico para desviarse.

Salida:

$ sudo mysql_secure_installation

NOTA: EJECUTAR TODAS LAS PARTES DE ESTE SCRIPT ES RECOMENDABLE PARA TODOS LOS SERVIDORES MariaDB
      ¡EN PRODUCCIÓN!  ¡POR FAVOR LEA CADA PASO CUIDADOSAMENTE!

Con el fin de iniciar sesión en MariaDB para asegurarlo, necesitaremos la actual
contraseña del usuario root. Si acaba de instalar MariaDB, y
aún no ha establecido la contraseña de root, sólo debe presionar enter aquí.

Introduzca la contraseña actual para root (enter para ninguna):
OK, contraseña utilizada con éxito, continuando...

Establecer la contraseña de root o utilizar el unix_socket asegura que nadie
puede acceder al usuario root de MariaDB sin la autorización adecuada.

Usted ya tiene protegida su cuenta raíz, así que puede responder con seguridad 'n'.

Cambiar a autenticación unix_socket [S/N] n
 ... saltando.

Ya tiene su cuenta de root protegida, así que puede responder con seguridad 'n'.

¿Cambiar la contraseña de root? [S/n] n
 ... saltando.

Por defecto, una instalación de MariaDB tiene un usuario anónimo, permitiendo a cualquiera
iniciar sesión en MariaDB sin tener que tener una cuenta de usuario creada para
para ellos.  Esto es sólo para pruebas, y para hacer la instalación
vaya un poco más suave.  Debe eliminarlos antes de pasar a un
entorno de producción.

¿Quitar usuarios anónimos? [S/N
 ... ¡Éxito!

Normalmente, root sólo debería poder conectarse desde 'localhost'.  Este
asegura que alguien no pueda adivinar la contraseña de root desde la red.

¿Deshabilitar el inicio de sesión de root de forma remota? [S/N
 ... ¡Éxito!

Por defecto, MariaDB viene con una base de datos llamada 'test' a la que cualquiera puede
acceder.  Esto también está destinado sólo para pruebas, y debe ser eliminado
antes de pasar a un entorno de producción.

¿Quitar la base de datos de prueba y el acceso a ella? [S/N] S
 - Eliminar base de datos de prueba...
 ... ¡Éxito!
 - Eliminando privilegios en base de datos de prueba...
 ... ¡Éxito!

La recarga de las tablas de privilegios garantizará que todos los cambios realizados hasta ahora
tendrán efecto inmediatamente.

¿Recargar tablas de privilegios ahora? [S/N
 ... ¡Éxito!

Limpiando...

¡Todo hecho!  Si ha completado todos los pasos anteriores, su MariaDB
debería ser segura.

¡Gracias por usar MariaDB!
$

Aquí utilizaremos la autenticación del sistema, por lo que no hemos configurado una contraseña de root separada para MariaDB, ya que ya es segura. Si lo necesita, siempre puede configurar una contraseña de root separada también.

Configurar la validación

Para verificar su configuración de MariaDB, ejecute (especifique la contraseña que estableció mientras ejecutaba mysql_secure_installation o, si la omitió en ese momento, utilice las credenciales de root de su sistema)

$ sudo mysqladmin -u root -p version
Introduzca la contraseña:
mysqladmin Ver 9.1 Distrib 10.5.8-MariaDB, para Linux en x86_64
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab y otros.

Versión del servidor 10.5.8-MariaDB
Protocolo versión 10
Conexión Localhost vía socket UNIX
UNIX socket /var/lib/mysql/mysql.sock
Tiempo de actividad: 53 min 17 seg

Hilos 2 Consultas: 77 Consultas lentas: 0 Aperturas: 20 Tablas abiertas: 14 Consultas por segundo promedio: 0,024
$

Puede configurar una nueva cuenta de administrador en lugar de la raíz como se muestra a continuación (cambie el valor de la contraseña por el que pretenda establecer para la cuenta de administrador ):

$ sudo mariadb
Bienvenido al monitor de MariaDB.  Los comandos terminan con ; o \g.
Su id de conexión MariaDB es 44
Versión del servidor: 10.5.8-MariaDB Servidor MariaDB

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab y otros.

Escriba 'help;' o '\h' para obtener ayuda. Escriba '\c' para borrar la sentencia de entrada actual.

MariaDB [(none)]> GRANT ALL ON *.* TO 'admin'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
Consulta OK, 0 filas afectadas (0.003 seg)

MariaDB [(none)]> FLUSH PRIVILEGES;
Consulta OK, 0 filas afectadas (0.000 seg)

MariaDB [(ninguna)]> salir
Adiós
$

Verifique el acceso con el nuevo usuario admin como (introduzca la contraseña establecida en el paso anterior):

$ mysqladmin -u admin -p version
Introduzca la contraseña:
mysqladmin Ver 9.1 Distrib 10.5.8-MariaDB, para Linux en x86_64
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab y otros.

Versión del servidor 10.5.8-MariaDB
Protocolo versión 10
Conexión Localhost vía socket UNIX
UNIX socket /var/lib/mysql/mysql.sock
Tiempo de actividad: 56 min 59 seg

Hilos 2 Consultas: 83 Consultas lentas: 0 Aperturas: 20 Tablas abiertas: 14 Consultas por segundo promedio: 0,024
$

Optimización del SO

Después de instalar y asegurar su configuración de MariaDB, debe tomar medidas para afinar su SO y su base de datos para un rendimiento óptimo. Esta puesta a punto variará en función de la configuración de su sistema, el tipo de uso, el número de usuarios y otra serie de factores.

Desde la perspectiva del SO, se pueden configurar algunos parámetros del sistema para MariaDB que discutiremos ahora.

Configuración del núcleo Linux – Programador IO

Los programadores de E/S recomendados para MariaDB son noop y deadline. Para comprobarlo utilice cat /sys/block/${DEVICE}/queue/scheduler

$ sudo cat /sys/block/sda/queue/scheduler
[mq-deadline] kyber bfq none
$

Se puede realizar un cambio temporal emitiendo el siguiente comando y su efecto, si lo hubiera, será inmediato en el rendimiento del sistema:

$ sudo echo noop > /sys/block/sda/queue/scheduler

Para hacerlo persistente, necesitará configurarlo en el fichero de configuración de GRUB como se muestra a continuación en /etc/default/grub, reconstruir GRUB y reiniciar el sistema.

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash elevator=noop"

Límites de recursos – Límite de archivos abiertos

Linux suele limitar el número de descriptores de archivo que cada proceso puede abrir. Para un sistema de BD activo, este límite puede excederse fácilmente o puede afectar al rendimiento. En muchos sistemas Linux, este límite es por defecto 1024. Además, existe la opción de límites blandos y duros.

Para aumentar el límite, puede añadir las siguientes líneas en su /etc/security/limits.conf:

mysql soft nofile 65535
mysql hard nofile 65535

Será necesario reiniciar el sistema después de lo cual el usuario mysql podrá ver y utilizar los nuevos límites. Esto se puede comprobar como:

$ ulimit -Sn
65535
$ ulimit -Hn
65535

Límites de recursos – Tamaño del archivo central

Linux limita el tamaño de los ficheros core como se ha visto en el caso anterior. De nuevo esto tiene un límite blando y duro y por defecto el límite blando está configurado como 0 lo que efectivamente deshabilita la generación de archivos de núcleo. Para permitir la generación de archivos core(otras configuraciones necesarias para la generación de volcados core), podemos incrementar este valor en /etc/security/limits.conf como:

mysql soft core unlimited
mysql hard core unlimited

Después de reiniciar el sistema, el usuario mysql podrá ver los nuevos valores utilizando el comando ulimit como:

$ ulimit -Sc
unlimited
$ ulimit -Hc
unlimited

Configurar el intercambio

El valor de swappiness en Linux determina la probabilidad de que el sistema intercambie una página de la memoria al espacio de intercambio configurado en el sistema. Normalmente, el valor por defecto está configurado como 60 que puede comprobarse desde:

sysctl vm.swappiness

Su valor puede oscilar entre 0 y 100, donde un valor más bajo significa una menor probabilidad de intercambio. En un servidor de base de datos que ejecute sólo MariaDB, querríamos reducir este valor a 0 para evitar el uso de swap tanto como sea posible. Tenga en cuenta aquí que establecer un valor de swappiness de 0 debe hacerse con precaución teniendo en cuenta otros factores de diseño del sistema, ya que en caso de un alto uso de memoria o carga de E/S, existe la posibilidad de que el kernel mate procesos Out Of Memory (OOM).

Dado que se recomienda un ajuste de swappiness bajo para cargas de trabajo de bases de datos y como tal para bases de datos MariaDB, se recomienda establecer swappiness a un valor de 1. Puede añadir la siguiente línea en /etc/sysctl.confparahacer este cambio persistente:

vm.swappiness = 1

Los cambios surtirán efecto después de reiniciar el sistema aunque siempre puede hacerlo por adelantado utilizando el comando sysctl:

sysctl -w vm.swappiness=1

Optimizaciones del sistema de archivos

Para MariaDB, los mejores sistemas de archivos de Linux son generalmente considerados como ext4, XFS y Btrfs que están todos incluidos en el núcleo principal de Linux y son ampliamente soportados. Estos sistemas de archivos están disponibles en la mayoría de las distribuciones de Linux. Cada sistema de archivos tiene sus propiedades y características únicas y puede elegirse en función de los requisitos tras una revisión adecuada.

Además, es poco probable que necesite registrar el tiempo de acceso a los archivos en un servidor de bases de datos. Podemos desactivarlo para mejorar el rendimiento. Puede montar el sistema de archivos correspondiente con la opción noatime o añadirla en las opciones de montaje del archivo /etc/fstab para que sea persistente.

Optimización de la base de datos

Existen varias sintonizables internas al funcionamiento de MariaDB que pueden personalizarse en función de los requisitos y necesidades de cada uno.

Aquí discutiremos algunas de ellas.

MariaDB se configura principalmente mediante el archivo my.cnf.

En Ubuntu, puede encontrar my. cnf en:

/etc/mysql/my.cnf

Mientras que en CentOS se encuentra en

/etc/my.cnf

Puede consultar documentación detallada sobre las variables disponibles para ajustar en el archivo de configuración desde aquí.

Mucho depende también del tipo de motor utilizado por MariaDB, a saber, MyISAM e InnoDB o XtraDB. Ambos tienen sus propios pros y contras y la elección de uno depende de los requisitos de la base de datos y de la aplicación.

Deberíamos establecer innodb_buffer_pool_size en aproximadamente el 80% de su memoria. Esto asegura que el 80% de su conjunto de trabajo esté en memoria.

Algunos de los otros parámetros sintonizables importantes son:

innodb_log_file_size
innodb_flush_method
innodb_thread_sleep_delay
innodb_adaptive_max_sleep_delay
innodb_buffer_pool_instances
innodb_buffer_pool_size
innodb_max_dirty_pages_pct_lwm
innodb_read_ahead_threshold
innodb_thread_concurrency

Encontrará más detalles sobre el ajuste de variables InnoDB o XtraDB aquí. Consulte esta guía para conocer todas las opciones de ajuste disponibles para MariaDB.

Si está interesado, consulte estos recursos para aprender SQL y NoSQL.

Conclusión

MariaDB es una de las opciones populares cuando se trata de DBMS de relación. El hecho de ser de código abierto con una comunidad diversa le añade aún más valor.

Para aprender más, consulte su documentación, que incluye temas como SQL básico, migración, administración de MariaDB, alta disponibilidad, ajuste del rendimiento, motores de almacenamiento, programación y personalización. También puede desactivar el registro binario si no utiliza un clúster.