Резервный сервер для интернет-магазина — полный разбор
Рассказываю, как на прошлой неделе у меня пропал сервер интернет-магазина, который мы ведём. 21 октября утром он перестал отвечать целиком. Ни сайт, ни SSH. Когда машина вернётся, никто сказать не мог. Я поднял копию магазина на другом своём сервере, около 11:20 сайт работал там. Минут через 25 основной сервер ожил, и я вернул домен на него. Новых заказов за это время не было, сводить ничего не пришлось.
Зато восстановление показало пару косяков, про которые я бы предпочёл узнать заранее. Первый - в бэкапе не было .env. Сайт выкладывается релизами, и .env в релизе лежит символической ссылкой. Бэкап честно сохранял ссылку, а не файл. Код, база и картинки восстановились, а настройки я собирал заново. Бэкапы делает наш же плагин, так что косяк наш. На следующий день исправили.
Второй - у записи домена стоял TTL 3600. То есть даже с готовой копией сайта часть посетителей ещё час ходила бы на мёртвый адрес. Хотя про снижение TTL у нас в блоге целая глава. У себя вот проглядел.
После этого сделали магазину резервный сервер в другом дата-центре. Допустимый простой с заказчиком договорились считать 5-10 минут. Ночью я за это время не проснусь, так что переключаться сайт должен уметь сам. Отмечу, как всё устроено:
• база реплицируется на резерв через закрытый туннель, отставание в секундах;
• картинки, около 39 ГБ, раз в минуту уходят в облачное хранилище, резерв отдаёт их оттуда;
• код выкладывается на оба сервера одной командой, а фоновые задачи работают только на основном, иначе покупатель получит два одинаковых письма;
• переключение - одна команда на резерве. Он сам меняет адрес домена в DNS, TTL теперь 60.
Дольше всего я провозился с балансировщиком. Сначала перевёл домен на облачный балансировщик провайдера. На учениях сайт при переключении лежал 13 секунд. Задача вроде как решена. Со всех наших серверов балансировщик отвечал. А утром у заказчика сайт не открылся. Проверил через ping-admin.com: не достучались Москва, Томск, Рига, Копенгаген и Нидерланды. Вернул домен на сервер напрямую, переключение переделал на DNS. Поддержка провайдера за четыре дня причину не нашла. От услуги отказались.
Вывод для меня очевидный: проверять доступность надо из чужих сетей, а не со своих серверов. Мои серверы стоят в нормальных дата-центрах, и то, что они видят сайт, ничего не говорит о покупателе с домашним интернетом. Кстати, при удалении балансировщика не забудьте убрать доверие к его IP в nginx. Иначе новый владелец адреса сможет подставлять серверу «настоящий IP» посетителя.
Автоматическое переключение у меня пока в теневом режиме. Арбитр со свидетелями в других дата-центрах только пишет в журнал, что переключил бы. И уже нашёл случай, где в бою дал бы ложную тревогу: режим обслуживания во время выкладки. Включать буду, когда разберу все его сомнения. Так спокойнее.
В целом схема получилась простая, без балансировщика. Минута на переключение вместо часа. Для магазина нормально.
А у вас есть резерв для сайта? И давно вы проверяли, что лежит в бэкапе?
Просмотры: 2