Живая миграция
Серверы меняются: железо стареет, провайдеры уходят, регионы смещаются. rdc repo migrate переносит работающий репозиторий на другую машину одной командой, и с --checkpoint даже память процессов делает этот переезд. Демо-приложение pulse хранит счётчик в ОЗУ; после переноса оно продолжает считать, а не начинает заново.
Смотреть урок
Как это происходит
Первая фаза копирует основной объём, пока приложение продолжает работать. Вторая делает контрольную точку живых процессов (CRIU для контейнеров с меткой rediacc.checkpoint=true), переносит финальную дельту вместе с состоянием процессов и возобновляет всё на новой машине. Простой – это дельта, а не весь объём данных.
Шаг 1: Доказательство – счётчик в ОЗУ
rdc term connect --machine <machine-name> --repository pulse --command 'docker logs heartbeat_app --tail 5' Приложение хранит счётчик в памяти и выводит удар каждые пять секунд. Счётчик существует только в RAM: перезапуск процесса сбросит его до единицы.
memory counter=6 и растёт, один удар каждые пять секунд. Счётчик живёт только в памяти процесса. Если процесс перезапустится, он начнёт заново с единицы.
Шаг 2: Живая миграция
rdc repo migrate --name pulse --from <machine-name> --to <target-machine> --checkpoint --skip-dns Миграция с checkpoint: первая фаза передаёт основные 2 ГБ, пока источник остаётся в сети, затем кратковременное переключение фиксирует работающие процессы и передаёт финальную дельту. В выводе отображается каждая фаза и фактическое время простоя.
Вывод рассказывает о переносе: первая фаза передаёт 2 ГБ основного объёма, пока источник остаётся онлайн, затем строка отсечения печатает фактическое DOWNTIME: несколько десятков мегабайт и примерно двадцать секунд для двухгигабайтного репозитория.
Шаг 3: Проверьте новый дом
rdc repo list --machine <target-machine> Выведите список repository на целевой машине: pulse смонтирован, Docker запущен, его container активны.
На целевой машине pulse смонтирован, Docker запущен, контейнеры работают.
Шаг 4: Источник остановлен
rdc repo list --machine <machine-name> На источнике repository остановлен и размонтирован: нет Docker, ноль container. Image сохраняется как база для будущих передач дельты.
Источник по-прежнему перечисляет репозиторий, но честно: не смонтирован, Docker не запущен, контейнеров ноль. Там больше ничего не работает. Образ намеренно сохраняется как база для следующей дельта-передачи, чтобы будущая обратная отправка обходилась дёшево.
Шаг 5: Счётчик продолжил считать
rdc term connect --machine <target-machine> --repository pulse --command 'docker logs heartbeat_app --tail 5' Логи на новой машине показывают, что счётчик продолжается с того места, где его зафиксировал checkpoint, а не сбрасывается до единицы. Память процесса совершила переезд.
memory counter=17, затем 18, 19, 20… Он продолжил ровно с того места, где контрольная точка его заморозила, не сбросившись на единицу. Память процессов совершила переезд; приложение не заметило, что сменило машину.
Без
--checkpointmigrate всё равно перенесёт диск и контейнеры; они просто перезапустятся на целевой машине, а не возобновятся с прерванного места.
Далее: Дельта-передача.