Бэкапы и восстановление

Рейтинг: 61% · 6 голосов
Исчерпывающий курс по Tarantool 3.x: модель данных, движки memtx и vinyl, Lua и файберы, транзакции и MVCC, SQL, конфигурация (box.cfg и декларативная 3.x), репликация и Raft, шардирование vshard, эксплуатация, безопасность. 47 уроков со схемами.
Ответить
Аватара пользователя
denis_tnt
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Бэкапы и восстановление

Сообщение denis_tnt »

Оглавление курса (47)
  1. Что такое Tarantool: in-memory СУБД и сервер приложений
  2. Архитектура изнутри: процесс, потоки, event-loop
  3. Установка и первый запуск: tt CLI, пакеты, Docker
  4. Интерактив: консоль, admin-консоль, первые команды
  5. Спейсы и кортежи: форматы, типы данных
  6. Типы индексов и их применимость
  7. Движки хранения: memtx vs vinyl
  8. DDL: схема, создание спейсов и индексов, миграции
  9. DML и выборки: insert/update/upsert, итераторы
  10. Персистентность: WAL, снапшоты, recovery
  11. Внутренности memtx: аллокаторы slab/arena, память
  12. Внутренности vinyl: LSM, компакция, тюнинг
  13. Lua и LuaJIT в Tarantool: box, модули, rocks
  14. Файберы: кооперативная многозадачность, каналы
  15. Транзакции: ACID, изоляция, MVCC
  16. Хранимые процедуры, модули, организация приложения
  17. net.box: удалённые вызовы, async
  18. Пулы соединений, балансировка, реконнект
  19. Ошибки и диагностика: box.error, pcall
  20. Типы и сериализация: MsgPack, decimal, datetime, uuid
  21. SQL в Tarantool: возможности и связь с box
  22. SQL: таблицы, JOIN, подзапросы, представления
  23. SQL: подготовленные выражения, транзакции, Lua-интероп
  24. Классическая конфигурация box.cfg (legacy 1.x/2.x)
  25. Декларативная конфигурация 3.x: config.yaml, иерархия
  26. Роли и приложения в 3.x
  27. Централизованная конфигурация: etcd / config storage
  28. tt CLI глубоко: разработка, сборка, запуск
  29. Cartridge (официальный legacy) и миграция на 3.x
  30. Репликация: replicaset, топологии
  31. Механика репликации: WAL-стриминг, vclock
  32. Синхронная репликация и выборы лидера (Raft)
  33. Жизненный цикл узла: bootstrap, join, rejoin
  34. vshard: router/storage, виртуальные бакеты
  35. Решардинг и rebalancing бакетов
  36. Запросы поверх шардов: map-reduce, crud
  37. Мониторинг: метрики, Prometheus, Grafana
  38. Логирование и аудит
  39. Бэкапы и восстановление (вы здесь)
  40. Безопасность: аутентификация, RBAC, TLS
  41. Производительность: профилирование, тюнинг
  42. Обновления: схема, rolling upgrade
  43. Деплой в продакшен: Docker, топология (официальные паттерны)
  44. Администрирование через официальный TCM (Tarantool Cluster Manager)
  45. Коннекторы: Python, Go, Java
  46. Ключевые модули (rocks): crud, metrics, queue, expirationd
  47. Capstone: шардированный отказоустойчивый кластер
Обзор: зачем вообще бэкап, если есть WAL

Tarantool хранит данные в памяти (движок memtx) и/или на диске (vinyl), но устойчивость к сбоям обеспечивает не оперативная память, а два типа файлов на диске: снапшоты (.snap) и журнал упреждающей записи WAL (.xlog). Снапшот - это полный слепок всего набора данных на момент контрольной точки (checkpoint). WAL - это последовательность всех изменяющих запросов, записанных ПОСЛЕ снапшота. Эта пара и есть основа всей стратегии бэкапа: снапшот даёт базу, WAL даёт дельту до текущего момента.

Ключевая особенность движка - append-only архитектура. Tarantool никогда не перезаписывает уже записанные данные, он только дописывает новые файлы. Именно поэтому бэкап можно снимать в любой момент, прямо под нагрузкой, почти без накладных расходов: мы копируем файлы, которые гарантированно не меняются под нами.

Механика: как это устроено внутри

Снапшот и контрольная точка. Когда вы вызываете box.snapshot() (или его делает чекпойнт-демон), Tarantool фиксирует контрольную точку: сериализует всё содержимое memtx в новый .snap файл, имя которого равно текущему vclock/LSN (номер последней применённой транзакции). Важная деталь внутренней механики: создание снапшота НЕ начинает новый WAL-файл. Тот .xlog, который был текущим в момент старта снапшота, должен быть сохранён - в него продолжают писаться записи, появившиеся уже во время снятия снапшота.

Восстановление (recovery). При старте инстанс ищет самый свежий .snap, загружает его в память, а затем "доигрывает" поверх все .xlog с LSN больше, чем у снапшота, повторно применяя каждый записанный запрос (redo). Так состояние восстанавливается ровно до последней успешно записанной в WAL транзакции. После старта Tarantool обычно делает новый снапшот, и старые WAL становятся не нужны.

Чекпойнт-демон и сборщик мусора. Чекпойнт-демон - это постоянно работающий фибер. Он снимает снапшоты по расписанию, основанному на двух условиях: snapshot.by.interval (раз в N секунд) и snapshot.by.wal_size (когда суммарный размер WAL с момента последнего снапшота превысил порог). После нового снапшота включается сборщик мусора (garbage collector): когда число снапшотов превышает snapshot.count, удаляется самый старый .snap и все .xlog, которые старше него и чьи данные уже вошли в снапшот.
Сборщик мусора - ваш главный враг при ручном бэкаде. Если он удалит WAL между снятием снапшота и копированием, цепочка восстановления порвётся. Поэтому на время копирования смешанного (memtx+vinyl) бэкапа GC надо приостанавливать через box.backup.start().
Изображение
Снапшот плюс WAL: бэкап и восстановление

Ключевые команды и примеры

Ручное снятие снапшота.

Код: Выделить всё

-- форсировать контрольную точку прямо сейчас
box.snapshot()

-- посмотреть текущий vclock (позицию журнала)
box.info.vclock
-- ---
-- - {1: 999}
-- ...
Горячий бэкап только-memtx. Достаточно скопировать последний .snap и все .xlog после него:

Код: Выделить всё

tar czf backup_$(date +%F).tar.gz \
    var/lib/instance001/*.snap \
    var/lib/instance001/*.xlog
Смешанный бэкап (memtx + vinyl). Тут уже нельзя просто копировать - vinyl-движок постоянно дампит и компактит файлы. Нужно зафиксировать согласованный набор и удержать GC:

Код: Выделить всё

-- вернёт список файлов для копирования и приостановит GC
files = box.backup.start()
-- ... внешним инструментом копируем все пути из files в безопасное место ...
box.backup.stop()   -- разрешаем сборщику мусора работать дальше
Декларативная конфигурация 3.x (YAML). Стратегию задают в секциях snapshot и wal:

Код: Выделить всё

groups:
  group001:
    replicasets:
      replicaset001:
        instances:
          instance001:
            snapshot:
              by:
                interval: 7200          # снапшот каждые 2 часа
                wal_size: 1000000000    # или при 1 ГБ WAL
              count: 3                  # хранить 3 снапшота
            wal:
              mode: write               # write | fsync | none
              max_size: 268435456       # ротация .xlog на 256 МБ
              cleanup_delay: 18000       # отложить удаление WAL на 5 ч
В классическом box.cfg (1.x/2.x) те же ручки называются иначе: checkpoint_interval, checkpoint_wal_threshold, checkpoint_count, wal_mode, wal_max_size. Поведение идентично, имена разные - помните про двойной трек.

Восстановление на точку времени (PITR). Если данные удалили и удаление разъехалось по репликам, восстанавливаем на момент ДО ошибки. Сначала ищем нужный LSN, читая журнал утилитой tt cat, затем доигрываем файлы в чистый инстанс утилитой tt play:

Код: Выделить всё

# посмотреть содержимое журнала и найти LSN ошибочной операции
tt cat var/lib/instance001/*.xlog --show-system

# доиграть снапшот и журналы в новый инстанс ДО нужного LSN
tt play 127.0.0.1:3302 \
    var/lib/instance001/*.snap \
    var/lib/instance001/*.xlog \
    --to 4500 \
    --username admin --password secret
Частые заблуждения и грабли
  • "Снапшота достаточно для бэкапа". Нет: между снапшотами есть транзакции, живущие только в WAL. Без .xlog вы откатитесь к моменту последней контрольной точки и потеряете дельту.
  • "box.snapshot() начинает новый журнал". Нет. WAL, активный на момент старта снапшота, обязателен для восстановления - не удаляйте его вручную.
  • "snapshot.count жёстко ограничивает диск". Не всегда: GC не удалит файлы, нужные подключающейся или отставшей реплике, а также во время box.backup.start(). При живой репликации checkpoint_count фактически не работает, пока все реплики не догнали мастер - диск может разрастись.
  • "Реплика - это и есть бэкап". Реплика защищает от отказа железа, но НЕ от логической ошибки: DELETE/DROP мгновенно реплицируется на все узлы. Для защиты от ошибок оператора нужен именно файловый бэкап или PITR.
  • "force_recovery починит всё". Опция force_recovery лишь пропускает битые записи в .snap/.xlog и читает столько, сколько сможет, завершаясь с предупреждением. Это аварийный режим спасения данных, а не штатное восстановление.
  • LSN различаются на разных репликах. Фильтры --from/--to в tt cat/tt play осмысленны только в паре с конкретным --replica; смешивать ID реплик в одном фильтре нельзя.
  • wal.mode: none отключает журнал целиком - данные между снапшотами не переживут рестарт. Применяйте только для кэшей, где потеря допустима.
Мини-лаба

Запустите локальный инстанс. Создайте спейс, вставьте несколько кортежей, вызовите box.snapshot() и запомните box.info.vclock. Затем вставьте ещё кортежи (НЕ делая снапшот) и аккуратно остановите инстанс (kill, не drop файлов). Удалите последний .xlog из каталога данных, запустите инстанс снова и убедитесь, что "послеснапшотные" вставки пропали, а данные из снапшота на месте. Верните .xlog, перезапустите и убедитесь, что данные восстановились полностью. Объясните себе, почему именно так: какой файл дал базу, какой - дельту.

Контрольные вопросы
  • Что произойдёт при восстановлении, если у вас есть свежий .snap, но удалён .xlog, который был активен в момент его снятия? Почему?
  • Чем горячий бэкап только-memtx отличается от смешанного memtx+vinyl и зачем во втором случае нужен box.backup.start()/stop()?
  • Почему наличие реплик не отменяет необходимости файловых бэкапов, и от какого класса аварий защищает именно PITR через tt play?
  • Как связаны snapshot.count (checkpoint_count) и работа сборщика мусора, и при каких условиях лимит на число снапшотов фактически не соблюдается?
👍1 ❤️2 🔥 😄 🤔1
Ответить
← Предыдущая глава
Логирование и аудит
Следующая глава →
Безопасность: аутентификация, RBAC, TLS

Все главы курса «Tarantool: in-memory СУБД и сервер приложений с нуля до продакшена»

Поделиться темой: ✈ Telegram VK

Вернуться в «Tarantool: СУБД и сервер приложений»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя