Bibliothèque libmdbx est un descendant considérablement retravaillé de LMDB — une base de données intégrée de type clé-valeur d'une performance exceptionnelle et compacte.
La version actuelle v0.5 est une version technique, marquant l'achèvement d'autres développements et le passage à la phase de test final public et de stabilisation, qui aboutira à la formation de la première version complète de la bibliothèque.
LMDB est une base de données intégrée transactionnelle assez connue de type « clé-valeur » basée sur l'arbre B+ sans journalisation anticipée, qui permet à un ensemble de processus multithreads de travailler de manière concurrente et extrêmement efficace avec une base de données localement partagée (non réseau). En revanche, MDBX est plus rapide et plus fiable que LMDB, tout en conservant toutes les capacités clés de son ancêtre, telles que ACID et la lecture non bloquante avec un évolutivité linéaire par cœur de CPU, tout en ajoutant plusieurs nouveautés.
Une description des différences et améliorations de libmdbx par rapport à LMDB mérite un article séparé (des publications sont prévues sur « Habr » et « Medium »). Il convient ici de mentionner les plus importantes et notables :
- Une attention considérablement plus grande est accordée à la qualité du code, aux tests et aux vérifications automatiques.
- Un contrôle beaucoup plus important pendant l'exécution, allant de la vérification des paramètres à l'audit interne des structures de la base de données.
- Auto-compaction et gestion automatique de la taille de la base de données.
- Format de base de données unifié pour les builds 32 bits et 64 bits.
- Évaluation du volume des échantillons par plages (estimation de requête par intervalle).
- Prise en charge des clés ayant un double des valeurs et taille de page de base de données choisie par l'utilisateur.
Le candidat à la release libmdbx est le résultat d'une décision (voir ci-dessous) de séparation des projets MDBX et MithrilDB en août 2019. Dans ce cadre, il a été décidé d'éliminer (le maximum rationnel) de la dette technique dans libmdbx et de stabiliser la bibliothèque. En fait, dans cette direction, il a été réalisé de 2 à 3 fois plus que ce qui avait été estimé et planifié initialement :
- La prise en charge de Mac OS et des plateformes de « deuxième échelon » : FreeBSD, Solaris, DragonFly BSD, OpenBSD, NetBSD. Le support AIX et HP-UX peut être ajouté si nécessaire.
- La désinfection du code a été effectuée à l'aide de l'Undefined Behavior Sanitizer et de l'Address Sanitizer, et tous les avertissements lors de la compilation avec -Wpedantic ont été éliminés, ainsi que tous les avertissements du Coverity Static Analyzer, etc.
- Mise à jour de la description de l'API.
- Amalgame du code source pour faciliter l'intégration.
- Prise en charge de CMake.
- Prise en charge des transactions imbriquées.
- Utilisation de bootid pour déterminer le fait d'un redémarrage du système d'exploitation (arrêt brutal de la base de données).
- Comptage continu des pages mises à jour/ancien et informations étendues sur les transactions.
- Option MDBX_ACCEDE pour se connecter à une base de données déjà ouverte en mode compatible.
- Utilisation Verrous OFD lorsqu'ils sont disponibles.
- Sauvegarde à chaud dans le pipe.
- Algorithme de tri interne spécialisé et optimisé (jusqu'à 2-3 fois plus rapide que qsort() et jusqu'à 30 % plus rapide que std::sort()).
- Longueur maximale de la clé augmentée.
- Gestion automatique du read ahead (stratégie de mise en cache de la base de données en mémoire).
- Compactage auto plus agressif et rapide.
- Stratégie de fusion des pages de l'arbre B+ plus optimale.
- Contrôle des systèmes de fichiers non locaux (NFS, Samba, etc.) pour éviter la corruption de la base de données en cas d'utilisation incorrecte.
- Série de tests étendue.
Le développement de la «prochaine» version de libmdbx se poursuivra dans le cadre d'un projet séparé. MithrilDB, tandis que la direction du développement de la «version actuelle» de MDBX est axée sur la stabilisation et le gel de l'ensemble des fonctionnalités. Cette décision a été prise pour trois raisons :
- Incompatibilité totale : pour réaliser toutes les fonctionnalités planifiées dans MithrilDB, un autre format de fichiers de base de données (incompatible) et une autre API (incompatible) sont nécessaires.
- Nouveau code source : le code source de MithrilDB est garanti indépendant de la licence LMDB, et le projet est prévu d'être publié sous une autre licence (approuvée par OSI licence Apache 2.0, pas OpenLDAP Foundation).
- La séparation permet d'éviter toute confusion potentielle, d'apporter plus de clarté et d'assurer l'indépendance du développement des projets.
MithrilDB, tout comme MDBX, est également basé sur l'arbre B+ et se distinguera également par des performances exceptionnellement élevées, tout en éliminant plusieurs inconvénients fondamentaux de MDBX et LMDB. En particulier, le problème des «longs lectures», qui se manifeste par un «gonflement» de la base de données en raison du blocage des transactions de lecture longues pendant le ramassage des déchets, sera résolu. Parmi les nouvelles fonctionnalités de MithrilDB, on peut noter :
- prise en charge de l'hébergement de bases de données sur plusieurs supports hétérogènes : HDD, SSD et mémoire non volatile.
- stratégies optimales pour les données « précieuses » et « peu précieuses », pour les données « chaudes », « tièdes » et « froides ».
- utilisation de l'arbre Merkle pour le contrôle de l'intégrité des bases de données.
- utilisation optionnelle de WAL et performance considérablement plus élevée dans les scénarios avec des écritures intensives et des garanties d'intégrité des données.
- sauvegarde paresseuse des données sur disques.
Source : linux.org.ru
