Режимы долговечности и синхронизации
Смежные: Установка и сборка · Ограничения · Учебник: Том IV «Производительность»
libmdbx предлагает набор компромиссов «долговечность ↔ скорость записи», выбираемых на уровне окружения. По умолчанию — максимально надёжный режим.
Таблица режимов
| Режим | Данные на диск | Мета-страница | Переживает сбой ОС | Переживает потерю питания |
|---|---|---|---|---|
MDBX_DURABLE (по умолчанию) |
каждый коммит | каждый коммит | да | да |
MDBX_NOMETASYNC |
каждый коммит | нет | да | последние коммиты могут откатиться |
MDBX_SAFE_NOSYNC |
лениво (пороги/таймаут) | лениво | да | недавние коммиты могут пропасть, целостность гарантирована |
MDBX_UTTERLY_NOSYNC |
без явной синхронизации | нет | нет | возможно повреждение (поведение как MDB_NOSYNC у LMDB) |
Подробная семантика — в справочнике.
Ключевые различия
MDBX_DURABLE— полная долговечность: каждый коммит синхронизирует и данные, и мета-страницы. Цена — fsync на каждый коммит; на медленных носителях это узкое место write-intensive нагрузок (shadow paging вместо WAL: объём записи на коммит пропорционален изменившимся страницам).MDBX_NOMETASYNC— данные синхронизируются, мета — нет: при потере питания система откатится к последнему полностью зафиксированному steady-состоянию, целостность сохраняется.MDBX_SAFE_NOSYNC— libmdbx сама синхронизирует данные лениво (по порогам и таймаутам). Целостность гарантирована даже при крахе ОС и потере питания (в отличие от LMDBMDB_NOSYNC), но несколько последних коммитов могут быть потеряны. Идеально для append-подобных нагрузок.MDBX_UTTERLY_NOSYNC— максимальная скорость, минимальные гарантии: только для некритичных данных (кэши, временные наборы).
Автоматическая синхронизация
Для MDBX_SAFE_NOSYNC/MDBX_NOMETASYNC пороги автоматического steady-сброса
настраиваются: mdbx_env_set_syncbytes() (по объёму записанного) и
mdbx_env_set_syncperiod() (по таймауту); текущие пороги видны в
mdbx_env_info_ex. Асинхронные mdbx_env_sync_ex() / mdbx_env_sync_poll()
позволяют приложению инициировать сброс в удобный момент.
WRITEMAP
MDBX_WRITEMAP отображает страницы данных в память и пишет через mmap
(msync вместо pwrite) — уменьшает копирование данных ценой большего
memory-mapped I/O; комбинируется с режимами выше (обычно с MDBX_NOMETASYNC).
Сопутствующие опции: MDBX_opt_prefault_write_enable (упреждающая запись),
MDBX_opt_writethrough_threshold (сквозная запись против записи+fdatasync).
Особенности платформ
- macOS/iOS: по умолчанию используется
fcntl(F_FULLFSYNC)— единственный способ гарантировать долговечность при потере питания; в write-intensive сценариях это заметно снижает скорость относительно LMDB (обычныйfsync()). Переопределение — опция сборкиMDBX_OSX_SPEED_INSTEADOF_DURABILITY=1. - Windows: для блокировок используется
LockFileEx()— работает на сетевых дисках и защищает от неправильного использования (poka-yoke); в тестах скорости это может отставать от LMDB с именованными мьютексами.
Рекомендации
- Production по умолчанию —
MDBX_DURABLE. - Логи, телеметрия, кэши с допустимой потерей последних записей —
MDBX_SAFE_NOSYNC(+ пороги авто-синхронизации). - Никогда не используйте
MDBX_UTTERLY_NOSYNCдля ценных данных. - Не смешивайте режимы на одном окружении в разных процессах.