Випуск високопродуктивної вбудованої СУБД libmdbx 0.10.4 та libfpta 0.3.9

Відбувся випуск бібліотек libmdbx 0.10.4 (MDBX) з реалізацією високопродуктивної компактної бази даних класу ключ-значення, що вбудовується, і пов'язаної бібліотеки libfpta 0.3.9 (FPTA), що реалізує поверх MDBX табличне представлення даних з вторинними і складовими індексами. Обидві бібліотеки розповсюджуються під ліцензіями, схваленими OSI. Підтримуються всі актуальні операційні системи та архітектури, а також російський Ельбрус 2000.

Історично libmdbx є глибокою переробкою СУБД LMDB і перевершує свого прабатька за надійністю, набором можливостей та продуктивністю. У порівнянні з LMDB, у libmdbx велика увага приділяється якості коду, стабільній роботі API, тестуванню та автоматичним перевіркам. Постачається утиліта перевірки цілісності структури БД із деякими можливостями відновлення.

Технологічно libmdbx пропонує ACID, строгу серіалізацію змін та неблокуюче читання з лінійним масштабуванням по ядрах ЦПУ. Підтримується автокомпактифікація, автоматичне керування розміром БД, оцінка обсягу вибірок діапазонів (range query estimation). З 2016 року проекти фінансується компанією Positive Technologies і з 2017 року використовується у її продуктах.

Для libmdbx пропонується C++ API, а також підтримувані ентузіастами прив'язки до мов Rust, Haskell, Python, NodeJS, Ruby, Go, Nim. Для libfpta публічно доступний лише опис API як заголовного файлу C/C++.

Основні нововведення, доопрацювання та виправлення, додані після попередньої новини від 9 травня:

  • Забезпечено можливість відтворюваних збірок.
  • Усунено помилку, через яку при дуже рідкому збігу обставин під час фіксації транзакції могло відбуватися зациклювання/зависання. Проблему виявлено фахівцями Positive Tecnologies при внутрішньому тестуванні власних продуктів.
  • Доопрацьовано тести та розширено тестові сценарії для перевірки всіх досяжних не ізоморфних станів дерева сторінок та вмісту GC усередині БД.
  • У C++ API виправлено зайвий "noexcept", додано додаткові навантаження для методу "cursor::erase()", реалізація буферів позбавлена ​​використання "std::string" для забезпечення вирівнювання (актуально для CLANG libstdc++).
  • Усунено регрес в алгоритмі спіллінгу брудних сторінок (виборче витіснення змінених сторінок БД) рідкісною несподіваною помилкою MDBX_PROBLEM, що виявлялася, при зміні даних у величезних транзакціях.
  • Проведено перевірку фазингом з додаванням низки перевірок для забезпечення стабільності при навмисному пошкодженні БД.
  • Усунуто незначні попередження UndefinedBehaviorSanitizer і Coverity Scan issues.
  • Виправлено перевірку застарілого та вже не використовується внутрішнього прапора «P_DIRTY» у вкладених сторінках усередині образів БД, створених старими версіями бібліотеки.
  • У скриптах CMake доопрацьовано пошук компонентів компілятора необхідних для LTO (link-time optimization).
  • Максимальна кількість одночасних читачів збільшена до 32767.
  • Прискорено роботу при використанні Valgrind та AddressSanitizer.
  • На Windows усунуто рекурсивне використання SRW-lock при роботі в режимі MDBX_NOTLS (без використання thread local storage), виправлено генерацію bootid у разі зміни системного часу, доопрацьовано детектування WSL1 і WSL2, додано можливість відкриття БД на Plan 9 змонтованої за допомогою DrvFS.
  • Сумарно внесено понад 160 змін до 57 файлів, додано ~5000 рядків, видалено ~2500.

Окремо хочеться подякувати команді проекту Erigon (екосистема Ethereum) за допомогу у тестуванні в екстремальних сценаріях використання. Показово, що за п'ять місяців з моменту виходу libmdbx v0.10.0, при обсязі БД 1-2 Тб у кожній інсталяції Erigon (використовується на 7% вузлів Ethereum), надійшло лише три повідомлення про пошкодження БД, всі відбулися через зовнішні причини, а не помилок: у двох випадках причиною були збої ОЗУ, в третьому помилка обнулення даних у специфічній конфігурації підсистеми зберігання з використанням BTRFS.

Джерело: opennet.ru

Додати коментар або відгук