Назад | Перейти на главную страницу

Как внести изменения на рабочий веб-сайт, не останавливая его ни на долю секунды?

Я использую Git для управления циклом разработки своего веб-приложения, а также для изменений, в которых git pull достаточно и никаких изменений не требуется, я просто поддерживаю сайт в рабочем состоянии и git pull перемены.

Но я думаю, скажем, у меня было изменено 100 файлов, и что на диск была некоторая неожиданная загрузка, что произойдет, если кто-то сделает запрос в течение в тот момент, когда git фиксировал изменения на диске? Разве это не сделает мое приложение уязвимым для возможного повреждения данных или искаженных ответов?

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


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

Было бы это практично, если бы можно было реализовать такую ​​же вещь?

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

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

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

Один из канонических способов сделать это, независимо от того, что вы используете git или нет (но с его помощью вы можете реализовать эту схему с некоторыми из ее хуков), это иметь каталог на веб-сайте, где вы устанавливаете каждую новую «версию» в ее собственном конкретном каталоге, например, с меткой даты / времени в ее имени . Настоящий живой контент, используемый в настоящее время веб-сервером, находится в другом пути, который является символической ссылкой на один каталог «версии».

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

Изменение символической ссылки почти атомарно, поэтому это не вызовет сбоев.

Это также позволяет легко вернуться: просто снова измените символическую ссылку.