Opublikowano pierwszą stabilną wersję projektu TidesDB, rozwijającego bibliotekę do przechowywania danych w formacie klucz/wartość. Projekt może być używany zarówno jako samodzielny silnik, jak i do wbudowania w aplikacje. Wśród kluczowych możliwości wyróżnia się wsparcie dla transakcji ACID oraz optymalizację przechowywania danych na pamięciach Flash i w pamięci RAM. Kod jest napisany w języku C i jest dystrybuowany na licencji MPL 2.0. Przygotowano wiązania dla języków C++, Go, Java, Python, Rust, Lua i JavaScript.
Do przechowywania danych wykorzystana jest struktura LSM-tree (drzewo LSM - dziennikowo-strukturalne z łączeniem), zapewniająca wysoką wydajność nie tylko przy odczycie, ale także podczas wykonywania operacji zapisu i modyfikacji danych. Operacje odczytu nie blokują zapisu ani odczytu danych, natomiast operacje zapisu blokują jedynie rodzinę kolumn, w której wykonywana jest zapis. W celu dodatkowego przyspieszenia odczytu obsługiwane są indeksy i pamięć podręczna oparta na filtrach Bloom (umożliwiające sprawdzanie przynależności do zbioru, dopuszczające fałszywe określenie braku elementu, ale wykluczające pominięcie istniejącego elementu).
Pełne wsparcie dla transakcji ACID, umożliwiających atomowe wprowadzanie zmian dotyczących rodzin kolumn i, w razie potrzeby, atomowe wycofywanie operacji. Dane mogą być przechowywane w skompresowanej formie z wyborem algorytmu kompresji związanym z rodziną kolumn. Istnieje możliwość nakładania blokad na poziomie pojedynczych rodzin kolumn oraz pakowania magazynu w trybie równoległym bez blokady wykonania operacji z bazą danych.
Podstawowe funkcje:
- Wsparcie dla rodzin kolumn (Column Families) - izolowanych zbiorów danych w formacie klucz/wartość. Dla każdej rodziny kolumn używane są oddzielne memtable, SSTable i dzienniki WAL.
- Transakcje ACID obejmujące wiele operacji z rodzinami kolumn.
- Optymalizacja dla równoległego dostępu do danych.
- Wsparcie dla dwukierunkowych iteratorów, umożliwiających przeglądanie par klucz/wartość w przód lub w tył względem wybranej pozycji w magazynie, używając pierwotnie zdefiniowanej metody sortowania.
- Wsparcie dla dodawania własnych funkcji porównania kluczy. Wbudowane funkcje porównania memcmp, string i numeric.
- Prowadzenie dziennika operacji (WAL, Write-Ahead Log) oraz automatyczne przywracanie memtable (przechowalnia w pamięci) z tego dziennika podczas uruchamiania.
- Zastosowanie filtrów Bloom dla minimalizacji odwołań do nośnika poprzez sprawdzanie istnienia klucza przed odczytem z SSTable (przechowalnia stała).
- Wsparcie dla algorytmów Snappy, LZ4 i ZSTD do kompresji rekordów w przechowalni SSTable i dzienniku WAL.
- Możliwość określenia czasu życia rekordów (TTL) oraz automatycznego wykluczania przeterminowanych rekordów.
- Trzy tryby synchronizacji danych w pamięci RAM z przechowalnią stałą: NONE (najszybszy), BACKGROUND (wyważony), FULL (najbardziej niezawodny).
- Możliwość dostosowania rozmiaru memtable, metod kompresji, filtrów bloom, trybu synchronizacji oraz parametrów pakowania dla każdej rodziny kolumn.
- Proste C API, które zwraca 0 przy pomyślnym wykonaniu operacji i -1 w przypadku błędu.
- Użycie SBHA (Sorted Binary Hash Array) do szybkiego wyszukiwania danych w SSTable, pozwalające określić przesunięcia bloków z kluczami bez pełnego skanowania.
- Kompaktowy, przenośny format binarnej reprezentacji bazy, wspierający wersjonowanie.
- Wbudowane mechanizmy kontroli integralności, wykrywania uszkodzeń danych i ich przywracania.
Źródło: opennet.ru
