Скажите, у вас в базе много ненормальзованных полей? Или вы храните их только в кэше? Точнее даже очень интересует ответ на этот вопрос, если не затруднит.
Вопрос, как я понимаю звучит так: «где вы обычно храните вычисляемые (избыточные) данные»?
У нас довольно много избыточного хранится в БД. Так же много хранится в мемкеше. Данные, которые меняются не часто и обсчитываются сложно/долго хранятся в БД, а то что можно посчитать быстро, то храним в кеше.
Для переноса большой базы удобно использовать LVM снапшоты.
Все аналогично, только после того как посмотрели запись о позиции в мастер логе
Выполняем lvcreate -L1G -s -nbackup /dev/serv/mydb. У нас появляется снапшот-раздел /dev/serv/backup
Разлочиваем таблички. На создание снапшота и разлочку уходит пара секунд всего.
Далее, монтируем /dev/serv/backup и копируем фаилы на наш slave, находящийся на другом хостинге
Аналогично переключаем на нужную позицию в логе.
Если пользоваться только пакетными менеджерами, то настройка софта сервера быстро делается. Для дебиана, например, достаточно сохранить список используемых репозиториев и список пакетов, возвращаемый dpkg --get-selections. Проблемы начинаются, когда используются машины разных архитектур, например i386 и AMD64, поэтому стоит заранее ориентироваться только на одну архитектуру.
Я бы переезд запланировал ещё при создании системы. А именно все сервисы системы держал бы в контейнерах virtuozzo или openvz. Тогда переезд заключается в копировании контейнера на новое место, тестирование его, остановке старой копии, уточнение копии rsync'ом, замена на старой копии конфигурации nginx, поднятие конрейнера на новом месте, с новыми ip адресами, и запуск старого контейнера, теперь уже только ради одного проксирующего nginx. Перерыв в работе определяется размером модифицированных файлов, например базы данных, и в худшем случае определяется временем сравнения контрольных сумм всех файлов на обоих машинах — то что делает rsync, и что не всегда имеет смысл делать. Плюсы — отсутствие неожиданностей на новом железе, ненужность конфигурирования софта.
При использовании собственных серверов OpenVZ будет огромным плюсом (даже если на сервере всего одна виртуальная VZ машина) — он позволит практически мгновенно мигрировать контейнеры с одной машины на другую.
Простой пример — есть два сервера. Один — application, второй — БД.
Понадобилось на сервере с БД добавить оперативки и заменить жесткие диски на более ёмкие/быстрые/перейти на RAID,…
В схеме без виртуальных машин такой апгрейд будет означать либо временную недоступность сервиса (при замене винтов недоступность может измеряться часами), либо — достаточно сложные операции по переносу СУБД на другой сервер (установка софта, его настройка,...).
При использовании виртуальных машин можно временно мигрировать БД на application сервер (и времени понадобится ровно столько сколько нужно для копирования образа по сети), неторопять проапгрейдить сервер для БД а позже — сделать отдельную миграцию.
Причём некоторые решения позволяют делать live миграцию, когда прерывания сервиса как такового вообще не будет.
OpenVZ тоже позволяет, есть только одно НО: это в пределах одного адресного пространства.
И есть неожиданная засада — скопировать несколько гигабайтов можно быстро только в пределах одного датацентра, так что живая миграция — это средство для кластеров серверов, не для переездов в другой ДЦ.
Миграция 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 пакетов.
На гигабитной сети скорость миграции — 40 секунд на гигабайт (25 мегабайт в секунду). Три гигабайта — это стандартный таймаут, как получается что пакеты не теряются?
Плавный переезд