Библиотека 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 и значително по-висока производителност в сценарии с интензивно записване и гаранции за целостта на данните.
- лениво прехвърляне на данни на дискове.
Източник: linux.org.ru
