MariaDB Server es uno de los servidores de bases de datos de código abierto más populares. Fue creado por los desarrolladores originales de MySQL y se hizo popular por ser rápido, escalable y robusto. MariaDB tiene un rico ecosistema de motores de almacenamiento, complementos y otras herramientas que lo hacen muy versátil para una amplia variedad de casos de uso.
Los requisitos de espacio en disco y eficiencia de E/S de nuestras bases de datos continúan creciendo. Esto es para que podamos administrar el crecimiento de nuestra información de manera correcta.
En cuanto al motor de almacenamiento MariaDB, tenemos diferentes tipos a elegir como XtraDB, InnoDB, Aria o MyISAM. Desde la versión 10.2.5 de MariaDB, MyRocks también está disponible. MyRocks es el tipo de motor de almacenamiento que realmente podría ayudarnos a cumplir con los requisitos que mencionamos anteriormente.
En este blog, aprenderemos más información sobre el nuevo motor MyRocks y cómo podemos usarlo en un servidor MariaDB.
¿Qué es MyRocks?
MyRocks es un motor de almacenamiento de código abierto basado en RocksDB que fue desarrollado originalmente por Facebook.
MyRocks puede ser una buena solución de almacenamiento cuando tiene cargas de trabajo que requieren mayor compresión y eficiencia de E/S. Utiliza una arquitectura Log Structured Merge (LSM) que tiene una mejor compresión que los algoritmos de árbol B utilizados por el motor InnoDB (2 veces mejor compresión en comparación con los datos comprimidos por InnoDB). También es un motor de almacenamiento optimizado para escritura (10 veces menos amplificación de escritura en comparación con InnoDB) y tiene una carga y replicación de datos más rápidas. MyRocks escribe datos directamente en el nivel más bajo, lo que evita todos los gastos generales de compactación cuando habilita una carga de datos más rápida para una sesión.
Un LSM funciona almacenando operaciones de modificación en un búfer (memtable) y ordenando y almacenando los datos cuando este búfer está lleno.
De forma predeterminada, las tablas y las bases de datos se almacenan en un directorio #rocksdb dentro del directorio de datos de MySQL. Esta información se almacena en archivos .sst sin separación por tabla.
MyRocks admite niveles aislados de LECTURA COMPROMETIDA y LECTURA REPETIBLE y no admite SERIALIZABLE.
Cómo implementar MyRocks en un servidor MariaDB
Instalación
Primero, necesitamos instalar el servidor MariaDB. En este ejemplo, usaremos CentOS Linux versión 7.6 como sistema operativo.
De forma predeterminada, esta versión del sistema operativo intentará instalar MariaDB 5.5, por lo que agregaremos el repositorio de MariaDB para instalar la versión 10.3 de MariaDB.
$ cat > /etc/yum.repos.d/MariaDB.repo <<- EOF
# MariaDB 10.3 CentOS repository
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.3/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOF
Y luego, instalaremos el paquete del servidor MariaDB:
$ yum install MariaDB-server
Este comando instalará diferentes dependencias de paquetes, no solo el servidor MariaDB.
==========================================================================================================================================================================================================
Package Arch Version Repository Size
==========================================================================================================================================================================================================
Installing:
MariaDB-server x86_64 10.3.15-1.el7.centos mariadb 24 M
Installing for dependencies:
MariaDB-client x86_64 10.3.15-1.el7.centos mariadb 11 M
MariaDB-common x86_64 10.3.15-1.el7.centos mariadb 78 k
MariaDB-compat x86_64 10.3.15-1.el7.centos mariadb 2.8 M
boost-program-options x86_64 1.53.0-27.el7 base 156 k
galera x86_64 25.3.26-1.rhel7.el7.centos mariadb 8.1 M
libaio x86_64 0.3.109-13.el7 base 24 k
lsof x86_64 4.87-6.el7 base 331 k
make x86_64 1:3.82-23.el7 base 420 k
openssl x86_64 1:1.0.2k-16.el7_6.1 updates 493 k
perl-Compress-Raw-Bzip2 x86_64 2.061-3.el7 base 32 k
perl-Compress-Raw-Zlib x86_64 1:2.061-4.el7 base 57 k
perl-DBI x86_64 1.627-4.el7 base 802 k
perl-Data-Dumper x86_64 2.145-3.el7 base 47 k
perl-IO-Compress noarch 2.061-2.el7 base 260 k
perl-Net-Daemon noarch 0.48-5.el7 base 51 k
perl-PlRPC noarch 0.2020-14.el7 base 36 k
Transaction Summary
==========================================================================================================================================================================================================
Install 1 Package (+16 Dependent packages)
Por defecto, el servidor MariaDB viene instalado con el motor de almacenamiento InnoDB, por lo que debemos instalar el motor RocksDB para poder hacer uso de él.
$ yum install MariaDB-rocksdb-engine
==========================================================================================================================================================================================================
Package Arch Version Repository Size
==========================================================================================================================================================================================================
Installing:
MariaDB-rocksdb-engine x86_64 10.3.15-1.el7.centos mariadb 4.4 M
Installing for dependencies:
libzstd x86_64 1.3.4-1.el7 mariadb 211 k
snappy x86_64 1.1.0-3.el7 base 40 k
Transaction Summary
==========================================================================================================================================================================================================
Install 1 Package (+2 Dependent packages)
Este comando instalará algunas dependencias requeridas y habilitará el complemento en el servidor MariaDB. También creará un archivo de configuración en /etc/my.cnf.d/rocksdb.cnf:
[mariadb]
plugin-load-add=ha_rocksdb.so
Podemos verificar esta instalación ejecutando el comando SHOW PLUGINS en el servidor MariaDB.
$ MariaDB> SHOW PLUGINS;
+-------------------------------+----------+--------------------+---------------+---------+
| Name | Status | Type | Library | License |
+-------------------------------+----------+--------------------+---------------+---------+
...
| ROCKSDB | ACTIVE | STORAGE ENGINE | ha_rocksdb.so | GPL |
| ROCKSDB_CFSTATS | ACTIVE | INFORMATION SCHEMA | ha_rocksdb.so | GPL |
| ROCKSDB_DBSTATS | ACTIVE | INFORMATION SCHEMA | ha_rocksdb.so | GPL |
| ROCKSDB_PERF_CONTEXT | ACTIVE | INFORMATION SCHEMA | ha_rocksdb.so | GPL |
| ROCKSDB_PERF_CONTEXT_GLOBAL | ACTIVE | INFORMATION SCHEMA | ha_rocksdb.so | GPL |
| ROCKSDB_CF_OPTIONS | ACTIVE | INFORMATION SCHEMA | ha_rocksdb.so | GPL |
| ROCKSDB_COMPACTION_STATS | ACTIVE | INFORMATION SCHEMA | ha_rocksdb.so | GPL |
| ROCKSDB_GLOBAL_INFO | ACTIVE | INFORMATION SCHEMA | ha_rocksdb.so | GPL |
| ROCKSDB_DDL | ACTIVE | INFORMATION SCHEMA | ha_rocksdb.so | GPL |
| ROCKSDB_SST_PROPS | ACTIVE | INFORMATION SCHEMA | ha_rocksdb.so | GPL |
| ROCKSDB_INDEX_FILE_MAP | ACTIVE | INFORMATION SCHEMA | ha_rocksdb.so | GPL |
| ROCKSDB_LOCKS | ACTIVE | INFORMATION SCHEMA | ha_rocksdb.so | GPL |
| ROCKSDB_TRX | ACTIVE | INFORMATION SCHEMA | ha_rocksdb.so | GPL |
| ROCKSDB_DEADLOCK | ACTIVE | INFORMATION SCHEMA | ha_rocksdb.so | GPL |
+-------------------------------+----------+--------------------+---------------+---------+
Si por alguna razón no tenemos habilitado el complemento, podemos instalarlo dinámicamente ejecutando el comando INSTALL SONAME o INSTALL PLUGIN:
$ MariaDB> INSTALL SONAME 'ha_rocksdb';
Otra opción podría ser reiniciar los servicios de la base de datos. Esta acción debería leer el archivo /etc/my.cnf.d/rocksdb.cnf y habilitar el complemento.
$ service mariadb restart
Podemos encontrar información detallada sobre nuestro motor RocksDB usando el siguiente comando:
$ SHOW ENGINE ROCKSDB STATUS
Configuración
Sobre los archivos de configuración, el principal es /etc/my.cnf, que incluye el directorio /etc/my.cnf.d donde podemos encontrar el resto de archivos de configuración. En este directorio, tendremos los siguientes archivos de configuración por defecto:
- enable_encryption.preset:habilitará el cifrado de datos en reposo.
- mysql-clients.cnf:aquí hay configuraciones para diferentes grupos como [mysqladmin], [mysqlcheck], [mysqldump] y más.
- rocksdb.cnf:en este archivo, agregaremos la configuración específica para MyRocks, como default-storage-engine o rocksdb_block_size.
- server.cnf:Aquí tenemos la configuración relacionada con el servidor de la base de datos como bind-address y binlog_format.
Todas las variables del sistema y las variables de estado de MyRocks están precedidas por "rocksdb". Echemos un vistazo a esto.
Variables del sistema:
$ MariaDB> SHOW VARIABLES LIKE 'rocksdb%';
+-------------------------------------------------+------------------------------------------+
| Variable_name | Value |
+-------------------------------------------------+------------------------------------------+
| rocksdb_access_hint_on_compaction_start | 1 |
| rocksdb_advise_random_on_open | ON |
| rocksdb_allow_concurrent_memtable_write | OFF |
| rocksdb_allow_mmap_reads | OFF |
| rocksdb_allow_mmap_writes | OFF |
| rocksdb_allow_to_start_after_corruption | OFF |
| rocksdb_blind_delete_primary_key | OFF |
| rocksdb_block_cache_size | 536870912 |
| rocksdb_block_restart_interval | 16 |
| rocksdb_block_size | 4096 |
…
+-------------------------------------------------+------------------------------------------+
Variables de estado:
$ MariaDB> SHOW STATUS LIKE 'rocksdb%';
+----------------------------------------------------+-------+
| Variable_name | Value |
+----------------------------------------------------+-------+
| Rocksdb_rows_deleted | 0 |
| Rocksdb_rows_inserted | 0 |
| Rocksdb_rows_read | 0 |
| Rocksdb_rows_updated | 0 |
| Rocksdb_rows_deleted_blind | 0 |
| Rocksdb_rows_expired | 0 |
| Rocksdb_rows_filtered | 0 |
| Rocksdb_system_rows_deleted | 0 |
| Rocksdb_system_rows_inserted | 0 |
| Rocksdb_system_rows_read | 0 |
…
+----------------------------------------------------+-------+
Puede encontrar más información sobre el estado y las variables del sistema en el sitio web de MariaDB.
Copias de seguridad para MariaDB usando MyRocks
Las copias de seguridad son imprescindibles en todos los entornos de bases de datos. Son esenciales para la recuperación del sistema, migraciones, auditorías, pruebas y más.
Podemos categorizar las copias de seguridad en dos tipos diferentes, lógicas y físicas. La copia de seguridad lógica se almacena en un formato legible por humanos, como SQL, y la copia de seguridad física contiene los datos binarios adicionales.
Para copias de seguridad lógicas en MariaDB con MyRocks como motor de base de datos, la herramienta de copia de seguridad más común es el clásico mysqldump:
$ mysqldump -hHOST -uUSER -p DATABASE > FILE.SQL
Y para la copia de seguridad física, podemos usar Mariabackup que es compatible con MyRocks:
$ mariabackup --backup --target-dir=/backup/ --user=USER --password=PASSWORD --host=HOST
Otra opción puede ser myrocks_hotbackup, creada por Facebook. Se puede usar para tomar una copia física de una instancia de MyRocks en ejecución a un servidor local o remoto, sin detener la instancia de origen.
Limitaciones del uso de MyRocks para MariaDB
Veamos algunas de las limitaciones del uso del motor MyRocks...
- Es posible que no se admita la replicación paralela optimista de MariaDB
- MyRocks no está disponible para plataformas de 32 bits
- MariaDB Cluster (Galera Cluster) no funciona con MyRocks (solo motores de almacenamiento InnoDB o XtraDB)
- La transacción debe caber en la memoria
- Requiere una configuración especial para cargar datos
- SERIALIZABLE no es compatible
- No se admiten el espacio de tabla transportable, la clave externa, el índice espacial y el índice de texto completo
Conclusión
MyRocks está disponible en MariaDB a partir de versiones superiores a la 10.2.5. Como mencionamos anteriormente, este motor de almacenamiento puede resultarle útil cuando tiene cargas de trabajo que requieren una alta compresión de datos y mayores niveles de eficiencia de E/S. Para obtener más información sobre MyRocks, puede consultar esto.