Библиотека libmdbx является существенно переработанным потомком LMDB — предельно высокопроизводительной, компактной встраиваемой базой данных класса ключ-значение. Текущая версия v0.5 является техническим релизом, отмечает завершение каких-либо доработок и переход к фазе публичного финального тестирования и стабилизации, с последующем формированием первого полноценного релиза библиотеки.
LMDB является достаточно известной транзакционной встраиваемой СУБД класса «ключ-значение» на основе дерева B+ без упреждающей журнализации, которая позволяет рою многопоточных процессов конкурентно и предельно эффективно работать с локально-разделяемой (не сетевой) БД. В свою очередь MDBX быстрее и надежнее LMDB, при этом libmdbx сохраняет все ключевые возможности своего прародителя, такие как ACID и неблокирующее чтение с линейным масштабированием по ядрам CPU, а также добавляет несколько новых.
Описание отличий и усовершенствований libmdbx относительно LMDB заслуживает отдельной статьи (планируется публикации на «Хабре» и «Medium»). Здесь же уместно упомянуть самые важные и заметные:
- принципиально больше внимания уделяется качеству кода, тестированию и автоматическим проверкам.
- существенно больше контроля во время работы, начиная от проверки параметров, и до внутреннего аудита структур базы данных.
- авто-компактификация и автоматическое управление размером БД.
- единый формат БД для 32-битных и 64-битных сборок.
- оценка объема выборок по диапазонам (range query estimation).
- поддержка ключей вдвое большей длины и выбираемого пользователем размера страницы БД.
Выпущенный релиз-кандидат libmdbx является результатом решения (см далее) о разделении проектов MDBX и MithrilDB в августе 2019. При этом в libmdbx было решено устранить (рациональный) максимум технического долга и стабилизировать библиотеку. По-факту в обозначенном направлении сделано в 2-3 раза больше, чем оценивалось и планировалось исходно:
- Реализована поддержка Mac OS и платформ «второго эшелона»: FreeBSD, Solaris, DragonFly BSD, OpenBSD, NetBSD. Поддержка AIX и HP -UX может быть добавлена при необходимости.
- Проведена санация кода при помощи Undefined Behavior Sanitizer и Address Sanitizer, устранены все предупреждения при сборке с
-Wpedantic
, все предупреждения Coverity Static Analyzer и т. д. - Актуализация описания API.
- Амальгамация исходного кода для удобства встраивания.
- Поддержка CMake.
- Поддержка вложенных транзакций.
- Использование bootid для определения факта перезагрузки ОС (грязной остановки БД).
- Сквозной подсчет обновлённых/старых страниц и расширенная информация о транзакциях.
- Опция MDBX_ACCEDE для подключения к уже открытой БД в совместимом режиме.
- Использование OFD-блокировок при их доступности.
- Горячее резервное копирование в pipe.
- Специализированный оптимизированный алгоритм внутренней сортировки (до 2-3 раз быстрее
qsort()
и до 30% быстрееstd::sort()
). - Увеличена максимальная длина ключа.
- Автоматическое управление read ahead (стратегией кэширования файла БД в памяти).
- Более агрессивная и быстрая авто-компактификация.
- Более оптимальная стратегия слияния страниц B+ дерева.
- Контроль не-локальных файловых систем (NFS, Samba и т.п.) для предотвращения повреждения БД при неверном использовании.
- Расширен набор тестов.
Разработка «следующей» версии libmdbx будет продолжена в рамках отдельного проекта MithrilDB, в том время как вектор разработки «текущей» версии MDBX направлен на заморозку набора возможностей и стабилизацию. Такое решение принято по трём причинам:
- Полная несовместимость: для реализации всех запланированных возможностей в MithrilDB требуется другой (несовместимый) формат файлов БД и другое (несовместимое) API.
- Новый исходный код: для исходного кода MithrilDB обеспечена лицензионная независимость от LMDB, а сам проект планируется опубликовать под другой лицензией (одобренной OSI лицензией Apache 2.0, а не OpenLDAP Foundation).
- Разделение позволяет избежать потенциальную путаницу, внести больше определенности и обеспечить независимость пути развития проектов.
MithrilDB как и MDBX, также основывается на дереве B+ и также будет отличатся предельно высокой производительностью, при этом устраняя ряд принципиальных недостатков MDBX и LMDB. В частности, будет ликвидирована проблема «долгих чтений», проявляющаяся как «распухание» БД из-за того, что переработка мусора блокируется долгим читающими транзакциями. Среди новых возможностей MithrilDB следует отметить:
- поддержка размещения БД на нескольких разнородных носителях: HDD, SSD и энергонезависимой памяти.
- оптимальные стратегии для «ценных» и «малоценных», для «горячих», «теплых» и «холодных» данных.
- использование Merkle tree для контроля целостности БД.
- опциональное использование WAL и существенно более высокая производительно в сценариях с интенсивной записью и гарантиями на целостность данных.
- ленивая догоняющая фиксация данных на дисках.