Как создать Плавающий IP и использовать его для настройки HAProxy
Недавно я попытался сбалансировать загрузку моего приложения с помощью HAProxy и смог сделать это успешно. Позже я натолкнулся на концепцию под названием "Плавающий IP", которая может использоваться вместе с keepalived для обеспечения высокой доступности балансировщика нагрузки. Я не смог понять, как создать плавающий Ip. Как я могу создать Плавающий IP и использовать его для настройки HAProxy? Благодарю.
2 ответа
Предположения:
- Это работает на Ubuntu 14.04
- первичный IP-адрес: 198.51.100.10
- haproxy-вторичный IP: 198.51.100.20
- общий IP: 198.51.100.50
- Любые правила DNS должны указывать на общий IP (198.51.100.50)
шаги:
- Добавьте правило брандмауэра для keepalived # 224.0.0.18 - это адрес многоадресной рассылки keepalived
sudo ufw allow in from 198.51.100.20 to 224.0.0.18
№ на 198.51.100.10sudo ufw allow in from 198.51.100.10 to 224.0.0.18
№ на 198.51.100.20
- Разрешить доступ к общему IP-адресу
- редактировать
/etc/sysctl.conf
- задавать
net.ipv4.ip_nonlocal_bind=1
sudo sysctl -p
# перезагрузить изменение конфигурации
- редактировать
- Установить keepalived
sudo apt-get install keepalived
- Настройте keepalived на обоих серверах
- Редактировать / создать
/etc/keepalived/keepalived.conf
- Смотрите пример файла ниже # приоритет ДОЛЖЕН быть разным на первичном и вторичном серверах!
- Редактировать / создать
- Restart keepalived
- перезапуск службы поддержки sudo
- Слушайте на общем IP-адресе
- редактировать
/etc/haproxy/haproxy.cfg
bind 198.51.100.50:80
- редактировать
- Перезапустите haproxy (на обоих haproxy-серверах)
sudo service haproxy restart
- Проверьте правильность отработки отказа
- первичная:
sudo ip addr show | grep eth0
# должен перечислить общий IP - вторичный:
sudo ip addr show | grep eth0
# НЕ должен перечислять общий IP - первичная:
sudo service haproxy stop
- первичная:
sudo ip addr show | grep eth0
# НЕ должен перечислять общий IP - вторичный:
sudo ip addr show | grep eth0
# должен перечислить общий IP - первичная:
sudo service haproxy start
- первичная:
sudo ip addr show | grep eth0
# должен перечислить общий IP - вторичный:
sudo ip addr show | grep eth0
# НЕ должен перечислять общий IP
- первичная:
/etc/keepalived/keepalived.conf
vrrp_script chk_haproxy { # Requires keepalived-1.1.13
script "killall -0 haproxy" # cheaper than pidof
interval 2 # check every 2 seconds
weight 2 # add 2 points of priority if OK
}
vrrp_instance VI_1 {
interface eth0
state MASTER
virtual_router_id 51
priority 101 # 101 on primary, 100 on secondary
virtual_ipaddress {
198.51.100.50
}
track_script {
chk_haproxy
}
}
Ответ от Matt Rice отличный, но имейте в виду, что если вы используете принудительное исполнение SELinux в Red Hat EL 7, вам понадобится
sudo setsebool haproxy_connect_any on
... или haproxy не запустится в системе, которая в настоящее время не имеет виртуального ip-адреса, с жалобой на невозможность привязки.