Новости
Семь Чёрных пятниц на неделе — и все в Serverspace!
Serverspace Black Friday
VB
29 октября 2022
Обновлено 30 мая 2023

Повышение отказоустойчивости сайта при помощи HAProxy и keepalived

Nginx Ubuntu Панель управления Сети

О чем вообще речь

Keepalived — это сервис, предназначенный для обеспечения безаварийной работы других служб. Нужно понимать, что это не самодостаточная сущность, и для предоставления доступа к «целевому» контенту необходим также или сервис-балансировщик. Далее в этой статье я покажу, как настроить связку «keepalived + HAProxy + webserver» на Ubuntu 20.04 LTS.

Подготовка

Перед установкой собственно keepalived необходимо провести ряд работ по подготовке инфраструктуры. Потребуются:

  • Два идентичных сервера для размещения контента проекта и два сервера, также одинаковых по характеристикам, для балансировщика haproxy и демона keepalived;
  • ОС Ubuntu 20.04 и привилегированные права на всех этих серверах;
  • Две подсети, одна общая и одна приватная. Контент-серверы из соображений безопасности не будут доступны через общедоступную подсеть, серверы балансировки должны быть подключены к обеим сетям;
  • Один дополнительный публичный IP-адрес в публичной подсети, не закрепленный явно за каким-либо из серверов;
  • Доменное имя, «направленное» на этот «дополнительный» IP.

Приступим к подготовке:

  • Создайте четыре сервера через личный кабинет ServerSpace. Все они должны быть размещены в одной локации;

pic1

  • Создайте две подсети в соответствии с описанием выше;

pic2

  • Подключите все серверы к созданным сетям. Затем переустановите на них ОС, это самый быстрый способ применить сетевые настройки без анализа и редактирования конфигурационных файлов;

pic4 pic5

  • Когда переустановка завершится, перейдите в личном кабинете в раздел Networks и кликните по названию каждой подсети. Вы увидите, какому серверу какой IP был назначен. Запомните эти данные, они понадобятся при дальнейшей настройке. Также держите в уме, что один неиспользуемый IP-адрес (45.14.48.134 в моем примере) будет использоваться как «плавающий» адрес для обеспечения отказоустойчивости;

pic6 pic7

  • Создайте набор правил брандмауэра, блокирующих любой трафик, поступающий на «конетент-серверы» через «публичный» интерфейс, кроме трафика из вашей подсети. Также стоит внести в белый список «внешний» IP вашего компьютера, это сделает управление серверами более комфортным. Самый простой способ достичь цели - кликнуть по имени первого сервера с контентом вашего проекта в панели ServerSpace, добавить правила файрволла и нажать кнопку SAVE. Помните, что «разрешающие» правила нужно ставить выше, чем правила блокировки;

pic8

  • Повторите те же действия для второго сервера, обслуживающего ваш проект
  • Добавьте в конец файла /etc/hosts на каждом из четырех серверов следующие строки:

<backend_server_one_IP> content1 content1.your.domain
<backend_server_two_IP> content2 content2.your.domain
<balancer_server_one_IP> haproxy1 haproxy1.your.domain
<balancer_server_two_IP> haproxy2 haproxy2.your.domain
<1st_floating_IP_for_keepalived> your.domain
<2nd_floating_IP_for_keepalived> your.domain

pic9

Настройка связки «веб-сервер, балансировщик и демон keepalived»

  • Разверните два идентичных экземпляра данных вашего проекта на оба контент-сервера. Так как моя статья создается в «учебных» целях, я просто установлю веб-сервер nginx с «тестовой страницей». Индексные файлы будут отличаться, просто чтобы проиллюстрировать работу программ и показать, что сервисы балансировки реально работают;
apt-get update; apt install -y nginx

echo $(hostname) > /var/www/html/index.nginx-debian.html # именно у вас путь может быть другим, тут указывается каталог сайта и индексный файл

  • Авторизуйтесь на первом сервере балансировки и установите пакет haproxy.
apt -y install haproxy

Отредактируйте файл конфигурации /etc/haproxy/haproxy.cfg, добавив следующие строки;

#frontend
#---------
frontend my_haproxy
bind *:80
stats uri /haproxy?stats
default_backend my_haproxy

# backend
#---------
backend my_haproxy
balance roundrobin
mode http
server content1 <1st_backend_server_private_IP>:80 check
server content2 <2nd_backend_server_private_IP>:80 check

  • Перезапустите службы haproxy
service haproxy restart
  • Одновременно запустите два сеанса терминала на вашем локальном компьютере и выполните следующие команды (по одной на окно):

while sleep 3; do curl http://<1st_balancer_public_IP>; done

while sleep 3; do curl http://<2nd_balancer_public_IP>; done

Если вы видите чередующиеся "ответы" в обоих окнах терминала - обе службы haproxy работают, можете переходить к следующему шагу;

pic12

  • Установите на оба сервера-балансировщика программный пакет keepalived:
apt install -y keepalived
  • Уточните имена «публичных» сетевых интерфейсов на обоих серверах;
ip a | grep <публичный_IP_сервера>

pic13

  • Вставьте в файл параметров конфигурации для демона keepalived на первом балансировщике следующий код:
nano /etc/keepalived/keepalived.conf

vrrp_instance MY_KEEPALIVED1 {
state MASTER
interface ens192
virtual_router_id 1
priority 11

virtual_ipaddress {
45.14.48.134/29 dev ens192 label ens192:1
}
}

pic14

Кратко опишу что они означают:

vrrp_instance - имя инстанса, любые символы без пробелов,

state - роль сервера, ведомый или ведущий

interface - имя сетевого интерфейса, вы уточнили его на предыдущем шаге,

virtual_router_id - идентификатор «виртуального роутера», должен быть одинаковым на всех серверах-балансировщиках,

priority - приоритет балансировщиков, чем выше цифра тем больше приоритет, самый высокий следует выставлять для «ведущего» сервера,

virtual_ipaddress - один IP в подсети, не назначенный ни одному из серверов. Именно на этот адрес нужно «направить» А-записи вашего домена.

  • По аналогии создайте файл конфигурации для второго сервера-балансировщика:

vrrp_instance MY_KEEPALIVED1 {
state SLAVE
interface ens192
virtual_router_id 1
priority 10

virtual_ipaddress {
45.14.48.134/29 dev ens192 label ens192:1
}
}

pic15

Обратите внимание на текст, в нем параметры «priority» и «state» поменялись местами, а всё остальное идентично.

  • Разрешите автозапуск и перезапустите сконфигурированные службы на обоих серверах балансировки;
systemctl enable haproxy && service haproxy restart; systemctl enable keepalived && service keepalived start

pic16

  • Проверьте статус. Запущенные службы отображаются так:
systemctl status haproxy && service keepalived status

pic17

Проверка работы балансировки и имитация аварии

  • Снова откройте терминал на своем компьютере и дайте следующую команду:

while sleep 5; do curl http://<ваш_домен>; done

Как видно, оба сервера контента работают и отвечают по очереди:

pic18

  • Остановите «главный» балансировщик;
systemctl stop haproxy && service keepalived stop
  • Видно, что «резервный» балансировщик повысил статус до ведущего, а контент продолжает доставляться без перебоев с обоих «контентных» серверов;

pic19

pic20

  • Теперь отключим один из серверов, содержащих контент;
service nginx stop

На скриншоте видно, что был буквально секундный обрыв связи, проект остался работоспособным, контент поступает со второй ноды;

pic21

  • Когда «сбойный» сервер возвращается в строй, его контент также «возвращается» незаметно для пользователей проекта;

pic22

  • И, наконец, если вернуть в строй «упавший» балансировщик, он снова берет на себя ведущую роль:
systemctl start haproxy && service keepalived start

pic23

Выводы

Прочитав этот материал, вы узнали, как построить отказоустойчивую инфраструктуру на базе nginx, haproxy и keepalived в Ubuntu 20 LTS.

Оценка:
5 из 5
Аverage rating : 5
Оценок: 1
050000 г. Алматы пр. Сейфуллина, д. 502
+7 (777) 555-36-66
ООО «ИТГЛОБАЛКОМ ЛАБС»