След три месеца разработка, издадена библиотека 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-битови версии, оценка на обема на запитванията по диапазони. Доставя се утилита за проверка на целостта на структурата на базата данни с някои възможности за възстановяване. От 2016 година проектът се финансира от Positive Technologies и от 2017 година се използва в техните продукти, а наложените от правителството на САЩ санкции срещу Positive Technologies не оказват значително влияние.
Основните нововъведения, подобрения и корекции, добавени след предишното издание:
- Налични са връзки за Ruby от Mahlon E. Smith и пробна версия на връзките за Python от Noel Kuntze, обновени са връзките за GoLang от Алексей Шаров.
- За режима «MDBX_WRITEMAP», когато данните в базата данни се променят директно в RAM, е реализиран «прозрачен канал» на диска за изменените страници на базата данни. Сега, след всяка операция, такива страници веднага са напълно готови за запис на диска и ядрото на ОС може само да изхвърли изменените страници на диска, а фиксирането на транзакцията не изисква тяхната модификация. В резултат, в натоварени сценарии с недостатъчно RAM, обемът на дисковите операции може да се намали до 2 пъти.
- Реализирано е изхвърляне на отдавна неизползвани тенекиени копия на изменените страници, с предпочитание за изхвърляне на страници с големи/дълги стойности, които в подавляващото мнозинство от сценарии се променят само веднъж за транзакция. В резултат на това се намалява обемът на обмена с диска и се увеличава производителността в сценарии с много големи транзакции.
- Внедрен ефикасен режим за разделяне на страници при вмъкване на ключове. Сега, когато се вмъкват подредени последователности, автоматично се осигурява пълно запълване на страниците, а в останалите случаи – по-оптимално балансиране на дървото. В резултат на това, средно, страниците в базата данни се запълват по-оптимално, а B-деревото става по-балансирано, което положително влияе на производителността.
- Добавена е статистика за операциите със страниците, което позволява точно оценяване на разходите за модифициращи операции с базата данни.
- Отстранени са над десет недостатъка и грешки, включително: решени проблеми с компилацията чрез MinGW, използването на `std::filesystem::path` в iOS <= 13.0, компилация за по-стари версии на Windows и т.н.
- Общо са направени над 200 промени в 66 файла, добавени са около 6500 реда, изтрити са приблизително 4500.
Отделно бихме искали да отбележим избора на проекта Turbo-Geth (турбо-форк на Go-Ethereum) libmdbx за нов бекенд за съхранение и да благодарим на екипа на проекта (особено на Алексей Шаров, Артьом Воротников и Алексей Ахунов) за значителната помощ в тестовете в екстремни сценарии на използване. По-специално, по този начин беше открит и отстранен дефект в управлението на предварителното четене/кеширането, който водеше до влошаване на производителността в трудно воспроизводими сценарии с големи бази данни.
Източник: opennet.ru
