reloca.toby XServer

reloca.to/Инструкции

Переезд сервера без простоя

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

Что здесь значат эти слова

Физический сервер никто не переносит совсем без перерыва: процессы должны стартовать заново на другой машине, значит, перезагрузка будет. Убрать можно часы копирования. Старый сервер работает, пока его диски читают, и останавливается только на последнюю дельту.

На быстром канале эта остановка — меньше двух секунд, измерено на нашем стенде с Debian 12 и Rocky 9. Добавьте одну перезагрузку нового сервера, и это весь перерыв.

Как это работает

Утилита кладёт на старый сервер один статический бинарник, запускает его от root и читает блочные устройства напрямую. Одновременно она следит за каждой записью, чтобы знать, какие части копии устарели: программа eBPF на блочном слое там, где ядро это умеет, и ftrace там, где не умеет, вплоть до CentOS 7.

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

Что нужно

  • Root на работающем сервере, по ssh. Ничего туда не ставится и на его диски ничего не пишется.
  • Ядро, умеющее отслеживать записи: eBPF или ftrace вплоть до 3.10 из CentOS 7.
  • Канал быстрее, чем сервер пишет. Это и есть настоящее условие, и оно измеряется, а не угадывается.

Команда

Отдельный режим включать не надо: утилита определяет его по тому, что старый сервер ответил из своей системы, а не из Live OS.

ssh -A root@НОВЫЙ-СЕРВЕР
curl -fsSL reloca.to | bash
reloca.to -n root@СТАРЫЙ-IP      # план, ничего не пишется
reloca.to root@СТАРЫЙ-IP

Более короткую остановку заказывают через -o converge=5: агент будет пересылать дельты, пока оставшаяся не будет передаваться за пять секунд или меньше. Больше терпения — -o patience=3600, если согласны потратить час копирования на более короткую паузу.

Когда оно не сойдётся

Если сервер пишет на диск быстрее, чем канал уносит данные, очередная дельта не меньше предыдущей, и ждать бесполезно. Агент меряет обе скорости и говорит об этом вместо того, чтобы молотить:

the donor writes 20.4 MiB/s, the link carries 14.9 MiB/s (1.37x): the deltas
cannot shrink, this will not converge

Дальше он либо берёт то окно, которое есть, если оно короче разрешённого через -o max-est=, либо отказывается морозить вообще и оставляет старый сервер нетронутым. Оба исхода безопасны: диск нового сервера записан, старый не останавливался, и переезд можно повторить в тихие часы.

Что действительно помогает, по порядку: переезжать ночью, когда пишут меньше; взять более быстрый канал; или согласиться на off-line режим и честное окно обслуживания.

Репетиция, которая достаётся даром

По умолчанию старый сервер морозится дважды. После первой заморозки утилита снимает снимок копии, размораживает донора и прогоняет на этом снимке всю доработку и проверку, пока старый сервер снова обслуживает пользователей: собирается initramfs, ставится grub, проверяется загрузочная запись и сеть. Только потом она догоняет дельты и морозит по-настоящему.

Именно это находит незагружаемую цель, пока у вас ещё работают обе машины. Стоит одного лишнего окна заморозки — около секунды на быстром канале и минуту-две на медленном; -o precheck=0 его убирает.

Измерено, а не обещано

Все эти числа из одного переезда сервера на CentOS 7.9, где генератор нагрузки писал около 20 МБ/с, а каналу заданы настоящие задержка и потери.

КаналСходимостьОкно заморозкиВесь переезд
10 GbEна третьем проходе1.7 с223 с
400 Мбит, 20 мсна четвёртом проходе8.7 с341 с
100 Мбит, 30 мс, 0.05% потерьне сходится100 с953 с

Опция, которая управляет каждым из этих чисел, — в справочнике опций.

Попробуйте на своём переезде

Утилита бесплатна, сухой прогон не меняет ничего, а старый сервер только читается.

curl -fsSL reloca.to | bash

Все опции