Публикуван е първият стабилен релиз на проекта TidesDB, който развива библиотека за съхранение на данни във формат ключ/стойност. Проектът може да се използва като самостоятелен двигател или за вграждане в приложения. Ключови характеристики включват поддръжка на ACID транзакции и оптимизация за ефективно съхранение на данни на Flash носители и в оперативна памет. Кодът е написан на C и се разпространява под лиценза MPL 2.0. Обвивките са подготвени за C++, Go, Java, Python, Rust, Lua и JavaScript.
За съхранение на данни се използва структура LSM-дърво (журнално-структурирано дърво със сливане), осигуряваща висока производителност не само при четене, но и при извършване на операции по запис и промяна на данни. Операции по четене не блокират записването и четенето на данни, а операциите по запис блокират само семейства от колони, в които се извършва запис. За допълнително ускоряване на четенето се поддържат индекси и кеширане на базата на bloom-филтри (позволяват проверка за принадлежност към множество, допускаща фалшиво определение на отсъстващ елемент, но изключваща пропускането на съществуващ елемент).
Има пълна поддръжка на ACID транзакции, позволяващи атомарно внасяне на промени, обхващащи семейства от колони, и при необходимост атомарно връщане на операции. Данните могат да се съхраняват в компресирана форма с избор на алгоритъм за компресия, свързан с семейството на колоните. Възможно е поставяне на блокировки на ниво отделни семейства от колони и опаковане на хранилището в паралелен режим без блокиране на операции с базата данни.
Основни възможности:
- Поддръжка на семейства от колони (Column Families) — изолирани набори от данни във формат ключ/стойност. За всяко семейство от колони се използват собствени memtable, SSTable и WAL лог.
- ACID транзакции, обхващащи няколко операции с семейства от колони.
- Оптимизация за паралелен достъп до данни.
- Поддръжка на двупосочни итератори, позволяващи преминаване през двойки ключ/стойност напред или назад относно избраната позиция в хранилището, използвайки първоначално зададен метод на сортиране.
- Поддръжка за добавяне на собствени функции за сравнение на ключове. Наличие на вградени функции за сравнение memcmp, string и numeric.
- Водене на лог на операциите (WAL, Write-Ahead Log) и автоматично възстановяване на memtable (съхранение в оперативна памет) от този лог при стартиране.
- Използване на Bloom-филтри за минимизиране на обращенията към хранилището чрез проверка на наличието на ключа преди четенето от SSTable (постоянно хранилище).
- Поддръжка на алгоритми Snappy, LZ4 и ZSTD за компресия на записи в хранилището SSTable и WAL-лог.
- Възможност за определяне на времето за живот на записите (TTL) и автоматично изключване на просрочени записи.
- Три режима на синхронизация на данни в ОЗУ с постоянното хранилище: NONE (най-бърз), BACKGROUND (балансиран), FULL (най-надежден).
- Възможност за настройка на размера на memtable, методи на компресия, bloom-филтри, режим на синхронизация и параметри на опаковка за всяко семейство колони.
- Прост C API, който връща 0 при успешното изпълнение на операцията и -1 при грешка.
- Използване на SBHA (Sorted Binary Hash Array) за бързо търсене на данни в SSTable, позволяващо определяне на.offset на блоковете с ключове без пълно сканиране.
- Компактен преносим бинарен формат на представяне на базата, поддържащ версиониране.
- Вградени механизми за контрол на целостта, откриване на повреди в данните и възстановяване.
Източник: opennet.ru
