Одна из главных угроз для растущего сайта — не взлом и не ошибки в коде, а собственный успех. Резкий приток посетителей, который должен был стать праздником, оборачивается катастрофой: сервер не справляется, страницы не открываются, заказы срываются, а разгневанные клиенты уходят к конкурентам.
Выход — строить систему, которая умеет держать удар и распределять работу между несколькими машинами. Разберем, как это устроено и почему без этого не обойтись серьезному проекту.
Почему один сервер — это всегда риск
Любое оборудование рано или поздно выходит из строя. Вопрос не в том, случится ли отказ, а в том, когда он произойдет и что будет с вашим сайтом в этот момент. Если вся нагрузка лежит на одной машине, её остановка означает полную недоступность ресурса. Пока вы ищете причину, заказываете замену детали или переустанавливаете систему, бизнес теряет деньги.
Даже если оборудование исправно, один сервер имеет физические пределы. Память не безгранична, вычислительные ядра не резиновые. Когда число одновременных запросов превышает возможности машины, она начинает вставать в очередь, замедляться и в итоге перестает отвечать.
Отказоустойчивая архитектура решает обе задачи: она позволяет пережить выход из строя части оборудования и справиться с нагрузкой, которую не потянет одиночный узел.
Принцип первый: разделение ролей
Первое, что нужно сделать, — перестать заставлять одну машину делать всё подряд. В простейшей схеме один сервер хранит файлы, базу данных и сам отвечает на запросы посетителей. Это удобно, но крайне уязвимо.
Правильный подход — разделить функции:
- Сервер-приёмщик. Он встречает посетителя, принимает запрос и решает, куда его отправить.
- Сервер-обработчик. Здесь крутится программная часть сайта. Таких машин может быть несколько, они работают параллельно.
- Сервер-хранилище. Отдельная машина для базы данных.
- Хранилище файлов. Картинки, документы, видео выносятся на отдельные устройства или в специализированные файловые системы.
Когда роли разделены, выход из строя одной машины не парализует весь сайт. Отказал обработчик — нагрузку подхватывают остальные. Сломалось хранилище файлов — текст и база продолжают работать.
Принцип второй: дублирование всего критичного
Отказоустойчивость строится на избыточности. Всё, что важно для работы сайта, должно иметь запасной экземпляр.
База данных — самый чувствительный узел. Если она лежит на одном диске, и он выходит из строя, вы теряете все заказы, клиентов и историю. Поэтому базы переводят в режим, при котором данные одновременно записываются на несколько машин. Основной узел принимает записи, дублирующий — следит и готов подхватить управление в любой момент.
Файлы тоже должны копироваться. Если картинки товаров хранятся в одном месте и оно сгорает, каталог превращается в страницы с пустыми заглушками. Поэтому файловые системы настраиваются так, чтобы копии автоматически раскладывались по разным физическим устройствам.
Даже сервер-приёмщик дублируется. Если он один, его отказ оставляет сайт без «входной двери». Поэтому их ставят парами: один работает, второй следит за его состоянием и мгновенно подменяет при сбое.
Принцип третий: равномерное распределение запросов
Когда обработчиков несколько, нужно решить, кто из них будет отвечать конкретному посетителю. Для этого используется балансировщик — устройство или программа, которая стоит перед пулом серверов и раскладывает входящие запросы.
Работает это так. Посетитель открывает страницу. Его запрос попадает на балансировщик. Тот смотрит, какой из обработчиков сейчас наименее загружен, и направляет запрос туда. Следующего посетителя — на другой сервер, третьего — на третий. Никто не простаивает, никто не перегружается.
Если один из обработчиков перестает отвечать, балансировщик исключает его из очереди и перенаправляет всех входящих на оставшиеся машины. Посетитель при этом не замечает ничего: страница открывается как обычно.
Как это выглядит на практике
Опишем типовую схему, которую мы часто разворачиваем для растущих интернет-магазинов и сервисов.
На входе стоят два приёмщика-балансировщика. Они работают в паре: если первый выходит из строя, второй автоматически подхватывает его задачи. Сами посетители даже не знают, через какой узел проходит их запрос.
За приёмщиками — два или три обработчика. На них установлен движок сайта. Они выполняют программный код, формируют страницы, обрабатывают формы. Число обработчиков можно наращивать: если посещаемость растет, мы просто добавляем ещё одну машину в пул и включаем её в общую схему.
Данные лежат в отказоустойчивом хранилище. Основная база работает на одной машине, её точная копия — на второй. Записи идут в обе одновременно. Если основная выходит из строя, запасная становится главной за несколько секунд.
Файлы разложены на распределенном хранилище с избыточностью. Удаление или повреждение одной копии не приводит к потере данных, потому что они восстановятся из других экземпляров.
Что это дает бизнесу
Первое и главное — сайт не падает. Пиковый день распродажи, упоминание в новостях, наплыв покупателей в сезон — система выдерживает, потому что нагрузка распределяется.
Второе — данные не теряются. База заказов и клиентов защищена от выхода из строя оборудования на уровне архитектуры, а не только резервных копий, которые могут устареть.
Третье — скорость остается стабильной. Когда посетителей много, система просто задействует дополнительные мощности. Никто не ждет по пять секунд, пока страница соизволит открыться.
Четвертое — можно спокойно расти. Вы не боитесь запускать рекламную кампанию или подключать новые каналы привлечения, потому что знаете: инфраструктура справится.
Когда пора задуматься об отказоустойчивости
Однозначные сигналы:
- вы уже пережили хотя бы один заметный сбой, который стоил заказов;
- запускаете проект, где простой напрямую означает потерю выручки — интернет-магазин, платежный сервис, закрытый кабинет для клиентов;
- посещаемость нестабильна: бывают резкие всплески, которые обрушивают сервер;
- данные критичны, и их потеря недопустима.
Если хотя бы один пункт — про вас, пора проектировать архитектуру, а не надеяться, что в следующий раз повезет.
Что мы предлагаем
Мы не продаем «серверы под ключ» с типовым набором настроек. Мы проектируем и разворачиваем инфраструктуру под задачи конкретного бизнеса: оцениваем текущую нагрузку и перспективы роста, подбираем схему распределения, настраиваем дублирование баз и файлов, проверяем систему на устойчивость к сбоям.
После сдачи мы остаемся на связи: следим за состоянием машин, обновляем программное окружение, реагируем на сигналы о неполадках раньше, чем они станут проблемой для ваших клиентов.
Напишите нам. Расскажем, как перевести ваш проект на архитектуру, которая не боится ни нагрузок, ни отказов.