Випуск високопродуктивної СУБД, що вбудовується libmdbx 0.10

Після трьох місяців розробки відбувся випуск бібліотеки libmdbx 0.10.0 (MDBX) з реалізацією високопродуктивної, компактної бази даних класу ключ-значення, що вбудовується. Код libmdbx розповсюджується під ліцензією OpenLDAP Public License. libmdbx є глибокою переробкою СУБД LMDB і за заявою розробників перевершує свого прабатька за надійністю, набором можливостей та продуктивністю. Заявляється, що libmdbx до 20% швидше за LMDB у CRUD сценаріях і до 30% швидше, якщо при складанні libmdbx відключити внутрішній контроль до порівнянного з LMDB рівня.

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

Основні нововведення, доопрацювання та виправлення, додані після минулого випуску:

  • Доступні прив'язки для Ruby від Mahlon E. Smith і пробна версія прив'язок для Python від Noel Kuntze, оновлені прив'язки для GoLang від Олексія Шарова.
  • Для режиму MDBX_WRITEMAP, коли дані БД змінюються безпосередньо в ОЗУ, реалізована прозора протока на диск змінених сторінок БД. Тепер, після завершення кожної операції, такі сторінки одразу повністю готові для запису на диск і ядро ​​ОС може самостійно скидати змінені сторінки на диск, а фіксація транзакції не вимагатиме їх модифікації. В результаті, у навантажених сценаріях з нестачею ОЗП, обсяг дискових операцій може скорочуватися до 2 разів.
  • Реалізовано витіснення давно не використовується тіньових копій змінених сторінок, з перевагою витіснення сторінок з великими/довгими значеннями, які у переважній більшості сценаріїв змінюються лише один раз за транзакцію. В результаті зменшується обсяг обміну з диском та збільшується продуктивність у сценаріях з дуже великими транзакціями.
  • Реалізовано "розумний" режим поділу сторінок при вставці ключів. Тепер при вставці впорядкованих послідовностей автоматично забезпечується повне заповнення сторінок, а в інших випадках оптимальне балансування дерева. В результаті, в середньому, сторінки БД заповнюються оптимальніше, а B-дерево виходить більш збалансованим, що позитивно впливає на продуктивність.
  • Додано статистику операцій зі сторінками, що дозволяє точно оцінювати вартість операцій з БД, що модифікують.
  • Усунено більше десятка недоліків і помилок, у тому числі: вирішено проблеми зі складанням за допомогою MinGW, використання `std::filesystem::path` в iOS <= 13.0, складання з таргетуванням на старі версії Windows і т.д.
  • Сумарно внесено понад 200 змін до 66 файлів, додано ~6500 рядків, видалено ~4500.

Окремо хочеться відзначити вибір проектом Turbo-Geth (турбо-форк Go-Ethereum) libmdbx як новий бекенд зберігання, а також подякувати команді проекту (особливо Олексію Шарову, Артему Воротникову та Олексію Ахунову) за велику допомогу в тестуванні в екстремальних сценаріях використання. Зокрема, так було виявлено та усунено дефект в управлінні запобіжним читанням/кешуванням, що призводило до деградації продуктивності у складно-відтворюваних сценаріях з великими БД.

Джерело: opennet.ru

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