Skip to content

Режимы долговечности и синхронизации

Смежные: Установка и сборка · Ограничения · Учебник: Том 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 сама синхронизирует данные лениво (по порогам и таймаутам). Целостность гарантирована даже при крахе ОС и потере питания (в отличие от LMDB MDB_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 для ценных данных.
  • Не смешивайте режимы на одном окружении в разных процессах.