FastNetMon

Thursday, 17 December 2009

Online миграция контейнеров OpenVZ

Имеем две хост-машины: host_source и host_target, перенос контейнера будем осуществлять с первой на вторую.

Для начала на обоих машинах обновляем до последней актуальной версии пакет vzctl (vzmigrate входит в его состав):
yum upgrade vzctl -y

Кладем на удаленный (target) сервер свои ключи: http://phpsuxx.blogspot.com/2009/12/ssh_17.html

Вызываем команду vzlist на host_source чтобы определить, CTID контейнера, который будем переносить:
vzlist


В моем случае это контейнер 1201.

Сохраняем состояние host_source:

vzlist | grep 1201
1201 42 running ip.ad.dr.es domain.ru


И host_target:

vzlist | grep 1201
Container(s) not found


Так как ssh может отцепиться в процессе переноса, а это очень долгий процесс ставим и запускаем screen:
yum install screen -y
screen
# а если у Вас отцепится ssh, при повторном входе делаете screen -r


Обращаю внимание, что если идет речь о переносе веб-сервера, то на нем заведомо может быть огромное число файлов в папке /tmp (либо /var/www/username/data/mod-tmp), которые могут ОЧЕНЬ сильно замедлить процесс переноса, поэтому позаботьтесь об их удалении загодя, иначе это чревато тем, что миграция будет идти пару суток :)

Также есть опасность получить проблемы (например, такие), если на source сервере загружены спец модули iptables, которых может не оказаться на target машине.

Поэтому смотрим, какие IPTABLES модули подключены к VPS:
cat /etc/vz/conf/1201.conf | grep IPTABLES -i
IPTABLES="ip_tables iptable_filter iptable_mangle ipt_limit ipt_REJECT ipt_LOG ipt_length ip_conntrack ip_conntrack_ftp ipt_state iptable_nat ipt_REDIRECT "


Тут список модулей весьма велик и на время миграции (ну или навсегда, их стоит отключить во избежание проблем):
vi /etc/vz/conf/1201.conf


И приводим строку к виду:
IPTABLES=""


Перезапускаем контейнер:
vzctl stop 1201; vzctl start 1201


Запускаем перенос (если хотите, чтобы скрипт миграции не забивал экран текстом, то уберите --rsync="-v"):
vzmigrate -v --remove-area no --online --rsync="-v" host_target_ip 1201

Если нужно отказаться от копирования каких-либо файлов, после -v через пробел дописываем:
--exclude-from=/root/exclude.txt

В итоге получаем облом:

Starting online migration of CT 1201 to host_target_ip
Error: Can't connect to destination address using public key
Error: Please put your public key to destination node


Бороться с этим вот так: http://phpsuxx.blogspot.com/2009/12/ssh_17.html (те для source системы настраиваем авторизацию на target)

Повторяем предыдущую команду.


OPT:--online
OPT:88.198.37.23
Starting online migration of CT 1201 to 88.198.37.23
Preparing remote node
Initializing remote quota
Syncing private
Live migrating container...
Syncing 2nd level quota
Cleanup



И в итоге на host_source имеем:

vzlist | grep 1201


А на host_target:

vzlist | grep 1201
1201 42 running ip.ad.dr.es domain.ru


А с private data дела сложнее - данные 1201 VE были удалены с source ноды целиком (что очень не радует...), зато целиком (надеюсь) переехали на новую в папку: /vz/private/1201/

А вот пинги у меня обломались, т.к. датацентр не поддерживает live-миграцию айпи с одной машины на другую.

После окончания переноса не забываем удалить ssh ключи с target машины, ибо это крайне небезопасно:
rm -f /root/.ssh/authorized_keys

Далее не забываем отдать все ресурсы выделенного сервера контейнеру: http://phpsuxx.blogspot.com/2010/03/openvz-vps.html


Далее, если при переносе сменился IP необходимо скорректировать настройки контейнера:

sed -i 's/178.63.175.246/' /etc/vz/conf/1201.conf
vzctl stop 1201
vzctl start 1201


Далее производим изменения ip уже в контейнере (пример для Debian):
export OLD_IP=12.1.1.1
export NEW_IP=122.33.44.55
vzctl enter 1201
# Debian
sed -i "s/$OLD_IP/$NEW_IP/" /etc/nginx/nginx.conf
sed -i "s/$OLD_IP/$NEW_IP/" /etc/apache2/apache2.conf
sed -i "s/$OLD_IP/$NEW_IP/" /etc/apache2/conf.d/rpaf.conf
sed -i "s/$OLD_IP/$NEW_IP/" /etc/apache2/mods-enabled/rpaf.conf
sed -i "s/$OLD_IP/$NEW_IP/" /etc/hosts
/etc/init.d/nginx restart
/etc/init.d/apache2 restart

# CentOS
sed -i "s/$OLD_IP/$NEW_IP/" /etc/nginx/nginx.conf
sed -i "s/$OLD_IP/$NEW_IP/" /etc/httpd/conf/httpd.conf
sed -i "s/$OLD_IP/$NEW_IP/" /etc/hosts
/etc/init.d/httpd restart
/etc/init.d/nginx restart

А также на всякий случай поищем упоминания старого IP в других конфигах:
cd /etc
grep -HiR "$OLD_IP" *

Также, если используется VDSManager, то необходимо открыть его конфиг:

vi /usr/local/ispmgr/etc/vdsmgr.conf


И удалить оттуда блок, соответствующий перенесенному VPS:

vds "xx.xx.xx.xx" {
Name test.domain.ru
Owner admin
CPULimit 0
TrafLimit 99999999
TrafUsed 574
Backup none
}


После этого перезапускаем VDSManager:
killall -9 vdsmgr


И убеждаемся, что команда сбора статистики:
/usr/local/ispmgr/sbin/dostat.pl


Более не выдает ошибки: "ERROR 1 : VDS not found"

Основано на мануале: http://wiki.openvz.org/Checkpointing_and_live_migration

No comments :

Post a Comment

Note: only a member of this blog may post a comment.