Я помогаю с большим игровым сайтом в Австралии. Мы проводим соревнования с 7 утра по местному времени до 1 часа ночи следующего дня, каждый день недели. Мы не пропустили ни дня с момента выхода сайта. Естественно, это чрезвычайно усложняет обслуживание, и мы обнаруживаем, что наш промежуточный сервер до 50 коммитов опережает наш производственный филиал. Обычно главный разработчик должен очень рано вставать, чтобы объединить ветки и убедиться, что все работает правильно.
Мы пытались сделать наш промежуточный сайт максимально похожим на производственный, но мы можем сделать его только таким похожим.
Наш сайт основан на Laravel с сервером Node.JS для реального времени. Мы используем Laravel Forge.
Есть ли у кого-нибудь предложения о том, как мы могли бы чаще обновлять? Мы открыты для всего.
источник
Ответы:
Есть много вещей, которые вы могли бы сделать, чтобы улучшить процесс развертывания. Вот некоторые из них:
Убедитесь, что ваш код хорошо протестирован.
В идеале у вас должно быть 100% покрытие модульных тестов, а также интеграционное тестирование для каждого мыслимого сценария.
Если у вас этого нет, вам, вероятно, следует бросить все и позаботиться об этом.
Посмотрите на поведение, управляемое поведением.
Наличие полного набора тестов позволит вам ...
Запустите непрерывную интеграцию.
Всякий раз, когда кто-то фиксирует изменение, CI может автоматически запускать на нем набор тестов. Если набор тестов пройден, он может немедленно развернуться (или запланировать развертывание). Для изменений, которые не требуют значительных изменений в ваших базах данных, это одно сэкономит вам много времени и головной боли.
В случае возникновения проблем, CI также может дать вам откат в один клик.
CI гораздо менее полезен, если ваш набор тестов не является полным и правильным, так как вся предпосылка основана на возможности автоматически проверять ваш код.
Делать атомные обновления.
В идеале вы не должны просто копировать новые файлы поверх старых на производственном сервере. Вместо этого используйте инструмент, такой как capistrano, который копирует каждый файл в новое место, а затем использует символическую ссылку для указания на желаемое развертывание. Откат происходит мгновенно, поскольку включает в себя просто изменение символической ссылки, чтобы указать на предыдущее развертывание. (Хотя это не обязательно охватывает миграцию вашей базы данных.)
Также посмотрите, могут ли такие контейнеры, как Docker, помочь вам.
Делайте меньшие, более частые изменения.
Независимо от того, есть ли у вас тесты, КИ или ничего, одно это может вам существенно помочь. Каждое изменение должно иметь свою собственную ветку git, а развертывание должно иметь как можно меньше изменений. Поскольку изменения меньше, во время развертывания может быть меньше ошибок.
На этой ноте, сделайте изменения более изолированными, когда это возможно. Если вы внесли изменения в игру Омаха и это не касается Техасского Холдема, 5-карточного стад-покера или чего-либо еще, то это единственная игра, которую необходимо приостановить для проведения технического обслуживания.
Проанализируйте что-нибудь длительное.
Вы упомянули, что некоторые части ваших развертываний занимают много времени. Это, вероятно, изменения схемы базы данных. Стоит, чтобы администратор БД просмотрел вашу базу данных вместе с каждым изменением схемы, чтобы увидеть, что может работать лучше.
Попросите эксперта по предмету взглянуть на любую другую часть развертывания, которая занимает много времени.
Работа нечетные часы.
Возможно, вы уже делаете это, но это стоит упомянуть. Не следует ожидать, что разработчики (и системные администраторы!) Будут работать с 9 до 5, особенно в режиме 24x7. Если ожидается, что кто-то проведет ночные часы, присматривая за развертыванием, исправляя какие-либо проблемы, а затем соблюдая дневное расписание, ваши ожидания нереалистичны, и вы настраиваете этого человека на выгорание.
источник
Из того, что вы говорите, кажется, что у вас есть окно технического обслуживания с 1 утра до 7 утра каждый день, проблема не в времени, а в удобстве. Это нормально, и многие люди занимаются этим как частью бизнеса.
У вас может быть 2 (или более серверных) системы с внешним интерфейсом, который направляет трафик к тому, что в данный момент активно. Как только вы довольны тем, что релиз будет работать, вы говорите внешнему интерфейсу переключиться на новую систему. это должно быть легко написать сценарий и займет немного времени.
Теперь у вас есть выбор: оставить старую систему как есть, чтобы можно было вернуться назад или обновить ее, чтобы ее можно было использовать в качестве запасной для работающей системы до тех пор, пока не пришло время собирать / тестировать следующие обновления.
источник
Внесение поправок в другие ответы: Вы должны следовать сине-зеленой модели развертывания . Когда вы хотите выпустить новую версию, вы развертываете ее на внутреннем промежуточном веб-сайте. Затем вы можете запустить автоматические тесты на следующей версии сайта. Когда тесты пройдут, вы указываете балансировщику нагрузки использовать новый веб-сайт.
Это помогает следующим образом:
Все другие проблемы, о которых вы и другие упоминали, становятся менее серьезными, когда вы можете развернуть их в любое время без стресса. Сине-зеленая модель развертывания является довольно полным решением проблем развертывания.
источник
Что вы будете делать, если в вашем главном центре обработки данных произойдет сбой, который время от времени происходит во всех центрах обработки данных? Вы можете принять время простоя, вы можете переключиться на другой центр обработки данных, возможно, вы все время работаете в активном режиме в нескольких центрах обработки данных, или у вас может быть какой-то другой план. Какой бы из них ни был, сделайте это, когда будете делать релизы, и тогда вы сможете отключить основной центр обработки данных во время релиза. Если вы готовы к простоям в случае сбоя в работе центра обработки данных, тогда вы готовы к простоям, поэтому это не должно быть проблемой во время выпуска.
источник
Чтобы добавить к предыдущим ответам:
Используйте стратегию развертывания, которая допускает откат и мгновенное переключение, Capistrano или почти любая другая система развертывания поможет в этом. Вы можете использовать такие вещи, как снимки базы данных и символические ссылки кода, чтобы иметь возможность быстро вернуться к предыдущему состоянию.
Используйте полное управление конфигурацией, не оставляйте ничего управляемого вручную. Такие системы, как SaltStack, Ansible и Puppet, являются примерами. Они также могут быть применены к конфигурациям контейнеров Docker и бродячим коробкам.
Используйте HA, чтобы убедиться, что вы можете передавать запросы при обновлении узла. Если обновление завершится неудачно, просто отключите узел, а когда он откатится, верните его обратно, и ваше решение высокой готовности заметит и снова отправит запросы на указанный узел. HAProxy является примером, но nginx работает просто отлично.
Убедитесь, что приложение может обрабатывать параллельные экземпляры, используя централизованные версионные хранилища данных для некодовых данных, которые должны храниться на диске, например, в кеше. Таким образом, вы никогда не будете запускать обновленное приложение для кеширования файлов из другой версии. Это будет сделано поверх очистки кешей и, конечно же, их прогрева. (Кеширование это только пример)
Обычно я настраиваю рабочие процессы, в которых руководители групп могут утверждать запросы на слияние в специальной ветке, которая выполняет все обычные операции CI, но в качестве дополнительного последнего шага также начинает продвигаться к рабочим узлам. В основном вы запускаете ручное развертывание CI в производственном экземпляре. Если этот экземпляр не генерирует недопустимые ответы, ломает или делает странные вещи с вашими данными, вы затем массово обновляете все узлы, используя выбранное вами решение CI. Таким образом, если работает одно развертывание, вы знаете, что все развертывания будут работать для определенного тега / коммита.
Прямо сейчас это звучит так, как будто вы запускаете производственное приложение на одном узле с одним процессом развертывания, одним источником и одной целью. Это фактически означает, что каждый отдельный шаг в этом рабочем процессе является точкой отказа, которая сама по себе может сломать веб-сайт. Обеспечение невозможности такой вещи является основой всех процессов CI, HA и аварийного переключения. Не запускайте только один узел, не запускайте только один процесс высокой доступности, не запускайте только один IP-адрес, не запускайте только один CDN и т. Д. Это может показаться дорогостоящим, но с дублированием того, что у вас уже есть в стойке на сервере со своим собственным соединением обычно стоит меньше часа простоя на бизнес-сайте.
источник
Я полностью согласен с Майклом по каждому из его пунктов ( /server//a/739449/309477 ).
На мой взгляд, первое улучшение, которое вы должны сделать, это использование инструмента развертывания (Capistrano).
Это позволит вам развернуть мирно, а затем мгновенно переключиться на более новую версию. Если что-то пойдет не так, вы можете мгновенно вернуться к рабочей версии, просто изменив текущую символическую ссылку на рабочую версию.
И Capistrano довольно быстро справляется (по сравнению с началом использования тестов и CI, что потребует больших временных затрат).
Во-вторых, если деньги не являются вашей основной проблемой, у вас должен быть сервер разработки iso-prod для тестирования вашего приложения перед его развертыванием в производстве. Используйте промышленное решение (Ansible, Chef, Puppet) для управления экземплярами VPS.
источник