У меня есть 2 виртуальных сервера на Softlayer, оба работают с HAProxy. Я пытаюсь настроить аварийное переключение с помощью keepalived. У каждого сервера есть частный IP-адрес и общедоступный IP-адрес, и они находятся в одной VLAN. Я пробовал много разных настроек для keepalived, но остановка HAProxy на главном сервере не приводит к переключению на BACKUP.
Я читал, что многоадресная рассылка не поддерживается, поэтому с тех пор я изменил свои настройки на одноадресную. Теперь настройки для резервного копирования / главного сервера в основном следующие:
vrrp_script chk_haproxy {
script "pidof haproxy"
interval 2
}
vrrp_instance VI_1 {
debug 2
interface eth1
state MASTER
virtual_router_id 51
priority 101
unicast_src_ip 1.2.3.4 # My IP
unicast_peer {
5.6.7.8 # peer IP
}
track_script {
chk_haproxy
}
}
Где MYIP - это общедоступный IP-адрес сервера, на котором находится файл conf, а PEERIP - это общедоступный IP-адрес однорангового узла. Тем не менее это не работает. Остановка HAProxy на главном сервере не приводит к переключению на резервную копию.
Мне интересно, настроил ли кто-нибудь HAProxy с аварийным переключением на Softlayer, и как они это сделали?
Мне удалось это настроить, и вот как я это сделал:
Я создал глобальный IP-адрес с помощью панели управления SoftLayer.
У меня Debian 7 установлен на обоих виртуальных серверах HAProxy. Я добавил глобальный IP-адрес в интерфейс eth1 на обоих серверах.
Вот настройки HAProxy, используемые на обоих серверах:
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 4096
user haproxy
group haproxy
defaults
log global
mode http
option httplog
option dontlognull
retries 3
maxconn 2000
option redispatch
timeout connect 5000
timeout client 50000
timeout server 50000
stats uri / haproxy
listen webfarm 0.0.0.0:80
mode http
stats enable
stats uri /haproxy?stats
stats realm Haproxy\ Statistics
stats auth haproxy:stats
balance roundrobin
cookie LBN insert indirect nocache
option httpclose
option forwardfor
server app1-west <public_ip>:8080 cookie node1 check
server app2-west <public_ip>:8080 cookie node2 check
Вот настройки Keepalived на MASTER сервере:
global_defs {
notification_email {
admin@mydomain.com
}
notification_email_from me@me.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LB_MASTER_ACTIVE
}
# Define the script used to check if haproxy is still working
vrrp_script chk_haproxy {
script "killall -0 haproxy" # verify the pid existance
interval 2 # check every 2 seconds
weight 2 # add 2 points of prio if OK
}
# Virtual interface.
vrrp_instance VI_1 {
state MASTER
interface eth1
virtual_router_id 51
priority 101
smtp_alert
authentication {
auth_type PASS
auth_pass 1111 #replace with random string
}
vrrp_unicast_bind <my_private_ip>
vrrp_unicast_peer <peers_private_ip>
# Check if HAProxy is running or not.
track_script {
chk_haproxy
}
notify_master /usr/bin/reroute_global
}
Вот настройки Keepalived на сервере BACKUP:
global_defs {
notification_email {
admin@mydomain.com
}
notification_email_from me@me.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LB_BACKUP_PASSIVE
}
# Define the script used to check if haproxy is still working
vrrp_script chk_haproxy {
script "killall -0 haproxy" # verify the pid existance
interval 2 # check every 2 seconds
weight 2 # add 2 points of prio if OK
}
# Virtual interface.
vrrp_instance VI_1 {
state BACKUP
interface eth1
virtual_router_id 51
priority 100
smtp_alert
advert_int 1
authentication {
auth_type PASS
auth_pass 1111 #replace with random string
}
vrrp_unicast_bind <my_private_ip>
vrrp_unicast_peer <peers_private_ip>
# Check if HAProxy is running or not.
track_script {
chk_haproxy
}
notify_master /usr/bin/reroute_global
}
Как сказано выше, я использую Debian 7. Как видно из настроек keepalived, у меня есть скрипт notify_master. Вот все, что нужно для запуска скрипта:
apt-get install cpanminus libssl-dev build-essential libxml2-dev libexpat1-dev
cpanm SOAP::Lite XML::Hash::LX IO::Interface
git clone https://github.com/softlayer/softlayer-api-perl-client.git
mv softlayer-api-perl-client/SoftLayer /usr/share/perl5
Теперь, когда все зависимости установлены, сценарий должен работать. Вот сценарий, который я сохранил как /usr/bin/reroute_global
:
#!/usr/bin/env perl
use strict;
use warnings;
use SoftLayer::API::SOAP;
use IO::Interface::Simple;
# SoftLayer API Information
my $api_user = 'YOUR_API_USERNAME';
my $api_key = 'YOUR_API_KEY';
# Get the IP address associated with eth1
my $if = IO::Interface::Simple->new('eth1');
# Create client object to SoftLayer_Account
my $client = SoftLayer::API::SOAP->new('SoftLayer_Account', undef, $api_user, $api_key);
# Get global IP address ID of first global IP address.
my $global_ip_id = $client->getGlobalIpRecords()->result->[0]->{id};
# Create client object to SoftLayer_Network_Subnet_IpAddress_Global
$client = SoftLayer::API::SOAP->new('SoftLayer_Network_Subnet_IpAddress_Global', $global_ip_id, $api_user, $api_key);
# Reroute global IP address to this systems public IP
$client->route($if->address);
Вам нужно будет изменить API_USERNAME / KEY в соответствии с вашими учетными данными API. Сценарий берет первый глобальный IP-адрес с ваших глобальных IP-адресов SoftLayer, а затем перенаправляет глобальный IP-адрес в систему. В случае аварийного переключения BACKUP становится MASTER и запускает сценарий, который направляет глобальный IP-адрес самому себе.
curl http://<global_IP>
service haproxy stop
При резервном копировании: tail -f /var/log/syslog
. Вы должны увидеть что-то вроде этого:
Feb 12 01:11:55 proxy2-west Keepalived_vrrp[11816]: VRRP_Script(chk_haproxy) succeeded
Feb 12 01:11:55 proxy2-west Keepalived_vrrp[11816]: SMTP alert successfully sent.
Feb 12 01:12:29 proxy2-west Keepalived_vrrp[11816]: VRRP_Instance(VI_1) forcing a new MASTER election
Feb 12 01:12:29 proxy2-west Keepalived_vrrp[11816]: VRRP_Instance(VI_1) forcing a new MASTER election
Feb 12 01:12:30 proxy2-west Keepalived_vrrp[11816]: VRRP_Instance(VI_1) Transition to MASTER STATE
Feb 12 01:12:31 proxy2-west Keepalived_vrrp[11816]: VRRP_Instance(VI_1) Entering MASTER STATE
Feb 12 01:12:31 proxy2-west Keepalived_vrrp[11816]: Opening script file /usr/bin/reroute_global
curl http://<global_IP>
(он должен работать, если отработка отказа сработала)