Wydanie wysokowydajnego wbudowanego systemu DBMS libmdbx 0.10

Po trzech miesiącach prac wypuszczono wersję libmdbx 0.10.0 (MDBX), która implementuje wysokowydajną, kompaktową, wbudowaną bazę danych klucz-wartość. Kod libmdbx jest objęty licencją publiczną OpenLDAP. libmdbx to głęboka przeróbka systemu LMDB DBMS i według twórców przewyższa swojego przodka pod względem niezawodności, zakresu możliwości i wydajności. Stwierdzono, że libmdbx jest do 20% szybszy niż LMDB w scenariuszach CRUD i do 30% szybszy, jeśli kontrola wewnętrzna jest wyłączona podczas budowania libmdbx do poziomu porównywalnego z LMDB.

Libmdbx oferuje ACID, serializację silnych zmian i nieblokujące odczyty, które skalują się liniowo pomiędzy rdzeniami procesora. W libmdbx dużą uwagę przywiązuje się do jakości kodu, stabilnego działania API, testowania i automatycznych kontroli. Obsługuje automatyczne kompaktowanie, automatyczne zarządzanie rozmiarem bazy danych, pojedynczy format bazy danych dla zestawów 32-bitowych i 64-bitowych oraz szacowanie zapytań o zakres. Dostarczone jest narzędzie do sprawdzania integralności struktury bazy danych z pewnymi możliwościami odzyskiwania. Od 2016 roku projekt jest finansowany przez Positive Technologies i od 2017 roku jest stosowany w jej produktach, a sankcje nałożone przez rząd USA na Positive Technologies nie przynoszą zauważalnego efektu.

Najważniejsze innowacje, ulepszenia i poprawki dodane od ostatniej wersji:

  • Dostępne jest wiązanie Ruby autorstwa Mahlona E. Smitha i wersja próbna wiązań Pythona autorstwa Noela Kuntze, a wiązania GoLang autorstwa Alexeya Sharova zostały zaktualizowane.
  • W trybie „MDBX_WRITEMAP”, gdy dane bazy danych są zmieniane bezpośrednio w pamięci RAM, realizowany jest „przezroczysty przelew” zmienionych stron bazy danych na dysk. Teraz po zakończeniu każdej operacji takie strony są od razu całkowicie gotowe do zapisu na dysk, a jądro systemu operacyjnego może samodzielnie zrzucić zmienione strony na dysk, a zatwierdzenie transakcji nie będzie wymagało ich modyfikacji. W rezultacie w obciążonych scenariuszach z niewystarczającą ilością pamięci RAM wolumen operacji dyskowych można zmniejszyć nawet 2-krotnie.
  • Wprowadzono eksmisję długo nieużywanych kopii w tle zmodyfikowanych stron, z preferencją eksmisji stron o dużych/długich wartościach, które w zdecydowanej większości scenariuszy są modyfikowane tylko raz na transakcję. Rezultatem jest zmniejszenie ruchu na dysku i poprawa wydajności w scenariuszach z bardzo dużymi transakcjami.
  • Zaimplementowano „inteligentny” tryb dzielenia stron podczas wstawiania kluczy. Teraz podczas wstawiania uporządkowanych sekwencji strony są automatycznie całkowicie zapełnione, a w pozostałych przypadkach drzewo jest bardziej optymalnie zbilansowane. W rezultacie strony bazy danych są średnio wypełniane bardziej optymalnie, a drzewo B jest bardziej zrównoważone, co pozytywnie wpływa na wydajność.
  • Dodano statystyki operacji na stronach, co pozwala dokładnie oszacować koszt modyfikacji operacji na bazie danych.
  • Naprawiono kilkanaście błędów i błędów, w tym: problemy z budowaniem przy użyciu MinGW, używaniem `std::filesystem::path` w iOS <= 13.0, budowaniem skierowanym do starszych wersji systemu Windows itp.
  • W sumie wprowadzono ponad 200 zmian w 66 plikach, dodano ~6500 linii, usunięto ~4500.

Osobno chciałbym odnotować wybór projektu Turbo-Geth (turbo fork Go-Ethereum) libmdbx jako nowego backendu pamięci masowej, a także podziękować zespołowi projektowemu (zwłaszcza Aleksiejowi Szarowowi, Artemowi Worotnikowowi i Aleksiejowi Achunowowi) za ich świetna pomoc w testowaniu w ekstremalnych scenariuszach przypadków użycia. W szczególności wykryto i wyeliminowano defekt w kontroli odczytu z wyprzedzeniem/buforowania, co doprowadziło do pogorszenia wydajności w trudnych do odtworzenia scenariuszach z dużymi bazami danych.

Źródło: opennet.ru

Dodaj komentarz