Перейти к основному содержанию Перейти к навигации Перейти к нижнему колонтитулу
Ограниченное время: Программа Design Partner. План BUSINESS бесплатно на всю жизнь.

Живая миграция

Перенесите работающий репозиторий, контейнеры, базу данных и память процессов на другую машину одной командой с минимальным простоем.

Живая миграция

Серверы меняются: железо стареет, провайдеры уходят, регионы смещаются. rdc repo migrate переносит работающий репозиторий на другую машину одной командой, и с --checkpoint даже память процессов делает этот переезд. Демо-приложение pulse хранит счётчик в ОЗУ; после переноса оно продолжает считать, а не начинает заново.

Смотреть урок

Как это происходит

Two phases, minimal downtime

Первая фаза копирует основной объём, пока приложение продолжает работать. Вторая делает контрольную точку живых процессов (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… Он продолжил ровно с того места, где контрольная точка его заморозила, не сбросившись на единицу. Память процессов совершила переезд; приложение не заметило, что сменило машину.

Без --checkpoint migrate всё равно перенесёт диск и контейнеры; они просто перезапустятся на целевой машине, а не возобновятся с прерванного места.


Далее: Дельта-передача.