26.07.2013

Массовая миграция пользователей между серверами ISPmanager

Прижала меня жизнь, как видно из названия. И прижала сильно. Перенос 2300 пользователей - это чистейшей воды ад. Я дам только основные этапы. 99% работы придется допиливать по месту.

Первый этап:

Если оставить дефолтные настройки MySQL на принимающем сервере, более половины баз не вгрузятся - и вот тогда на помощь придет веревка и мыло. Дабы избежать главной и самой досадной ошибки, увеличим размер единовременно вгружаемого пакета команд в MySQL:
set global max_allowed_packet = 104857600;
Да, пусть это будет на лету, а не с конфига. Мы все равно перезагружать MySQL не будем. А после того, как все импортируется, нас больше не будет интересовать эта настройка.

Второй этап:

Если Вы переносите пользователей с нескольких разных серверов, то у Вас будет затык с одинаковыми названиями баз и/или имен пользователей MySQL. Не бывает серверов, на котором какой-нибудь умник не заведет базу под названием joomla, wp или admin.

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

Как решать: берете список на каждом из серверов, чистите его от мусора, сортируете, diif.
Списки тут:
select db from mysql.db;select user from mysql.user;
В случае обнаружения одинаковых пользователей нужно создать пользователю базу с более уникальным именем или более уникального пользователя. Затем вписать это в конфиг сайта.

Третий этап:

Дисковое пространство. Места, куда мы бэкапимся, должно хватить на сумму файлов /var/www и /var/lib/mysql. Например мы нашли место на /var/backups/

Четвертый этап:

Возможно когда-то пользователи перемещались между серверами. При этом на исходном он не был удален, а был просто выключен. Но! Мы не можем просто взять и сдампить только включенных - ведь есть те, кого выключили за неуплату. Быть может завтра он оплатит - а ему нечего включать - его данные остались на исходном сервере.



Поэтому здесь придется сделать две вещи:

1) Зайти в раздел Хостинг и отфильтровать только тех, кто в статусе "Остановлен".
Открыть в соседнем окне этот же биллинг.
Находить там каждого из перечисленных и давать им бесплатные периоды на несколько дней.
После того, как у всех будут бесплатные периоды, включить всем услугу.
Повторить тоже самое, только для раздела Реселлин хостинга.

Да, это финансовые потери, но после переноса эти бесплатные периоды можно будет отозвать. Очень не рекомендую тут жадничать. Впереди тяжелый труд - пожалейте себя.

2) Теперь, когда все выключенные пользователи на серверах - это те, кого когда-то перенесли (то есть на другом сервере он есть включенные), то нам остается просто сделать их список, чтобы позже исключить из бэкапирования (это сделать обязательно - а то при конфликте имен пользователей все подохнет и Вы будете рвать волосы на жопе, потому что дальше только руками, переделывать уже нельзя).

Сделаем их сразу с нужным нам текстом, чтобы дальше было удобнее:
for user in `/usr/local/ispmgr/sbin/mgrctl -m ispmgr user | grep disabled | tr '=' ' ' | awk {'print $2'}`; do echo "Content exclude \"user\" \"$user\""; done
Теперь создадим файл, куда впишем этих пользователей:

cat > /root/.backup.conf
BackupPlan migration {Name transferStorage localStoragePath /var/backupsArchiver tgzPeriod dailyStarttime 00:58DLimit 6WLimit 3MLimit 3Compress 1Content exclude "file" "/var/backups"Content include "mysql" "mysql"Content include "mgrdata" "*"Content include "sysfiles" "*"Content include "user" "*"Content exclude "user" "user2543"Content exclude "user" "user2552"Content exclude "user" "user2555"Content exclude "user" "user2589"Content exclude "user" "user2606"}
Этот шаг мы естественно должны сделать свой для каждого исходного сервера.

Пятый этап:

На каждом сервере заходим в screen и запускаем там такую команду (migration - как написали выше в названии плана бэкапов):
/usr/local/ispmgr/sbin/pbackup -r backup migration
Теперь мы временно можем забыть про исходные серверы. Идем готовить целевые.

Шестой этап:

На целевом сервере нам надо скопировать все пресеты с исходных. 

Седьмой этап:

Теперь нам надо создать всех реселлеров руками. Это несложная задача.

Восьмой этап:

Нам надо скопировать пресеты реселлеров с исходных на целевые адреса.

Девятый этап:

Нужно создать мегапресет с большим количеством всего, что там указывается. Дело в том, что все пользователи будут созаваться с одинаковым тарифом (так как биллинг тут не участвует). Если вдруг при импорте какого-нибудь пользователя окажется, что ему разрешено создавать 4 домена, а у него 5 - все. Дальше только руками. И опять вырванная шерсть на жопе.
Напрмер назовем этот пресет MIGPRESET.

Десятый этап:

Надо подгтовить панель так, чтобы она не козлила если что. То есть жестко вписать в конфиг ispmgr.conf:
Option ForcePhpFCgidOption ForceCGIOption ForceSSIOption ForceAutoSubdomain

Одиннадцатый этап:

Дабы резко сократить время, запретим панели рестартить Апач, вписав в /usr/sbin/apachectl на второй строке:
exit 0

Далее ждем, пока все забэкапится. Может час, может сутки, может трое - у кого сколько бэкапить.

Двеннадцатый этап:

Монтируем удаленные архивы на целевой сервер.
Например мы переносим пользователей с server1A и server1B на sever2.
Тогда на целевом сервере server2 даем такие команды:
mkdir /mnt/server1A /mnt/server1B
sshfs root@server1A:/var/backups /mnt/server1A/
sshfs root@server1B:/var/backups /mnt/server1B/

Четырнадцатый этап:
Проверяем настройки DNS слейвов на новом сервере - точно ли они идут туда (это где Сатурн в разделе Доменны Имена).
Так же в разделе "Настройки DNS" проверяем корректность остальных записей.

Пятнадцатый этап:

Тут надо отметить, что восстанавливалка ISPmanager не умеет создавать пользователей. Поэтому мы разобьем на два шага: создадим пользователей по именам папкой с бэкапами, которые у нас есть. А затем их вгрузим в этих пользователей их примонтированные бэкапы.

Так как исходных сервера у нас два, то вгрузки будет две:
for USER in `ls -1 /mnt/server1A`; do /usr/local/ispmgr/sbin/mgrctl user.edit name=$USER passwd=Yi5quai3eingiech8wai0Ohbaexa5v confirm=Yi5quai3eingiech8wai0Ohbaexa5v owner=root ip=11.22.33.44 ip6=noip domain=tempuser${USER}.com preset=MIGPRESET email= shell=on ssl=on cgi=on ssi=on phpfcgi=on sok=ok ; done

Поясняю что тут к чему:
passwd - да, придется делать всем одинаковый. Сгенерируйте любой. По другому вообще никак.
owner - у всех будет root изначально, так как пресет такой есть только у рута. Если какой пользователь принадлежит реселлеру - это уже потом только ручками (хотя все конечно можно автоматизировать).
ip - это свободный адрес. ОЧЕНЬ ВАЖНО, чтобы в панели, в меню IP-адреса его статус был помечен как "Общедоступный".
domain - так как сайт обязательно создать, а мы не знаем какой, то мы создаем такой, в котором побольше букв. Далее мы отфильтруем по слову tempuser и удалим это.
preset - тот самый огромный мега шаблон, который мы ранее придумали.

Запускаем.
Пробежало? Теперь тоже самое, только /mnt/server1A в начале исправляем на /mnt/server1B и еще раз запускаем.

Итак у нас есть все пользователи на целевом сервере.

Шестнадцатый этап:

Заходим в панель, в раздел WWW-домены. Выбираем все домены (а если там кто раньше жил, то фильтруем по слову tempuser) - и удаляем все. Проверяем, чтобы они не остались ни в Доменных именах, ни в WWW-доменах ни в почтовых доменах.

Семнадцатый этап:


Запускаем сам импорт:

Смотрим какого числа мы сделали бэкап (он ведь мог и более суток бежать) и запоминаем.
ls -l /mnt/server1A/*/*
Можно погрепать немного вывод для лучше картины.

Допустим мы сделали бэкап 2001-01-01. Запускаем импорт:

for USER in `ls -1 /mnt/server1A`; do /usr/local/ispmgr/sbin/mgrctl usermove.run source=local fpath=/mnt/server1A/${USER}/admin-1_full-2001-01-01.tar.gz owner=${USER} ip=11.22.33.44 ip6=noip sok=ok ; done

Ждем столько же, сколько ждали бэкапов + время переписывания по сети (папка то смонтирована по SSHFS).

Восемнадцатый этап:


to be continious ...

Комментариев нет:

Отправить комментарий