Po trzech miesiącach pracy została wydana biblioteka libmdbx 0.10.0 (MDBX) z zaawansowaną, kompaktową bazą danych typu klucz-wartość. Kod libmdbx jest rozpowszechniany na licencji OpenLDAP Public License. libmdbx to głęboka przeróbka systemu DB LMDB i, według twórców, przewyższa swojego „pradziadka” pod względem niezawodności, zestawu możliwości i wydajności. Twierdzi się, że libmdbx jest do 20% szybszy niż LMDB w scenariuszach CRUD i do 30% szybszy, jeśli podczas kompilacji libmdbx wyłączony zostanie wewnętrzny nadzór na poziomie porównywalnym z LMDB.
Libmdbx oferuje ACID, ścisłą serializację zmian oraz nieblokujące odczyty z liniowym skalowaniem po rdzeniach CPU. W libmdbx duży nacisk kładzie się na jakość kodu, stabilną pracę API, testowanie oraz automatyczne kontrole. Obsługiwane są autokomplementacja, automatyczne zarządzanie rozmiarem bazy danych, jednorodny format bazy danych dla wersji 32- i 64-bitowych oraz ocena objętości próbek na podstawie zakresów (range query estimation). Dostarczane są również narzędzie do sprawdzania integralności struktury bazy danych z pewnymi możliwościami przywracania. Od 2016 roku projekt jest finansowany przez firmę Positive Technologies, a od 2017 roku jest wykorzystywany w jej produktach, a nałożone przez rząd USA sankcje na Positive Technologies nie mają zauważalnego wpływu.
Główne nowości, poprawki i usprawnienia dodane po poprzedniej wersji:
- Dostępne są powiązania dla Ruby od Mahlona E. Smitha oraz wersja próbna powiązań dla Pythona od Noela Kuntze, zaktualizowane powiązania dla GoLang od Aleksieja Szarowa.
- Dla trybu „MDBX_WRITEMAP”, gdy dane bazy danych są modyfikowane bezpośrednio w pamięci RAM, wprowadzono „przezroczysty zrzut” zmienionych stron bazy danych na dysk. Teraz po zakończeniu każdej operacji takie strony są od razu w pełni gotowe do zapisu na dysku, a jądro systemu operacyjnego może samodzielnie zrzucać zmienione strony na dysk, a zatwierdzenie transakcji nie wymaga ich modyfikacji. W rezultacie w obciążonych scenariuszach z niedoborem pamięci operacyjnej objętość operacji dyskowych może się zmniejszyć nawet dwukrotnie.
- Wprowadzone zostało usuwanie długo nieużywanych kopii stron, preferując usuwanie stron z dużymi/długimi wartościami, które w zdecydowanej większości scenariuszy zmieniają się tylko raz na transakcję. W rezultacie zmniejsza się ilość pracy z dyskiem i zwiększa wydajność w scenariuszach z bardzo dużymi transakcjami.
- Wprowadzony został "inteligentny" tryb dzielenia stron podczas wstawiania kluczy. Teraz przy wstawianiu uporządkowanych sekwencji automatycznie zapewniane jest całkowite zapełnienie stron, a w pozostałych przypadkach lepsza równowaga drzewa. W rezultacie średnio strony bazy danych są lepiej wypełnione, a drzewo B jest bardziej zrównoważone, co pozytywnie wpływa na wydajność.
- Dodana została statystyka operacji ze stronami, co pozwala na dokładną ocenę kosztów operacji modyfikujących bazę danych.
- Usunięto ponad dziesięć niedociągnięć i błędów, w tym: rozwiązano problemy z kompilacją przy użyciu MinGW, wykorzystaniem `std::filesystem::path` w iOS <= 13.0, kompilacją z targetowaniem na starsze wersje Windows itp.
- Ogółem wprowadzono ponad 200 zmian w 66 plikach, dodano ~6500 linii, usunięto ~4500.
Szczególnie należy podkreślić wybór projektu Turbo-Geth (turbo-odgałęzienie Go-Ethereum) libmdbx jako nowego backendu przechowywania, a także podziękować zespołowi projektu (w szczególności Aleksiejowi Szarowowi, Artiomowi Worotnikowi i Aleksiejowi Achunowowi) za ogromną pomoc w testowaniu w ekstremalnych scenariuszach użycia. W szczególności w ten sposób odkryto i wyeliminowano defekt w zarządzaniu przewidującym odczytem/cache'owaniem, który prowadził do degradacji wydajności w trudnych do odtworzenia scenariuszach z dużymi bazami danych.
Źródło: opennet.ru
