LINUX.ORG.RU
ФорумAdmin

Переключение версии сайта со staging на production с 0 downtime, как?

 ,


1

3

Есть сайт, работающий на одном хосте/машине, больше хостов нет (используется VPS/VDS). Сайт работает на базе php-fpm + mysqld + nginx, используется только одна база MySQL. PHP-исходники, которые обрабатывают текущие запросы лежат в папке /site/production. На хост была залита др. папка - /site/staging с новой версией исходников.

Теперь нужно:
1. Применить апдейт для БД в виде .sql-скриптов, которые могут поменять структуру таблиц базы.
2. Переключить nginx на новую версию исходников, т.е. с /site/production на /site/staging.

Эти два пункта нужно сделать одновременно, так, чтобы юзеры это вообще не заметили, ниодного HTTP-запроса не прервалось, т.е. с 0 downtime и connection draining.

Переключить root можно с помощью команды nginx reload и таким образом переключиться с /site/production на /site/staging. Проблема в том, что /site/staging зависит от скриптов апдейта БД - нужно вначале применить их, иначе .php-скрипты в /site/staging не будут работать. Если же вначале применить скрипты апдейта БД, то сайт некоторое время будет недоступен, потому как Nginx будет использовать старые исходники /site/production какое-то время, до полного переключения на /site/staging.

Как это можно сделать? Можно ли это сделать без введения второго хоста в строй? Если нет, как это делается в случае с двумя или более хостами? Можно ли обойтись без репликации MySQL?

Я полагаю, что для 0 downtime и connection draining нужна репликация MySQL: на slave применяются апдейты, нужные для /site/staging и затем переключаются через DNS, так ли это?

В общем, кто уже строил HA кластеры или имеет опыт для одного хоста переключения с 0 downtime сайта как вы это делаете или это можно сделать? Хотелось бы обойтись без введения второго хоста, если возможно.

Перемещено leave из web-development


Ответ на: комментарий от ProtoH

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

winlook38 ★★
()
Ответ на: комментарий от winlook38

Так ты уже придумал пример, когда необходимы ломающие миграции?

Суммируя сказанное выше разными участниками данной дискуссии, делаю такой вывод: теоретически можно попробовать реализовать логику на уровне БД, которая будет склеивать старую схему и новую. Можно глянуть триггеры, процедуры и т.д. Тогда старый .php-код может не сломаться при применении .sql-патчей (можно читать миграций), необходимых для работы нового .php-кода. Тогда получается, что может не быть downtime при применении .sql-патчей. Остаётся только задача переключения на новый код, которую можно сделать командой nginx -s reload

Под миграциями я понимаю .sql-файлы, меняющие структуру таблиц (или др. сущностей БД) или данных.

ProtoH
() автор топика

Вижу, что нужно уточнить по задаче: сайт можно остановить сейчас на несколько минут, просто нужно решить задачу переключения на новую версию с 0 downtime в общем случае.

ProtoH
() автор топика

Теоретически: - вариант переключения IP-шника днс выглядит вполне (для минимизации ошибок скриптов), когда фактически два сайта (минимум), несмотря что база одна (да, тут схема не помешает)

anonymous
()
Ответ на: комментарий от ProtoH

Да, примерно так. От себя скажу, что с триггерами мы не заморачиваемся. В каких-то случаях используем, но в основном прикладной код сам заботится обо всем (решили, что размазывание логики чаще приводит к ошибкам по невнимательности; с другой стороны наш код полон легаси из-за такого подхода).

Под миграциями я понимаю

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

Когда со всем этим наиграешься, поймешь, что твое требование нулевого даунтайма ненужно.

winlook38 ★★
()
Ответ на: комментарий от ProtoH

Наоборот. В общем случае у тебя будет даунтайм, но ты можешь попытаться в отдельных случаях добиться нулевого даунтайма. В общем случае нулевой даунтайм и не нужен.

winlook38 ★★
()
Ответ на: комментарий от ProtoH

Т.е. изменение данных, хранящихся в таблицах БД? В чём могут быть проблемы здесь?

При правильном подходе проблем быть не должно, точнее я не могу себе представить такую ситуацию при правильном проектировании.
Исключения с которыми я сталкивался это когда «гонят сроки» требуют быстрее внедрить не отлаженный код и как результат получают не корректные данные в самой БД, которые потом муторно и долго приходиться приводить в порядок. Но в этом случае как раз downtime обоснован и есть на кого стрелки перевести «Вас предупреждали? Предупреждали. Вот и получите то что есть.» Такая же ситуация бывает при плохо составленном ТЗ, когда заказчик «внезапно» для себя получает не то что «он думал».

anc ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.