AG
Все проекты

dm-timemachine: Device Mapper для CDP

CDP-движок для Linux-стека хранения: перехват блочного ввода-вывода на уровне Device Mapper, журнал изменений, восстановление на момент времени, метрики Prometheus/Grafana.

Linux KernelDevice MapperCPythonPrometheusGrafanaDocker
dm-timemachine: Device Mapper для CDP

Задача

Снимки «раз в N минут» слишком редки, классический бэкап слишком медленный для оперативного восстановления. После ошибки оператора или логической порчи данных состояние нужно вернуть не «примерно», а максимально близко к моменту сбоя.

dm-timemachine решает это через CDP (continuous data protection): вместо редких снимков - непрерывный журнал изменений между контрольными точками. Можно откатить том к нужному моменту времени, разобрать инцидент на уровне блоков и строить восстановление с предсказуемым RPO.

Как работает

Ядерный модуль встраивается в путь записи на уровне Device Mapper и журналирует каждую значимую операцию записи. Ключевое решение - логирование как параллельный канал рядом с основным вводом-выводом, а не вместо него: рабочая запись всё равно доходит до диска, а слой защиты живёт отдельной подсистемой со своими метриками, контролем перегрузки и политиками деградации.

Путь данных:

  1. Приложение или файловая система пишет в устройство Device Mapper.
  2. target.c получает bio и передает запись в io_engine.c.
  3. policy.c решает, захватывать операцию или отбросить: размер записи, списки устройств, ограничение частоты.
  4. metadata.c собирает заголовок (временная метка, сектор, размер, версия, флаги), log_store.c пишет его вместе с полезной нагрузкой в кольцевой буфер.
  5. Исходный bio перенаправляется на нижележащее устройство.
  6. Пользовательское пространство читает журнал через /dev/dm_timemachine_log, экспортирует метрики или воспроизводит данные.

Модуль разделён на изолированные слои (core, target, io_engine, metadata, policy, log_store, read_api), чтобы режим хранения, политики и API восстановления можно было развивать, не переписывая путь данных.

Возможности

  • Кольцевой буфер с фиксированным потреблением памяти; хранение в RAM для быстрого стенда или на отдельном блочном устройстве для персистентности
  • Политики захвата: ограничение размера записи, allow/deny-списки устройств, лимит записей в секунду
  • Read API: чтение журнала из пользовательского пространства через символьное устройство
  • Экспортер Prometheus на Python и дашборды Grafana: captured, dropped, log_used, задержки
  • Скрипты воспроизведения: проверка без записи, откат состояния, восстановление до заданной временной отметки
  • Дымовые и интеграционные проверки: жизненный цикл dmsetup, воспроизведение, персистентность

Результат

Рабочий CDP-контур: том Device Mapper с непрерывным журналом изменений, восстановлением на момент времени и наблюдаемостью через Prometheus/Grafana. Проверяется дымовыми и интеграционными тестами в воспроизводимой среде (виртуальная машина, Docker, devcontainer).

Технический стек

  • Ядерный модуль: C (Linux kernel API)
  • Инструменты пользовательского пространства: Python
  • Мониторинг: Prometheus, Grafana, Docker Compose
  • Тестирование: KUnit, дымовые и интеграционные проверки
  • Окружение: devcontainer, виртуальная машина, Docker