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 ☕☕☕☕☕
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.