Любые идеи о том, как запустить обслуживание на сайте, который всегда используется?


18

Я помогаю с большим игровым сайтом в Австралии. Мы проводим соревнования с 7 утра по местному времени до 1 часа ночи следующего дня, каждый день недели. Мы не пропустили ни дня с момента выхода сайта. Естественно, это чрезвычайно усложняет обслуживание, и мы обнаруживаем, что наш промежуточный сервер до 50 коммитов опережает наш производственный филиал. Обычно главный разработчик должен очень рано вставать, чтобы объединить ветки и убедиться, что все работает правильно.

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

Наш сайт основан на Laravel с сервером Node.JS для реального времени. Мы используем Laravel Forge.

Есть ли у кого-нибудь предложения о том, как мы могли бы чаще обновлять? Мы открыты для всего.


Почему развертывание занимает так много времени?
Майкл Хэмптон

@MichaelHampton Наше развертывание не займет много времени, просто мы не можем позволить себе простои, если что-то пойдет не так.
cheese5505

1
Я думаю, что вопрос: почему откат занимает так много времени?
Майкл Хэмптон

@MichaelHampton: мы не рассмотрели откатов должным образом, однако время от времени мы делаем большие обновления, которые слишком долго будут закрывать сайт.
cheese5505

5
Что бы ни занимало большие блоки времени, это то, на что вам нужно смотреть.
Майкл Хэмптон

Ответы:


22

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

  • Убедитесь, что ваш код хорошо протестирован.

    В идеале у вас должно быть 100% покрытие модульных тестов, а также интеграционное тестирование для каждого мыслимого сценария.

    Если у вас этого нет, вам, вероятно, следует бросить все и позаботиться об этом.

    Посмотрите на поведение, управляемое поведением.

    Наличие полного набора тестов позволит вам ...

  • Запустите непрерывную интеграцию.

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

    В случае возникновения проблем, CI также может дать вам откат в один клик.

    CI гораздо менее полезен, если ваш набор тестов не является полным и правильным, так как вся предпосылка основана на возможности автоматически проверять ваш код.

  • Делать атомные обновления.

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

    Также посмотрите, могут ли такие контейнеры, как Docker, помочь вам.

  • Делайте меньшие, более частые изменения.

    Независимо от того, есть ли у вас тесты, КИ или ничего, одно это может вам существенно помочь. Каждое изменение должно иметь свою собственную ветку git, а развертывание должно иметь как можно меньше изменений. Поскольку изменения меньше, во время развертывания может быть меньше ошибок.

    На этой ноте, сделайте изменения более изолированными, когда это возможно. Если вы внесли изменения в игру Омаха и это не касается Техасского Холдема, 5-карточного стад-покера или чего-либо еще, то это единственная игра, которую необходимо приостановить для проведения технического обслуживания.

  • Проанализируйте что-нибудь длительное.

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

    Попросите эксперта по предмету взглянуть на любую другую часть развертывания, которая занимает много времени.

  • Работа нечетные часы.

    Возможно, вы уже делаете это, но это стоит упомянуть. Не следует ожидать, что разработчики (и системные администраторы!) Будут работать с 9 до 5, особенно в режиме 24x7. Если ожидается, что кто-то проведет ночные часы, присматривая за развертыванием, исправляя какие-либо проблемы, а затем соблюдая дневное расписание, ваши ожидания нереалистичны, и вы настраиваете этого человека на выгорание.


Самым простым решением здесь является использование сценариев развертывания в таком инструменте, как Capistrano, и, возможно, даже балансировка нагрузки.
JakeGould

Спасибо за совет. Мы рассмотрим это. На данный момент у нас нет набора тестов, и мне бы очень хотелось его изучить, однако сайт находится в разработке уже более 8 месяцев и настолько велик, что на его создание уйдет больше недели. Мы запускаем Laravel Forge, который просто символически связывает новую версию с папкой, для которой настроен nginx. Я не могу работать в неурочные часы из-за школы, и то же самое для другого разработчика.
cheese5505

1
@ cheese5505 Я знаю, что это расстраивает, и это не решает твою проблему, но когда ты говоришь это: «… настолько велика, что на ее изготовление уйдет больше недели». Это кажется явно нелепым. Любой нормальный процесс разработки и развертывания позволил бы создать сервер менее чем за день или, возможно, от нескольких часов до часа. Вы должны действительно пересмотреть то, что вы сделали, чтобы собрать эту кучу неуправляемых вещей, чтобы избежать этого. Проблема не в сложности, а в предвидении планирования.
JakeGould

1
«На данный момент у нас нет набора тестов вообще» - исправьте это сейчас , прежде чем разрабатывать новые функции. Это ваша самая большая болевая точка и будет риск доступности. Автоматизированное тестирование поможет предотвратить перебои в работе и значительно уменьшит боль при операциях.
Джош

6

Из того, что вы говорите, кажется, что у вас есть окно технического обслуживания с 1 утра до 7 утра каждый день, проблема не в времени, а в удобстве. Это нормально, и многие люди занимаются этим как частью бизнеса.

У вас может быть 2 (или более серверных) системы с внешним интерфейсом, который направляет трафик к тому, что в данный момент активно. Как только вы довольны тем, что релиз будет работать, вы говорите внешнему интерфейсу переключиться на новую систему. это должно быть легко написать сценарий и займет немного времени.

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


Когда вы отличаете бэкэнд от внешнего интерфейса, вы имеете в виду полностью модульную программную архитектуру? Или серверная архитектура, такая как балансировщик нагрузки?
JakeGould

2
просто то, что принимает соединения и доставляет их текущему первичному бэкэнду.
user9517 поддержал GoFundMonica

5

Внесение поправок в другие ответы: Вы должны следовать сине-зеленой модели развертывания . Когда вы хотите выпустить новую версию, вы развертываете ее на внутреннем промежуточном веб-сайте. Затем вы можете запустить автоматические тесты на следующей версии сайта. Когда тесты пройдут, вы указываете балансировщику нагрузки использовать новый веб-сайт.

Это помогает следующим образом:

  1. Серьезные проблемы всегда встречаются с нулевым временем простоя.
  2. Переключение на новую версию имеет абсолютно нулевое время простоя, поскольку новая версия уже запущена и прогрета.
  3. Вы можете в любой момент вернуться к старой версии, потому что она все еще работает.

Все другие проблемы, о которых вы и другие упоминали, становятся менее серьезными, когда вы можете развернуть их в любое время без стресса. Сине-зеленая модель развертывания является довольно полным решением проблем развертывания.


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

1
Ключ в том, чтобы просто переключить балансировщик нагрузки на проверенную рабочую версию. С этой текущей моделью у вас этого нет.
USR

1
Насколько хороша модель, во многом зависит от того, что делает сайт. Если сайт не имеет состояния, то это здорово, но если он не имеет состояния, вы должны решить, как вы перенесете это состояние при переключении.
Питер Грин

@PeterGreen для веб-сайтов очень сложно сохранять состояние, потому что это не позволяет кластеризоваться, и состояние может быть потеряно в любое время при повторном развертывании / перезагрузке / сбое / синем экране и т. Д. Поэтому это очень редко.
USR

@usr большинство сайтов имеют статус. Это состояние может храниться либо в файлах, либо в базе данных. В последнем случае база данных может быть локальной или удаленной. Некоторые обновления могут повлиять на это состояние, а это означает, что обновление и откат не так просты, как переключение кода.
Питер Грин

3

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


2

Чтобы добавить к предыдущим ответам:

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

  • Используйте полное управление конфигурацией, не оставляйте ничего управляемого вручную. Такие системы, как SaltStack, Ansible и Puppet, являются примерами. Они также могут быть применены к конфигурациям контейнеров Docker и бродячим коробкам.

  • Используйте HA, чтобы убедиться, что вы можете передавать запросы при обновлении узла. Если обновление завершится неудачно, просто отключите узел, а когда он откатится, верните его обратно, и ваше решение высокой готовности заметит и снова отправит запросы на указанный узел. HAProxy является примером, но nginx работает просто отлично.

  • Убедитесь, что приложение может обрабатывать параллельные экземпляры, используя централизованные версионные хранилища данных для некодовых данных, которые должны храниться на диске, например, в кеше. Таким образом, вы никогда не будете запускать обновленное приложение для кеширования файлов из другой версии. Это будет сделано поверх очистки кешей и, конечно же, их прогрева. (Кеширование это только пример)

Обычно я настраиваю рабочие процессы, в которых руководители групп могут утверждать запросы на слияние в специальной ветке, которая выполняет все обычные операции CI, но в качестве дополнительного последнего шага также начинает продвигаться к рабочим узлам. В основном вы запускаете ручное развертывание CI в производственном экземпляре. Если этот экземпляр не генерирует недопустимые ответы, ломает или делает странные вещи с вашими данными, вы затем массово обновляете все узлы, используя выбранное вами решение CI. Таким образом, если работает одно развертывание, вы знаете, что все развертывания будут работать для определенного тега / коммита.

Прямо сейчас это звучит так, как будто вы запускаете производственное приложение на одном узле с одним процессом развертывания, одним источником и одной целью. Это фактически означает, что каждый отдельный шаг в этом рабочем процессе является точкой отказа, которая сама по себе может сломать веб-сайт. Обеспечение невозможности такой вещи является основой всех процессов CI, HA и аварийного переключения. Не запускайте только один узел, не запускайте только один процесс высокой доступности, не запускайте только один IP-адрес, не запускайте только один CDN и т. Д. Это может показаться дорогостоящим, но с дублированием того, что у вас уже есть в стойке на сервере со своим собственным соединением обычно стоит меньше часа простоя на бизнес-сайте.


0

Я полностью согласен с Майклом по каждому из его пунктов ( /server//a/739449/309477 ).

На мой взгляд, первое улучшение, которое вы должны сделать, это использование инструмента развертывания (Capistrano).

Это позволит вам развернуть мирно, а затем мгновенно переключиться на более новую версию. Если что-то пойдет не так, вы можете мгновенно вернуться к рабочей версии, просто изменив текущую символическую ссылку на рабочую версию.

И Capistrano довольно быстро справляется (по сравнению с началом использования тестов и CI, что потребует больших временных затрат).

Во-вторых, если деньги не являются вашей основной проблемой, у вас должен быть сервер разработки iso-prod для тестирования вашего приложения перед его развертыванием в производстве. Используйте промышленное решение (Ansible, Chef, Puppet) для управления экземплярами VPS.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.