Перенос работающего сервера без остановки сервисов👋 Привет, сетевой друг!
В
прошлый раз разбирали базовый перенос через снапшоты. Сегодня расскажу про инкрементальную передачу, проверку целостности и более надёжный процесс.
🟣
Что изменилось в подходе: главная проблема старого метода - снапшот делается один раз, потом долго передаётся, а за это время данные на источнике меняются. И решение тут - это инкрементальная передача через несколько снапшотов, финальный diff минимален и сервис останавливается на секунды а не часы.
🟣Создаём первый базовый снапшот и начинаем передачу в фоне:# ZFS — базовый снапшот
zfs snapshot zpool/rootfs@base
zfs send zpool/rootfs@base | ssh root@new-server zfs receive -F zpool/rootfs
# Btrfs — базовый снапшот
btrfs subvolume snapshot -r / /mnt/snapshots/base
btrfs send /mnt/snapshots/base | ssh root@new-server btrfs receive /mnt/
Пока передаётся base - сервер продолжает работать, данные меняются.
🟣Инкрементальный diff: передаём только изменения# ZFS — создаём второй снапшот и шлём только дельту
zfs snapshot zpool/rootfs@incremental
zfs send -i zpool/rootfs@base zpool/rootfs@incremental | \
ssh root@new-server zfs receive -F zpool/rootfs
# Btrfs — аналогично
btrfs subvolume snapshot -r / /mnt/snapshots/incremental
btrfs send -p /mnt/snapshots/base /mnt/snapshots/incremental | \
ssh root@new-server btrfs receive /mnt/
Флаг -i (ZFS) и -p (Btrfs) означают инкрементальную передачу - только дельта между снапшотами, не весь объём.
🟣Финальная синхронизация с минимальным даунтаймом:# Останавливаем сервисы
systemctl stop nginx postgresql
# Финальный инкрементальный снапшот
zfs snapshot zpool/rootfs@final
zfs send -i zpool/rootfs@incremental zpool/rootfs@final | \
ssh root@new-server zfs receive -F zpool/rootfs
# Поднимаем сервисы уже на новом сервере
Финальный diff минимален, только изменения за последние минуты пока останавливались сервисы.
🟣Проверка целостности после передачи:# ZFS встроенная проверка
ssh root@new-server zfs get checksum zpool/rootfs
ssh root@new-server zpool scrub zpool
# Btrfs
ssh root@new-server btrfs scrub start /mnt
ssh root@new-server btrfs scrub status /mnt
Без проверки можно перенести данные с тихим битовым повреждением и узнать об этом только при чтении.
🟣Восстановление загрузки:arch-chroot /mnt
# Обновляем fstab с новыми UUID
blkid >> /etc/fstab
# Правим вручную — убираем старые UUID
# Обновляем initramfs
update-initramfs -u -k all
# Устанавливаем загрузчик
grub-install /dev/sdX
update-grub
# Для систем с systemd-boot
bootctl install
🟣Чистим снапшоты после успешного переноса:# ZFS
zfs destroy zpool/rootfs@base
zfs destroy zpool/rootfs@incremental
zfs destroy zpool/rootfs@final
# Btrfs
btrfs subvolume delete /mnt/snapshots/base
btrfs subvolume delete /mnt/snapshots/incremental
Серверная Админа |
Zeroday | #linux