Задача об отказоустойчивом построении сети - Академия Selectel

Задача об отказоустойчивом построении сети

Екатерина Низовцева
Екатерина Низовцева Архитектор сетевых сервисов
29 февраля 2024

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

Изображение записи

Условие

Представьте, что у вас есть два сервера, на которых расположен один и тот же сервис. Этот сервис имеет один IP-адрес. Есть master-нода и standby-нода.

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

Гораздо удобнее иметь обе включенные площадки в один момент времени и без перерыва переключать трафик с одной площадки на другую в случае аварии.

Задача

Реализуйте схему «горячего» резерва, то есть без выключения standby-ноды.

Схема горячего резерва.

Подсказка: используйте в этой схеме протокол динамической маршрутизации.

Решение

Необходимо с каждой ноды построить BGP-сессию с роутером и на standby-ноде добавить атрибут для BGP-сессии для ухудшения маршрута. Например, сделать бОльшую метрику (MED) или увеличить AS-Path, то есть воспользоваться AS-Path Prepend. Тем самым в один момент обе ноды будут анонсировать на роутер один и тот же префикс. Из-за ухудшенного маршрута, полученного роутером со standby-ноды, активным на роутере будет лишь один маршрут, где в качестве next-hop является master-нода. При падении master-ноды BGP-сессия перейдет в неактивное состояние, анонсирование префикса прекратится и активным на роутере станет маршрут, где в качестве next-hop выступает standby-нода. Причем данное переключение маршрута на standby-ноду будет выполнено без перерыва в связности.

Это не единственное решение задачи, но оно является самым отказоустойчивым и понятным.

Вариант реализации.
На изображении для ухудшения маршрута мы использовали AS-Path Prepend, то есть искусственно увеличили путь.

Полезные материалы для обучения