Как перенести сайтик с одного сервера на другой без простоя

Веб-разработка /
Категорически приветствую.

Один из двух моих проектов, а именно internets.kz на днях переехал с четрырёх VDS на пару VPS (пока вполне хватает). Возможно, вы даже заметили простой, который организовал я сам своими кривыми руками :) В этом топике хочу рассказать, как всё происходило.

Для начала хочу извиниться за простой сайта с 24 по 25 октября — я криворукий чудак (на букву «м») — прописал кривую конфигурацию nginx'а и не проверив пошёл спать, потом навалилась работа и поэтому сутки сайт отвечал на все запросы «Welcome to nginx». Как говорится, не ошибается только тот, кто ничего не делает.

Итак, я купил две VPS, поехали!

Для начала чуть-чуть об используемых технологиях. Везде Debian 6, в качестве основного веб-сервера на фронтенде nginx, счётчик обслуживается lighttpd (отчасти — так сложилось исторически) с mod_magnet и обработчиком на Lua. Там же стоит memcached, куда записывается лог запросов. Отдельно — MongoDB для хранения статистики и MySQL для всех более-менее статичных данных сайта. Бекенд на php5-fpm, для поиска используется Sphinx и ещё есть допиленная софтина webkit2png на python'е, которая смотрит ещё одну очередь в мемкеше и превращает её в скриншотики сайтов.

Первое, что было сделано на VPS — естественно, установка всего этого винегрета. Завёл slave для базы по официальной инструкции. Следом завёл slave для MongoDB.

После этого я сконфигурировал nginx так, чтобы он все свои запросы проксировал на старый сервер и поменял запись в DNS. Теперь для клиентов, у которых успел обновиться DNS отдавались проксированные запросы. Те, кто не успел обновиться обслуживались по-старому. Со временем все стали использовать новый адрес.

Следующим шагом я перелил код и статику со старого сервера, проверил, чтобы всё работало (wget new-server/uri --header=«Host: internets.kz» -O — | less). Когда всё было хорошо сделал ещё один rsync кода и статики (дабы «догнать» нагенерировавшиеся скриншотики), отключил репликацию обеих БД и подсунул nginx'у новый конфиг.

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

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

С радостью отвечу на все вопросы в комментариях.
Всем добра!

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

23 комментария

yrnt
Конфиги тестить по-любому надо, а то всяко-разно получается:)
4VDS->2VPS
Если не секрет, что там за VPS-ки.
majesty
VDS были суровые — от 1 до 4 Гб памяти и 1-4 ядра процессора. VPS — две вот такие.
yrnt
немцы что ли:)
majesty
Они самые. В Казахстане очень дорого всё это.
RadMax
Ты что не знаешь этих весёлых немецких ребят?

majesty
А на заднем плане те самые легендарные серверы из говна и палок? :)
RadMax
Кстати может через пол года напишите пост о том как живётся на hetzner. Всё же лучшее предложение по цена / железо.

Если бы мне понадобилось две VPS с такими ресурсами, я бы тоже пошёл к ним.
majesty
Про VPS пока данных мало, сервером я их пользуюсь уже почти год и это второй по порядку. До этого был ещё год на маленьком (тогда они у них были — 2 ядра 2 гига 300 гигов диска). В принципе, проблем за эти почти 2 года не было никаких. На первом была убунта предустановленная, на второй самолично водрузил Proxmox и поделил его на VDS'ки нужных размеров :)
RadMax
Можно было бы, конечно, всё выключить, быстренько снять дампы двух баз, параллельно переливая статику и код и обратно включить. Так простой бы ограничился, может быть, получасом.
Тогда была бы не интересная история )))
faiwer
А зачем 2 VPS?
majesty
Странный вопрос… Попробуйте вместить MySQL и MongoDB на 1 ядро и 512Мб оперативки… А ведь там ещё нужно код исполнять, мемкеш, опять же крутить, веб-сервер… А ещё операционка должна сетью рулить каким-то образом…
faiwer
nodeJS + mongoDB + LAMP вмещал в 386 МБ, дак ещё и оставалось. Базы были не большие, особенно mongo-база, но ведь у вас аж 512 МБ на VPS. Ну и о5 же, допустим не хватает, почему 2 слабые VPS, а не 1 сильная?
majesty
Таки считать статистику чуть-чуть сложнее, чем просто хранить данные. Плюс там ещё питоно-скриншото-сниматель неплохо подкушивает ресурсы.

2 слабые — потому, что 1 сильная а) дороже б) неудобно управлять, когда всё в куче. Если бы не было так жалко денег — купил бы 4 их, чтобы повторить схему на VDS.

ЗЫ: Мой счётчик в сутки обсчитывает до 50К хитов. Всё это в конечном счёте выливается в примерно 1М запросов в монгу. Плюс достаточно часто используется прожорливый тормозной map-reduce.
faiwer
Понятно, я не учёл, что у вас 50к счётчик, посмотрел только footer на сайте.
А в чём заключается упрощение управлением сразу 4 VPS, нежели 1? При такой схеме есть какие-нибудь плюсы?

И ещё 1 нубской вопрос — чем отличаются VDS от VPS? Технологией виртуализации?
majesty
Упрощение состоит в том, что одна машина занимается конкретной задачей. MySQL, например, не толкает локтями монгу.

Я-то под VDS подразумевал виртуальный сервер с честной виртуализацией (Xen, VMWare, kvm), ан нет — это синонимы :) Так что извините за ввод в заблужение.
faiwer
1. Т.е. у вас мускуль висит отдельно? а каков пинг м\у VPS-ми? если ~ 5мс, то 5 запросов увеличат загрузку страницы на 25мс =) печалька. Или там всё ок?
2. Ещё вопрос — php5-fpm сколько у вас воркеров? 1? Я читал, что нужно ставить по кол-ву ядер, но это ставит вопрос, а есть ли резон ждать следующему запросу окончания предыдущего, если тот повис на блокирующем запросе к БД? К примеру на nodeJS, все подобные ситуация разруливаются асинхронным подходом.
majesty
Мускуль висит на той же тачке, что и сайт. Счетчик на другой машине вместе с монгой. фпм в аболютно дефолтной конфигурации, пока проблем не было (поскольку пхп обрабатывает достаточно мало запросов) :)
majesty
Нет :) Очередь пишется модулем к lighttpd на lua, а разгребается php-cli (но ведь это никакого отношения к fpm'у не имеет ;)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.