30.05.2023

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

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

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

Подготовка

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

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

<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

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

apt-get update; apt install -y nginx

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

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

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 работают, можете переходить к следующему шагу;

apt install -y keepalived
ip a | grep <публичный_IP_сервера>

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
}
}

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

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
}
}

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

systemctl enable haproxy && service haproxy restart; systemctl enable keepalived && service keepalived start

systemctl status haproxy && service keepalived status

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

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

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

systemctl stop haproxy && service keepalived stop

service nginx stop

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

systemctl start haproxy && service keepalived start

Выводы

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