Хабрахабр — Анонсы

индекс
252,17

Плавный переезд

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

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

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

Рассказ рассчитан на подготовленную аудиторию и не является точным пошаговым руководством к действию.


Вступление


Итак, имеется типичный «джентельменский набор»:
  • Nginx — фронтенд сервер, за ним Apache или FastCGI
  • Сервер базы данных — MySQL
  • Сервера в новом датацентре — достойная замена серверам текущего хостера, который уже испытал ваше терпение до последнего предела


Весь проект может «жить» на одном сервере или на нескольких, пользовательские файлы могут хранится как на фронтенде, так и на отдельном сервере.

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

Таким образом, простой сервиса при переносе можно сократить по крайней мере до времени создания дампа базы. Хорошо если сервер базы уже настроен для репликации, если нет, придётся сделать и это.

Весь процесс делится на две части: первая — создание актуальной копии ресурса на новой площадке, вторая — плавное перенаправление трафика, обусловленное постеменным обновлением кеширующих DNS-серверов.

Код


Код, шаблоны и прочее в хорошем случае переносятся простым действием: svn co svn://my.repository.ru/myproject/trunk .

База


Итак, нужно открыть два соединения с рабочим сервером базы данных, в одной консоли написать flush tables with read lock, в другой запустить mysqldump c нужными параметрами. Этот момент и подразумевается моментом простоя, так как скорее всего в это время ваш проект может работать некорректно в силу read-блокировки(только чтение) всех таблиц, вероятно, на это время вам придётся повесить «заглушку» (bonnie создаёт полный дамп суперхабра примерно за 58 секунд). После того, как копия базы будет готова, в первой консоли пишем show master status и запоминаем полученные значения (текущее имя файла бинарного лога и позиция в нём) в какое-нибудь безопасное место. Затем просто закрываем консоль, что снимает блокировку таблиц или выполняем unlock tables.

Полученный файл архивируем и переносим на новую площадку. Там, на новом, ещё пахнущим заводом серверов, сервере, создаём базу и восстанавливаем в неё данные. Затем делаем из этого сервера клиента репликации базы со старой площадки и инициализируем репликацию с полученного ранее места: change master to master_log_file='server1-relay-bin.00025', master_log_pos=350384183; start slave;

Если вы знакомы с репликацией и всё сделали правильно, то через несколько минут у вас будет «живая» актуальная копия базы на новом месте. В большинстве случаев трафик между разными площадками передаётся с достаточной скоростью, чтобы все «пишушие» запросы успели попасть от сервера к серверу без очередей и задержек.

Примечание: этот пункт можно опустить чем полностью исключить перебой в работе, если у вас уже есть слейв-сервер, который вы можете перенести на новое место.

Пользовательские файлы


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

Перевод стрелок


Теперь решающий и самый интересный момент. Когда у вас уже есть две работающие копии проекта, прежде чем вносить изменения в DNS, нужно «замкнуть» одну площадку на другую. Сделать это можно при помощи родных возможносней nginx, а именно: его проксирующего модуля. То есть попросту осуществить проксирование всех запросов на новый сервер через старый(снова дурацкая тавтология, когда же конец?): proxy_pass httр://new.server.ip:80/.

Если всё работает нормально, можно обновлять файл DNS-зоны (перенести DNS-сервера каждый, думаю, может на свой лад). С этого момента одна часть обращений будет прозрачно обрабатываться старыми серверами, другая часть новыми. Разумеется, вторая часть будет расти по мере обновления записей кеширующих серверов, а первая примерно через сутки сойдёт на нет.

Как только вы почувствуете, что старые сервера более не нужены, можно отключить или перенастроить репликацию так, как вам нужно и заявить старому хостеру о том, что более он от вас не получит ни рубля.
+70
18 сентября 2008, 20:31
84

комментарии (34)

+2
thornc #
Спасибо :)
Оффтопик: А, если не секрет, (просто интересно) каков на текущий момент объем базы данных хабра? :)
+4
juks #
Такой, что дамп её занимает 1.1G.
0
borsh #
Это в архиве?
0
agentru #
Скорее всего в архиве. Столько информации…
+1
zxmd #
Я бы спросил подругому — это с логами?
0
juks #
Я бы сказал, что с индексами, конечно больше :-)

clyde# du -h ./superhabr
2.8G ./superhabr

InnoDb базы хранятся в отдельных файлах (innodb_file_per_table = 1)
0
juks #
не базы, а таблицы я хотел сказать
+1
Aist #
Нет, это без архива :) Кстати, смена движка позволила сократить объем базы в 5 раз.
0
onthefly #
А за счёт чего был получен столь существенный выигрыш в объёме?
0
Aist #
За счёт оптимизации схемы хранения данных и отказа от второстепенных данных, которые сейчас стали не нужны.
+2
glader #
Скажите, у вас в базе много ненормальзованных полей? Или вы храните их только в кэше? Точнее даже очень интересует ответ на этот вопрос, если не затруднит.
+2
Aist #
Вопрос, как я понимаю звучит так: «где вы обычно храните вычисляемые (избыточные) данные»?
У нас довольно много избыточного хранится в БД. Так же много хранится в мемкеше. Данные, которые меняются не часто и обсчитываются сложно/долго хранятся в БД, а то что можно посчитать быстро, то храним в кеше.
0
glader #
Понятно, спасибо.
+2
juks #
Перенесли только всё самое дорогое сердцу
+1
w0lf #
Если не секрет — почему именно mysqldump а не hot копирование?
+2
juks #
Потому что InnoDB
0
glader #
На innodb только часть таблиц, или все?
0
w0lf #
Понятно. Просто у меня на одном из проектов дамп незапакованной БД около 5 Гб (таблицы MyISAM), mysqldump делается слишком медленно…
+1
Joka #
переезжали практически аналогично — самый удобный способ как мне кажется
+2
mgyk #
Для переноса большой базы удобно использовать LVM снапшоты.
Все аналогично, только после того как посмотрели запись о позиции в мастер логе
Выполняем lvcreate -L1G -s -nbackup /dev/serv/mydb. У нас появляется снапшот-раздел /dev/serv/backup
Разлочиваем таблички. На создание снапшота и разлочку уходит пара секунд всего.
Далее, монтируем /dev/serv/backup и копируем фаилы на наш slave, находящийся на другом хостинге
Аналогично переключаем на нужную позицию в логе.
0
juks #
Спасибо, надо будет изучить
+1
juks #
+1
mgyk #
Вот даже какая-то обертка есть mylvmbackup
0
juks #
Да, только если на сервере perl просто присутствует, придётся потратить некоторое время на настройку CPAN и установку модулей.
0
Pilat #
Если пользоваться только пакетными менеджерами, то настройка софта сервера быстро делается. Для дебиана, например, достаточно сохранить список используемых репозиториев и список пакетов, возвращаемый dpkg --get-selections. Проблемы начинаются, когда используются машины разных архитектур, например i386 и AMD64, поэтому стоит заранее ориентироваться только на одну архитектуру.
+4
Pilat #
Я бы переезд запланировал ещё при создании системы. А именно все сервисы системы держал бы в контейнерах virtuozzo или openvz. Тогда переезд заключается в копировании контейнера на новое место, тестирование его, остановке старой копии, уточнение копии rsync'ом, замена на старой копии конфигурации nginx, поднятие конрейнера на новом месте, с новыми ip адресами, и запуск старого контейнера, теперь уже только ради одного проксирующего nginx. Перерыв в работе определяется размером модифицированных файлов, например базы данных, и в худшем случае определяется временем сравнения контрольных сумм всех файлов на обоих машинах — то что делает rsync, и что не всегда имеет смысл делать. Плюсы — отсутствие неожиданностей на новом железе, ненужность конфигурирования софта.

+5
juks #
Такой подход чем-то похож на вариант для владельца сайта радикально оппозиционной настроенности: постоянно на колёсах :-)
+2
vp7 #
При использовании собственных серверов OpenVZ будет огромным плюсом (даже если на сервере всего одна виртуальная VZ машина) — он позволит практически мгновенно мигрировать контейнеры с одной машины на другую.

Простой пример — есть два сервера. Один — application, второй — БД.
Понадобилось на сервере с БД добавить оперативки и заменить жесткие диски на более ёмкие/быстрые/перейти на RAID,…

В схеме без виртуальных машин такой апгрейд будет означать либо временную недоступность сервиса (при замене винтов недоступность может измеряться часами), либо — достаточно сложные операции по переносу СУБД на другой сервер (установка софта, его настройка,...).
При использовании виртуальных машин можно временно мигрировать БД на application сервер (и времени понадобится ровно столько сколько нужно для копирования образа по сети), неторопять проапгрейдить сервер для БД а позже — сделать отдельную миграцию.

Причём некоторые решения позволяют делать live миграцию, когда прерывания сервиса как такового вообще не будет.
0
leave #
Вот только непонятно, почему при таком способе миграции мусклевой базы дата рождения в 00 ноября превратилась :)
+1
mx2000 #
А вот Xen… позволяет переносить VPS с хоста на хост без остановки сервисов VPS'а. Имхо, удобный вариант ;-)
0
Pilat #
OpenVZ тоже позволяет, есть только одно НО: это в пределах одного адресного пространства.
И есть неожиданная засада — скопировать несколько гигабайтов можно быстро только в пределах одного датацентра, так что живая миграция — это средство для кластеров серверов, не для переездов в другой ДЦ.
+1
BAHO #
Пользуясь случаем, хочу передать привет НЛО и поблагодарить за добавление названия блога в заголовок RSS-экспорта.
0
mgyk #
Миграция OpenVZ достаточно быстрая, хотя и не на столько как XEN. Сервисы останавливать не надо.
Из OpenVZ Wiki «… during migration the VE “freezes” for some time, and after migration it continues to work as though nothing had happened.»
Была ситуация, нужно было обновить одну машинку. На ней висело около 10 openvz контейнеров. Для интереса запустил пинг и смотрел сколько пакетов потеряется пока VPS переезжает, пропало что-то около 3-5 пакетов.
0
Pilat #
На гигабитной сети скорость миграции — 40 секунд на гигабайт (25 мегабайт в секунду). Три гигабайта — это стандартный таймаут, как получается что пакеты не теряются?

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