Biblioteka libmdbx jest znacząco przerobionym potomkiem LMDB — ekstremalnie wydajnej, kompaktowej bazy danych klasy klucz-wartość.
Obecna wersja v0.5 jest wydaniem technicznym, które oznacza zakończenie wszelkich poprawek i przejście do fazy publicznych testów końcowych i stabilizacji, a następnie tworzenie pierwszego pełnoprawnego wydania biblioteki.
LMDB jest dość znaną transakcyjną wbudowaną bazą danych klasy „klucz-wartość” opartą na drzewie B+ bez wstępnej rejestrowania, która umożliwia wielu wielowątkowym procesom konkurencyjne i ekstremalnie efektywne działanie z lokalnie współdzieloną (nie sieciową) bazą danych. Z kolei MDBX jest szybszy i bardziej niezawodny niż LMDB, a przy tym libmdbx zachowuje wszystkie kluczowe możliwości swojego przodka, takie jak ACID i nieblokujące odczyty z liniowym skalowaniem na rdzeniach CPU, a także dodaje kilka nowości.
Opis różnic i ulepszeń libmdbx w stosunku do LMDB zasługuje na osobny artykuł (planowane publikacje na "Habrze" i "Medium"). Warto tutaj wspomnieć o najważniejszych i najbardziej zauważalnych:
- Zasadniczo większą uwagę poświęca się jakości kodu, testowaniu i automatycznym kontrolom.
- Znacznie większa kontrola podczas pracy, od weryfikacji parametrów po wewnętrzną audyt struktur baz danych.
- Auto-kompaktowanie i automatyczne zarządzanie rozmiarem bazy danych.
- Jednolity format bazy danych dla 32-bitowych i 64-bitowych kompilacji.
- Ocena objętości próbek według zakresów (szacowanie zapytań zakresowych).
- Wsparcie dla kluczy o dwukrotnie większych rozmiarach i wybierany przez użytkownika rozmiar strony bazy danych.
Wydany kandydat na wersję libmdbx jest wynikiem decyzji (więcej szczegółów w dalszej części) o rozdzieleniu projektów MDBX i MithrilDB w sierpniu 2019 roku. Przy tym postanowiono w libmdbx zlikwidować (racjonalnie) maksymalny dług techniczny i ustabilizować bibliotekę. Faktycznie w tym kierunku zrobiono 2-3 razy więcej, niż szacowano i planowano na początku:
- Zrealizowano wsparcie dla Mac OS i platform "drugiego poziomu": FreeBSD, Solaris, DragonFly BSD, OpenBSD, NetBSD. Wsparcie dla AIX i HP-UX może być dodane w razie potrzeby.
- Przeprowadzono sanację kodu za pomocą Undefined Behavior Sanitizer i Address Sanitizer, usunięto wszystkie ostrzeżenia przy kompilacji z -Wpedantic, wszystkie ostrzeżenia Coverity Static Analyzer itd.
- Aktualizacja opisu API.
- Amalgamezacja kodu źródłowego dla ułatwienia wbudowy.
- Wsparcie dla CMake.
- Wsparcie dla zagnieżdżonych transakcji.
- Użycie bootid do określenia faktu ponownego uruchomienia systemu operacyjnego (brudne zatrzymanie bazy danych).
- Całkowite zliczanie zaktualizowanych/starych stron oraz rozszerzone informacje o transakcjach.
- Opcja MDBX_ACCEDE do połączenia z już otwartą bazą danych w trybie zgodności.
- Użycie Blokady OFD w przypadku ich dostępności.
- Gorące kopie zapasowe w pipe.
- Specjalizowany, zoptymalizowany algorytm wewnętrznego sortowania (od 2 do 3 razy szybszy niż qsort() i do 30% szybszy niż std::sort()).
- Zwiększona maksymalna długość klucza.
- Automatyczne zarządzanie read ahead (strategią buforowania plików bazy danych w pamięci).
- Bardziej agresywna i szybka auto-kompaktyfikacja.
- Bardziej optymalna strategia łączenia stron drzewa B+.
- Kontrola nielokalnych systemów plików (NFS, Samba itp.) w celu zapobiegania uszkodzeniom bazy danych przy niewłaściwym użytkowaniu.
- Rozszerzony zestaw testów.
Rozwój 'następnej' wersji libmdbx będzie kontynuowany w ramach oddzielnego projektu MithrilDB, podczas gdy wektor rozwoju 'bieżącej' wersji MDBX jest ukierunkowany na zamrożenie zestawu funkcji i stabilizację. Decyzja podjęta została z trzech powodów:
- Całkowita niekompatybilność: aby wdrożyć wszystkie planowane funkcje w MithrilDB, potrzebny jest inny (niekompatybilny) format plików bazy danych oraz inne (niekompatybilne) API.
- Nowy kod źródłowy: dla kodu źródłowego MithrilDB zapewniona jest niezależność licencyjna od LMDB, a sam projekt planowany jest do publikacji na innej licencji (zatwierdzonej OSI licencją Apache 2.0, a nie Fundacja OpenLDAP).
- Podział pozwala uniknąć potencjalnych nieporozumień, wprowadzić więcej jasności i zapewnić niezależność w rozwoju projektów.
MithrilDB, tak jak MDBX, również opiera się na drzewie B+ i również będzie się odznaczał najwyższą wydajnością, eliminując jednocześnie szereg zasadniczych wad MDBX i LMDB. W szczególności zniknie problem 'długich odczytów', objawiający się jako 'nabrzmiewanie' bazy danych z powodu blokady przetwarzania danych przez długie transakcje odczytu. Wśród nowych możliwości MithrilDB należy wyróżnić:
- wsparcie dla umieszczania bazy danych na różnych nośnikach: HDD, SSD oraz pamięci nieulotnej.
- optymalne strategie dla 'cennych' i 'mało cennych', dla 'gorących', 'ciepłych' i 'zimnych' danych.
- użycie drzewa Merkle do kontroli integralności bazy danych.
- opcjonalne użycie WAL oraz znacznie wyższa wydajność w scenariuszach z intensywnym zapisem oraz gwarancjami integralności danych.
- leniwe opóźnione zapisanie danych na dyskach.
Źródło: linux.org.ru
