La biblioteca libmdbx es un descendiente notablemente revisado de LMDB: una base de datos empotrada extremamente de alto rendimiento y compacta de tipo clave-valor.
La versión actual v0.5 es un lanzamiento técnico, marcando la finalización de cualquier trabajo adicional y la transición a la fase de prueba pública final y estabilización, con la posterior formación del primer lanzamiento completo de la biblioteca.
LMDB es un sistema de gestión de bases de datos empotrado transaccional relativamente conocido de tipo 'clave-valor' basado en árbol B+ sin registro anticipado, lo que permite a un grupo de procesos multihilo trabajar de manera concurrente y extremadamente eficiente con bases de datos locales compartidas (no de red). A su vez, MDBX es más rápido y más confiable que LMDB, mientras que libmdbx mantiene todas las capacidades clave de su antecesor, como ACID y lectura no bloqueante con escalabilidad lineal en núcleos de CPU, además de agregar varias nuevas.
La descripción de las diferencias y mejoras de libmdbx en comparación con LMDB merece un artículo separado (se planean publicaciones en 'Habr' y 'Medium'). Aquí es adecuado mencionar las más importantes y notables:
- Se presta significativamente más atención a la calidad del código, pruebas y verificaciones automáticas.
- Hay un control significativamente mayor durante el funcionamiento, desde la verificación de parámetros hasta la auditoría interna de las estructuras de la base de datos.
- Auto-compacción y gestión automática del tamaño de la base de datos.
- Un formato único de base de datos para compilaciones de 32 y 64 bits.
- Estimación del volumen de muestras por rangos (range query estimation).
- Soporte para claves de tamaño dos veces mayor y tamaño de página de base de datos seleccionable por el usuario.
El lanzamiento candidato de libmdbx es el resultado de la decisión (ver más adelante) de dividir los proyectos MDBX y MithrilDB en agosto de 2019. Al mismo tiempo, en libmdbx se decidió eliminar el máximo (racional) de deuda técnica y estabilizar la biblioteca. De hecho, en esa dirección se ha hecho de 2 a 3 veces más de lo que se estimaba y planificaba inicialmente:
- Se ha implementado soporte para Mac OS y plataformas de 'segunda categoría': FreeBSD, Solaris, DragonFly BSD, OpenBSD, NetBSD. El soporte para AIX y HP-UX puede añadirse si es necesario.
- Se ha realizado una limpieza del código utilizando Undefined Behavior Sanitizer y Address Sanitizer, eliminando todas las advertencias al compilar con -Wpedantic, todas las advertencias del Coverity Static Analyzer, etc.
- Actualización descripción de la API.
- Amalgamación del código fuente para facilitar la integración.
- Soporte para CMake.
- Soporte para transacciones anidadas.
- Uso de bootid para determinar el hecho de reinicio del sistema operativo (parada sucia de la base de datos).
- Contador completo de las páginas actualizadas / antiguas y información ampliada sobre transacciones.
- Opción MDBX_ACCEDE para conectarse a una base de datos ya abierta en modo compatible.
- Uso Bloqueos OFD cuando estén disponibles.
- Copia de seguridad en caliente en pipe.
- Algoritmo de ordenación interno optimizado especializado (hasta 2-3 veces más rápido que qsort() y hasta un 30% más rápido que std::sort()).
- Se ha aumentado la longitud máxima de la clave.
- Gestión automática de lectura anticipada (estrategia de almacenamiento en caché de la base de datos en memoria).
- Compacción automática más agresiva y rápida.
- Estrategia de fusión de páginas B+ más óptima.
- Control de sistemas de archivos no locales (NFS, Samba, etc.) para evitar la corrupción de la base de datos por un uso incorrecto.
- Ampliado el conjunto de pruebas.
El desarrollo de la 'próxima' versión de libmdbx continuará en el marco de un proyecto separado. MithrilDB, mientras que la dirección de desarrollo de la 'versión actual' de MDBX está orientada a congelar el conjunto de capacidades y estabilización. Esta decisión se tomó por tres razones:
- Incompatibilidad total: para implementar todas las funcionalidades planeadas en MithrilDB se requiere un formato de archivos de base de datos diferente (incompatible) y una API diferente (incompatible).
- Nuevo código fuente: el código fuente de MithrilDB garantiza independencia de licencia respecto a LMDB, y se planea publicar el proyecto bajo una licencia diferente (aprobada por OSI licencia Apache 2.0, y no OpenLDAP Foundation).
- La separación permite evitar confusiones potenciales, aportar más claridad y asegurar la independencia de la trayectoria de desarrollo de los proyectos.
MithrilDB, al igual que MDBX, también se basa en árbol B+ y también se destacará por su altísima rendimiento, eliminando varios defectos fundamentales de MDBX y LMDB. En particular, se eliminará el problema de las 'lecturas largas', que se manifiesta como 'inflación' de la base de datos debido a que la recolección de basura se bloquea por transacciones de lectura prolongadas. Entre las nuevas características de MithrilDB destacan:
- soporte para colocar la base de datos en varios soportes heterogéneos: HDD, SSD y memoria no volátil.
- estrategias óptimas para datos 'valiosos' y 'poco valiosos', para datos 'calientes', 'templados' y 'fríos'.
- uso de Merkle tree para el control de integridad de la base de datos.
- uso opcional de WAL y un rendimiento sustancialmente más alto en escenarios de escritura intensiva y garantías de integridad de datos.
- fijación de datos perezosa que alcanza en los discos.
Fuente: linux.org.ru
