mdbx: refine README.

This commit is contained in:
Leo Yuriev 2017-11-15 18:47:39 +03:00
parent a63c18261a
commit e68cce8412

192
README.md
View File

@ -1,16 +1,6 @@
### IMPENDING CHANGES WARNING
================================================================================
**Now MDBX is under active development and until November 2017 is expected a big
change both of API and database format. Unfortunately those update will lead to
loss of compatibility with previous versions.**
The aim of this revolution in providing a clearer robust API and adding new
features, including the database properties.
libmdbx libmdbx
====================================== ======================================
Extended LMDB, aka "Расширенная LMDB". **The revised and extended descendant of [Symas LMDB](https://symas.com/lmdb/).**
*The Future will Positive. Всё будет хорошо.* *The Future will Positive. Всё будет хорошо.*
[![Build Status](https://travis-ci.org/leo-yuriev/libmdbx.svg?branch=master)](https://travis-ci.org/leo-yuriev/libmdbx) [![Build Status](https://travis-ci.org/leo-yuriev/libmdbx.svg?branch=master)](https://travis-ci.org/leo-yuriev/libmdbx)
@ -20,8 +10,36 @@ Extended LMDB, aka "Расширенная LMDB".
English version [by Google](https://translate.googleusercontent.com/translate_c?act=url&ie=UTF8&sl=ru&tl=en&u=https://github.com/leo-yuriev/libmdbx/tree/master) English version [by Google](https://translate.googleusercontent.com/translate_c?act=url&ie=UTF8&sl=ru&tl=en&u=https://github.com/leo-yuriev/libmdbx/tree/master)
and [by Yandex](https://translate.yandex.ru/translate?url=https%3A%2F%2Fgithub.com%2FReOpen%2Flibmdbx%2Ftree%2Fmaster&lang=ru-en). and [by Yandex](https://translate.yandex.ru/translate?url=https%3A%2F%2Fgithub.com%2FReOpen%2Flibmdbx%2Ftree%2Fmaster&lang=ru-en).
### Project Status
## Кратко **Now MDBX is under _active development_** and until 2018 is expected a big
change both of API and database format. Unfortunately those update will lead to
loss of compatibility with previous versions.
The aim of this revolution in providing a clearer robust API and adding new
features, including the database properties.
## Содержание
- [Обзор](#Обзор)
- [Сравнение с другими СУБД](#Сравнение-с-другими-СУБД)
- [История & Acknowledgements](#История)
- [Основные свойства](#Основные-свойства)
- [Сравнение производительности](#Сравнение-производительности)
- [Интегральная производительность](#Интегральная-производительность)
- [Масштабируемость чтения](#Масштабируемость-чтения)
- [Синхронная фиксация](#Синхронная-фиксация)
- [Отложенная фиксация](#Отложенная-фиксация)
- [Асинхронная фиксация](#Асинхронная-фиксация)
- [Потребление ресурсов](#Потребление-ресурсов)
- [Недостатки и Компромиссы](#Недостатки-и-Компромиссы)
- [Проблема долгих чтений](#Проблема-долгих-чтений)
- [Сохранность данных в режиме асинхронной фиксации](#Сохранность-данных-в-режиме-асинхронной-фиксации)
- [Доработки и усовершенствования относительно LMDB](#Доработки-и-усовершенствования-относительно-lmdb)
## Обзор
_libmdbx_ - это встраиваемый key-value движок хранения со специфическим _libmdbx_ - это встраиваемый key-value движок хранения со специфическим
набором свойств и возможностей, ориентированный на создание уникальных набором свойств и возможностей, ориентированный на создание уникальных
@ -43,10 +61,19 @@ _libmdbx_ позволяет выполнять операции чтения с
параллельно на каждом ядре CPU, без использования атомарных операций параллельно на каждом ядре CPU, без использования атомарных операций
и/или примитивов синхронизации. и/или примитивов синхронизации.
_libmdbx_ не использует [LSM](https://en.wikipedia.org/wiki/Log-structured_merge-tree), а основан на [B+Tree](https://en.wikipedia.org/wiki/B%2B_tree) с [отображением](https://en.wikipedia.org/wiki/Memory-mapped_file) всех данных в память,
при этом текущая версия не использует [WAL](https://en.wikipedia.org/wiki/Write-ahead_logging).
Это предопределяет многие свойства, в том числе удачные и противопоказанные сценарии использования.
### Сравнение с другими СУБД
Ввиду того, что в _libmdbx_ сейчас происходит революция, я посчитал лучшим решением
ограничится здесь ссылкой на [главу Comparison with other databases](https://github.com/coreos/bbolt#comparison-with-other-databases) в описании _BoltDB_.
### История ### История
_libmdbx_ является развитием "Lightning Memory-Mapped Database", _libmdbx_ является результатом переработки и развития "Lightning Memory-Mapped Database",
известной под аббревиатурой известной под аббревиатурой
[LMDB](https://en.wikipedia.org/wiki/Lightning_Memory-Mapped_Database). [LMDB](https://en.wikipedia.org/wiki/Lightning_Memory-Mapped_Database).
Изначально доработка производилась в составе проекта Изначально доработка производилась в составе проекта
@ -63,7 +90,7 @@ Tables](https://github.com/leo-yuriev/libfpta), aka ["Позитивные
Technologies](https://www.ptsecurity.ru). Technologies](https://www.ptsecurity.ru).
## Acknowledgements #### Acknowledgements
Howard Chu (Symas Corporation) - the author of LMDB, Howard Chu (Symas Corporation) - the author of LMDB,
from which originated the MDBX in 2015. from which originated the MDBX in 2015.
@ -72,8 +99,8 @@ Martin Hedenfalk <martin@bzero.se> - the author of `btree.c` code,
which was used for begin development of LMDB. which was used for begin development of LMDB.
Характеристики и ключевые особенности Основные свойства
===================================== =================
_libmdbx_ наследует все ключевые возможности и особенности от _libmdbx_ наследует все ключевые возможности и особенности от
своего прародителя [LMDB](https://en.wikipedia.org/wiki/Lightning_Memory-Mapped_Database), своего прародителя [LMDB](https://en.wikipedia.org/wiki/Lightning_Memory-Mapped_Database),
@ -124,6 +151,7 @@ _libmdbx_ наследует все ключевые возможности и
Сравнение производительности Сравнение производительности
============================ ============================
Все представленные ниже данные получены многократным прогоном тестов на Все представленные ниже данные получены многократным прогоном тестов на
ноутбуке Lenovo Carbon-2, i7-4600U 2.1 ГГц, 8 Гб ОЗУ, с SSD-диском ноутбуке Lenovo Carbon-2, i7-4600U 2.1 ГГц, 8 Гб ОЗУ, с SSD-диском
SAMSUNG MZNTD512HAGL-000L1 (DXT23L0Q) 512 Гб. SAMSUNG MZNTD512HAGL-000L1 (DXT23L0Q) 512 Гб.
@ -135,7 +163,6 @@ github](https://github.com/pmwkaa/ioarena/tree/HL%2B%2B2015).
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
### Интегральная производительность ### Интегральная производительность
![Comparison #1: Integral Performance](https://raw.githubusercontent.com/wiki/leo-yuriev/libmdbx/img/perf-slide-1.png)
Показана соотнесенная сумма ключевых показателей производительности в трёх Показана соотнесенная сумма ключевых показателей производительности в трёх
бенчмарках: бенчмарках:
@ -158,19 +185,21 @@ github](https://github.com/pmwkaa/ioarena/tree/HL%2B%2B2015).
2. Превосходство libmdbx становится еще более подавляющем, что мешает 2. Превосходство libmdbx становится еще более подавляющем, что мешает
восприятию информации. восприятию информации.
![Comparison #1: Integral Performance](https://raw.githubusercontent.com/wiki/leo-yuriev/libmdbx/img/perf-slide-1.png)
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
### Масштабируемость чтения ### Масштабируемость чтения
![Comparison #2: Read Scalability](https://raw.githubusercontent.com/wiki/leo-yuriev/libmdbx/img/perf-slide-2.png)
Для каждого движка показана суммарная производительность при Для каждого движка показана суммарная производительность при
одновременном выполнении запросов чтения/поиска в 1-2-4-8 потоков на одновременном выполнении запросов чтения/поиска в 1-2-4-8 потоков на
машине с 4-мя физическими процессорами. машине с 4-мя физическими процессорами.
![Comparison #2: Read Scalability](https://raw.githubusercontent.com/wiki/leo-yuriev/libmdbx/img/perf-slide-2.png)
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
### Синхронная фиксация ### Синхронная фиксация
![Comparison #3: Sync-write mode](https://raw.githubusercontent.com/wiki/leo-yuriev/libmdbx/img/perf-slide-3.png)
- Линейная шкала слева и темные прямоугольники соответствуют количеству - Линейная шкала слева и темные прямоугольники соответствуют количеству
транзакций в секунду, усредненному за всё время теста. транзакций в секунду, усредненному за всё время теста.
@ -192,10 +221,11 @@ github](https://github.com/pmwkaa/ioarena/tree/HL%2B%2B2015).
на пустой базе, а при завершении, в результате выполняемых действий, в на пустой базе, а при завершении, в результате выполняемых действий, в
базе насчитывается 10.000 небольших key-value записей. базе насчитывается 10.000 небольших key-value записей.
![Comparison #3: Sync-write mode](https://raw.githubusercontent.com/wiki/leo-yuriev/libmdbx/img/perf-slide-3.png)
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
### Отложенная фиксация ### Отложенная фиксация
![Comparison #4: Lazy-write mode](https://raw.githubusercontent.com/wiki/leo-yuriev/libmdbx/img/perf-slide-4.png)
- Линейная шкала слева и темные прямоугольники соответствуют количеству - Линейная шкала слева и темные прямоугольники соответствуют количеству
транзакций в секунду, усредненному за всё время теста. транзакций в секунду, усредненному за всё время теста.
@ -222,10 +252,11 @@ _libmdbx_ при этом не ведет WAL, а передает весь ко
на пустой базе, а при завершении, в результате выполняемых действий, в на пустой базе, а при завершении, в результате выполняемых действий, в
базе насчитывается 100.000 небольших key-value записей. базе насчитывается 100.000 небольших key-value записей.
![Comparison #4: Lazy-write mode](https://raw.githubusercontent.com/wiki/leo-yuriev/libmdbx/img/perf-slide-4.png)
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
### Асинхронная фиксация ### Асинхронная фиксация
![Comparison #5: Async-write mode](https://raw.githubusercontent.com/wiki/leo-yuriev/libmdbx/img/perf-slide-5.png)
- Линейная шкала слева и темные прямоугольники соответствуют количеству - Линейная шкала слева и темные прямоугольники соответствуют количеству
транзакций в секунду, усредненному за всё время теста. транзакций в секунду, усредненному за всё время теста.
@ -251,10 +282,11 @@ _libmdbx_ при этом не ведет WAL, а передает весь ко
на пустой базе, а при завершении, в результате выполняемых действий, в на пустой базе, а при завершении, в результате выполняемых действий, в
базе насчитывается 10.000 небольших key-value записей. базе насчитывается 10.000 небольших key-value записей.
![Comparison #5: Async-write mode](https://raw.githubusercontent.com/wiki/leo-yuriev/libmdbx/img/perf-slide-5.png)
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
### Стоимость как потребление ресурсов ### Потребление ресурсов
![Comparison #6: Cost comparison](https://raw.githubusercontent.com/wiki/leo-yuriev/libmdbx/img/perf-slide-6.png)
Показана соотнесенная сумма использованных ресурсов в ходе бенчмарка в Показана соотнесенная сумма использованных ресурсов в ходе бенчмарка в
режиме отложенной фиксации: режиме отложенной фиксации:
@ -278,6 +310,8 @@ _libmdbx_ при этом не ведет WAL, а передает весь ко
[getrusage()](http://man7.org/linux/man-pages/man2/getrusage.2.html) и [getrusage()](http://man7.org/linux/man-pages/man2/getrusage.2.html) и
сканированием директорий с данными. сканированием директорий с данными.
![Comparison #6: Cost comparison](https://raw.githubusercontent.com/wiki/leo-yuriev/libmdbx/img/perf-slide-6.png)
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
## Недостатки и Компромиссы ## Недостатки и Компромиссы
@ -404,26 +438,73 @@ _libmdbx_ при этом не ведет WAL, а передает весь ко
при включении `LIFO RECLAIM` в _libmdbx_. при включении `LIFO RECLAIM` в _libmdbx_.
#### Вероятность разрушения БД в режиме `WRITEMAP+MAPASYNC` #### Сохранность данных в режиме асинхронной фиксации
При работе в режиме `WRITEMAP+MAPSYNC` запись измененных страниц При работе в режиме `WRITEMAP+MAPSYNC` запись измененных страниц
выполняется ядром ОС, что имеет ряд преимуществ. Так например, при крахе выполняется ядром ОС, что имеет ряд преимуществ. Так например, при крахе
приложения, ядро ОС сохранит все изменения. приложения, ядро ОС сохранит все изменения.
Однако, при аварийном отключении питания или сбое в ядре ОС, на диске Однако, при аварийном отключении питания или сбое в ядре ОС, на диске
будет сохранена только часть измененных страниц БД. При этом с большой может быть сохранена только часть измененных страниц БД. При этом с большой
вероятностью может оказаться так, что будут сохранены мета-страницы со вероятностью может оказаться так, что будут сохранены мета-страницы со
ссылками на страницы с новыми версиями данных, но не сами новые данные. ссылками на страницы с новыми версиями данных, но не сами новые данные.
В этом случае БД будет безвозвратна разрушена, даже если до аварии В этом случае БД будет безвозвратна разрушена, даже если до аварии
производилась полная синхронизация данных (посредством производилась полная синхронизация данных (посредством
`mdbx_env_sync()`). `mdbx_env_sync()`).
В _libmdbx_ эта проблема устранена, подробности ниже. В _libmdbx_ эта проблема устранена путем полной переработки
пути записи данных:
* В режиме `WRITEMAP+MAPSYNC` _libmdbx_ не обновляет
мета-страницы непосредственно, а поддерживает их теневые копии
с переносом изменений после фиксации данных.
* При завершении транзакций, в зависимости от состояния
синхронности данных между диском и оперативной память,
_libmdbx_ помечает точки фиксации либо как сильные (strong),
либо как слабые (weak). Так например, в режиме
`WRITEMAP+MAPSYNC` завершаемые транзакции помечаются как
слабые, а при явной синхронизации данных как сильные.
* В _libmdbx_ поддерживается не две, а три отдельные мета-страницы.
Это позволяет выполнять фиксацию транзакций с формированием как
сильной, так и слабой точки фиксации, без потери двух предыдущих
точек фиксации (из которых одна может быть сильной, а вторая слабой).
В результате, _libmdbx_ позволяет в произвольном порядке чередовать
сильные и слабые точки фиксации без нарушения соответствующих
гарантий в случае неожиданной системной аварии во время фиксации.
* При открытии БД выполняется автоматический откат к последней
сильной фиксации. Этим обеспечивается гарантия сохранности БД.
Такая гарантия надежности не дается бесплатно. Для
сохранности данных, страницы формирующие крайний снимок с
сильной фиксацией, не должны повторно использоваться
(перезаписываться) до формирования следующей сильной точки
фиксации. Таким образом, крайняя точка фиксации создает
описанный выше эффект "долгого чтения". Разница же здесь в том,
что при исчерпании свободных страниц ситуация будет
автоматически исправлена, посредством записи изменений на диск
и формированием новой сильной точки фиксации.
Таким образом, в режиме безопасной асинхронной фиксации _libmdbx_ будет
всегда использовать новые страницы до исчерпания места в БД или до явного
формирования сильной точки фиксации посредством `mdbx_env_sync()`.
При этом суммарный трафик записи на диск будет примерно такой-же,
как если бы отдельно фиксировалась каждая транзакций.
В текущей версии _libmdbx_ вам предоставляется выбор между безопасным
режимом (по умолчанию) асинхронной фиксации, и режимом `UTTERLY_NOSYNC` когда
при системной аварии есть шанс полного разрушения БД как в LMDB.
В последующих версиях _libmdbx_ будут предусмотрены средства
для асинхронной записи данных на диск с автоматическим
формированием сильных точек фиксации.
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
Дополнительные "фичи" _libmdbx_ относительно LMDB Доработки и усовершенствования относительно LMDB
================================================= ================================================
1. Режим `LIFO RECLAIM`. 1. Режим `LIFO RECLAIM`.
@ -461,56 +542,11 @@ _libmdbx_ при этом не ведет WAL, а передает весь ко
3. Гарантия сохранности БД в режиме `WRITEMAP+MAPSYNC`. 3. Гарантия сохранности БД в режиме `WRITEMAP+MAPSYNC`.
При работе в режиме `WRITEMAP+MAPSYNC` запись измененных В текущей версии _libmdbx_ вам предоставляется выбор между безопасным
страниц выполняется ядром ОС, что имеет ряд преимуществ. Так режимом (по умолчанию) асинхронной фиксации, и режимом `UTTERLY_NOSYNC`
например, при крахе приложения, ядро ОС сохранит все изменения. когда при системной аварии есть шанс полного разрушения БД как в LMDB.
Для подробностей смотрите раздел
Однако, при аварийном отключении питания или сбое в ядре ОС, на [Сохранность данных в режиме асинхронной фиксации](#Сохранность-данных-в-режиме-асинхронной-фиксации).
диске будет сохранена только часть измененных страниц БД. При
этом с большой вероятностью может оказаться так, что будут
сохранены мета-страницы со ссылками на страницы с новыми
версиями данных, но не сами новые данные. В этом случае БД
будет безвозвратна разрушена, даже если до аварии производилась
полная синхронизация данных (посредством `mdbx_env_sync()`).
В _libmdbx_ эта проблема устранена путем полной переработки
пути записи данных:
* В режиме `WRITEMAP+MAPSYNC` _libmdbx_ не обновляет
мета-страницы непосредственно, а поддерживает их теневые копии
с переносом изменений после фиксации данных.
* При завершении транзакций, в зависимости от состояния
синхронности данных между диском и оперативной память,
_libmdbx_ помечает точки фиксации либо как сильные (strong),
либо как слабые (weak). Так например, в режиме
`WRITEMAP+MAPSYNC` завершаемые транзакции помечаются как
слабые, а при явной синхронизации данных как сильные.
* В _libmdbx_ поддерживается не две, а три отдельные мета-страницы.
Это позволяет выполнять фиксацию транзакций с формированием как
сильной, так и слабой точки фиксации, без потери двух предыдущих
точек фиксации (из которых одна может быть сильной, а вторая слабой).
В результате, _libmdbx_ позволяет в произвольном порядке чередовать
сильные и слабые точки фиксации без нарушения соответствующих
гарантий в случае неожиданной системной аварии во время фиксации.
* При открытии БД выполняется автоматический откат к последней
сильной фиксации. Этим обеспечивается гарантия сохранности БД.
К сожалению, такая гарантия надежности не дается бесплатно. Для
сохранности данных, страницы формирующие крайний снимок с
сильной фиксацией, не должны повторно использоваться
(перезаписываться) до формирования следующей сильной точки
фиксации. Таким образом, крайняя точка фиксации создает
описанный выше эффект "долгого чтения". Разница же здесь в том,
что при исчерпании свободных страниц ситуация будет
автоматически исправлена, посредством записи изменений на диск
и формированием новой сильной точки фиксации.
В последующих версиях _libmdbx_ будут предусмотрены средства
для асинхронной записи данных на диск с автоматическим
формированием сильных точек фиксации.
4. Возможность автоматического формирования контрольных точек 4. Возможность автоматического формирования контрольных точек
(сброса данных на диск) при накоплении заданного объёма изменений, (сброса данных на диск) при накоплении заданного объёма изменений,