Перенос сайта(ов) без простоя и потери данных между выделенными серверамиИсточник: habrahabr htaccess
Казалось бы, что сложного перенести сайт на другой сервер? Наверно многие из нас копировали свои первые хоумпейджи с хостинга на хостинг в поисках лучшего, еще учась в школе или на первых курсах университета. Или вешая на уши лапши руководству, объясняли, что задача эта не решается мгновенно и сайт сутки работать не будет, ибо DNS такая штука… Если в целом, ерундовая задача, правда? Но как сделать все идеально? Так, чтобы без простоев, чтобы не было расхождений в БД, чтобы не потерялись какие-нибудь файлики-аватарки-картинки, когда обновляется DNS запись IN A и у половины пользователей старый сайт, а у половины новый. А если это highload? Или сайт делало несколько поколений "лучших" программистов, считающих своим долгом создать новое подключение к БД в своем "модуле" для сайта. Наконец, если таких сайтов >10?
Сколько это займет времени? Сколько драгоценных минут сайт не будет работать\не будет работать правильно? Почему-то я не нашел какой-либо статьи на хабре, поэтому решил написать несколько приемов, как можно перенести корявый проект или сразу несколько так, чтобы шеф был доволен стабильной работой сайта. Все это актуально скорее для сайтов, написанных на РНР, для администраторов столкнувшихся с проектами, где не использовались фреймворки, cms и голова при написании кода.
1. Перенос файловЛучший способ через ssh при помощи rsync:
Так rsync синхронизирует папки инкрементально, то есть копирует только то, чего не хватает и не тронет что-то новое. Например, можно написать небольшой bash скрипт, который будет синхронизировать все папки с старого сервера на новый в момент обновления DNS, но все же лучшим вариантом будет спустя пару суток синхронизировать папки с ключом -n (--dry-run) чтобы просто увидеть расхождения. Думаю в документации по rsync найдутся решения любых задач по синхронизации файлов. Программа должна быть установлена на оба сервера. По протоколу FTP rsync работать не умеет, тогда используем lftp:
2. Перенос БД на примере MySQLНа обоих машинах открываем порт сервера MySQL в мир:
Я напишу пример как я делаю бекапы каждый день, вырезка из logrotate.d:
/root/my.cnf
Почему не классически "mysqldump -u root -p database > dump.sql"? Тогда не будут сохранены view и хранимые процедуры. Правильно делает дампы MySQL Workbench, оттуда я и взял эту команду. Далее, в переменную $CMD добавляем -h ip_старый_сервер и меняем строчку $CMD $i / gzip -c > /srv/dumps/$i/$i.sql.gz на:
Конечно нужно предварительно создать все базы данных:
3. Перенаправление всех соединений к localhost:3306 - старый сервер на новый серверДовольно просто, используем ssh tunnel (предварительно остановив mysql):
Причем ssh требуется только на локальной машине. Проверяем:
Получаем удаленный MySQL сервер на локальной машине. Все бы хорошо, но MySQL client если видит, что соединение идет к localhost то соединяется с сервером через локальный socket и никакие настройки его делать так отучить не могут. Т.е.
Или как обычно мы пишем в скриптах:
Работать не будут, т.к. такое соединение тоже будет по обработано через локальный сокет. Конечно можно пробежаться по всем соединениям сайта и заменить localhost на 127.0.0.1 или внешний IP сервера, уже заработает, но есть способ лучше. Нужно отредактировать в hex редакторе файлы:
Найти единственное совпадение по тексту localhost и заменить на что-нибудь другое, вроде lacalhost, в обоих файлах. После локальные соединения будут работать через TCP/IP! Единственное MySQL не пускает юзеров у которых удаленный хост может быть только localhost в привилегиях. Это надо исправить на % во время переноса. Пропустим настройки веб сервера, по этой теме полно материалов. |