Перейти к содержимому

Переезд крупного магазина - окно простоя, два прохода, откат

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

Механика

Простой определяется не размером сайта, а порядком работ. Файлы можно копировать заранее и сколько угодно долго, а вот база должна переехать одним куском в согласованное окно.

Отсюда схема из двух проходов копирования файлов. Первый идёт за сутки или за неделю до переезда, второй догоняет изменения уже в окно простоя и занимает минуты.

База переносится дампом или репликацией. Дамп проще и подходит почти всем, репликация нужна там, где даже пятнадцать минут простоя стоят слишком дорого.

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

Старый сервер после переключения не выключают. Он остаётся запасным путём, пока на новом не наберётся достаточно новых данных, чтобы возврат стал бессмысленным.

Этот момент называют точкой невозврата. После первых заказов и первого обмена на новом сервере старая база устаревает, и вернуться на неё уже нельзя без потери данных.

Фоновые задания на двух серверах одновременно опаснее простоя. Два обмена, две рассылки и два скрипта в одну базу дают дубли, которые потом разбирают руками.

Поэтому план переезда - это не список команд, а расписание. У каждого шага есть время, ответственный и признак, по которому видно, что шаг закончился успешно.

Отдельная строка расписания - предупреждение всех, кого переезд касается. Заказчик, служба поддержки, подрядчик по учётной системе и агентство контекстной рекламы должны знать время окна заранее.

Репетиция переезда на тестовом контуре стоит дешевле любой аварии. Она же даёт честные цифры длительности шагов, которые потом ложатся в расписание боевого переезда.

Шаги

  1. Снять объёмы: размер файлов, размер базы, время дампа и заливки.
  2. Снизить время жизни записи домена за сутки до переезда.
  3. Скопировать файлы первым проходом, не трогая работающий сайт.
  4. В окно простоя выключить cron и агенты, догнать файлы вторым проходом.
  5. Перенести базу, переключить домен и пройти проверку по чек-листу.

Код

Снимаем объёмы и время операций:

Окно терминала
du -sh /home/bitrix/www/upload /home/bitrix/www/bitrix
du -sh /var/lib/mysql
mysql -e "SELECT table_schema, ROUND(SUM(data_length+index_length)/1024/1024) mb
FROM information_schema.tables GROUP BY table_schema;"
# каталог загрузок обычно и есть основной объём переезда

Объём загрузок диктует длительность первого прохода. База при этом почти всегда меньше файлов, и именно она определяет длину окна простоя.

Копируем файлы первым проходом:

Окно терминала
rsync -aH --delete --exclude='/bitrix/cache/' --exclude='/bitrix/managed_cache/' \
--exclude='/upload/tmp/' /home/bitrix/www/ new-server:/home/bitrix/www/
# кэш не переносят: он соберётся на новом сервере заново

Первый проход идёт при работающем сайте и никому не мешает. Его запускают за сутки-двое, а при большом объёме - и за неделю, чтобы догоняющий проход был коротким.

Снижаем время жизни записи домена:

Окно терминала
dig +noall +answer example.com A
dig +noall +answer example.com A @8.8.8.8 # что видят чужие резолверы
# заранее ставим TTL 300 секунд в панели управления доменом
# после переезда возвращаем обычное значение

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

Выключаем фоновые задания в начале окна:

Окно терминала
crontab -l > /root/cron.backup && crontab -r # на старом сервере
mysql -e "UPDATE b_option SET VALUE='N' WHERE MODULE_ID='main' AND NAME='agents_use_crontab';"
# на новом сервере cron включают только после проверки

Догоняем изменения вторым проходом:

Окно терминала
rsync -aH --delete --exclude='/bitrix/cache/' /home/bitrix/www/ new-server:/home/bitrix/www/
ssh new-server 'chown -R bitrix:bitrix /home/bitrix/www'
find /home/bitrix/www/upload -type f | wc -l # сверяем число файлов
ssh new-server 'find /home/bitrix/www/upload -type f | wc -l'
# второй проход переносит только изменившееся: обычно это минуты

Права и владелец файлов после копирования проверяют отдельно. Чужой владелец - самая частая причина, по которой сайт на новом сервере открывается пустой страницей.

Число файлов на обоих серверах сверяют отдельной командой. Расхождение в несколько тысяч файлов означает, что проход завершился не полностью и его нужно повторить до переключения домена.

Переносим базу и замеряем время:

Окно терминала
time mysqldump --single-transaction --quick sitemanager | gzip > /tmp/db.sql.gz
scp /tmp/db.sql.gz new-server:/tmp/
ssh new-server 'time zcat /tmp/db.sql.gz | mysql sitemanager'
# замер на копии заранее показывает реальную длину окна простоя

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

Проверяем сайт после переключения:

Окно терминала
curl -sI https://example.com/ | head -3
curl -s https://example.com/bitrix/admin/1c_exchange.php?type=catalog\&mode=checkauth -u 'exchange:пароль'
mysql -e "SELECT COUNT(*) FROM b_sale_order WHERE DATE_INSERT > NOW() - INTERVAL 1 HOUR;"
tail -20 /var/log/nginx/access.log | awk '{print $1, $9}' | sort | uniq -c
# заказы за последний час подтверждают, что покупатели попадают на новый сервер

Ограничения

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

Лицензионный ключ и внешние сервисы привязаны к адресу сервера. Платёжные системы, службы доставки и учётная система с белым списком адресов требуют правки настроек на своей стороне.

Сертификат домена переносят или выпускают заново. Забытый сертификат превращает переезд в аварию: сайт открывается, но браузер показывает предупреждение.

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

Старый сервер после переезда должен отдавать не сайт, а заглушку. Работающая копия магазина по прежнему адресу принимает заказы, которых никто не увидит.

Типичные проблемы

После переезда часть заказов оказалась на старом сервере.

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

Обмен с учётной системой создал дубли документов.

Фоновые задания работали одновременно на старом и на новом сервере. Задания выключают на старом сервере в самом начале окна простоя.

Сайт на новом сервере отдаёт пустую страницу.

После копирования у файлов остался чужой владелец или неверные права доступа. Владельца и права выставляют сразу после каждого прохода копирования.

Окно простоя затянулось втрое против плана.

Время дампа и заливки базы не замеряли заранее и оценили на глаз. Замер делают на копии до переезда и планируют окно по результату.

Платёжные уведомления перестали доходить.

Платёжная система шлёт их на прежний адрес сервера из белого списка. Адреса в личных кабинетах внешних сервисов правят в день переезда.

Витрина работает, а картинки не открываются.

Каталог загрузок исключили из копирования или второй проход его не догнал. Объём загрузок проверяют на обоих серверах числом файлов и размером.

Частые вопросы

Сколько длится простой при таком переезде?

Столько, сколько идут догоняющий проход и перенос базы: обычно от десяти минут до часа. Точное число получают замером на копии до переезда.

Можно ли обойтись штатным восстановлением копии?

На небольшом сайте - да, это самый простой путь. На сотнях гигабайт архив собирается часами и часто не доходит до конца.

Когда нужна репликация вместо дампа?

Когда даже пятнадцать минут простоя недопустимы бизнесу. Настройка сложнее, зато переключение занимает секунды.

Сколько держать старый сервер?

Минимум неделю после переезда, пока не убедились в стабильности нового. Всё это время он отдаёт заглушку, а не работающий магазин.

Что проверять сразу после переключения?

Открытие витрины, оформление тестового заказа, оплату, обмен и отправку письма. Этот список готовят заранее и проходят по нему вдвоём.

Смежное

Первоисточник