Softlayerに2つの仮想サーバーがあり、どちらもHAProxyを実行しています。キープアライブでフェイルオーバーを設定しようとしています。各サーバーにはプライベートIPとパブリックIPがあり、それらは同じVLAN上にあります。キープアライブのさまざまな設定を試しましたが、マスターで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はconfファイルが存在するサーバーのパブリックIPアドレスであり、PEERIPはピアのパブリックIPアドレスです。それでも動作していません。マスターでHAProxyを停止すると、バックアップにフェイルオーバーしません。
Softlayerでフェイルオーバーを使用してHAProxyをセットアップした人はいないのでしょうか。
私はなんとかこれを設定することができました、そしてこれが私がそれをした方法です:
SoftLayerのコントロール・パネルを使用してグローバルIPアドレスを作成しました。
両方のHAProxy仮想サーバーにDebian7があります。両方のサーバーのeth1インターフェイスにグローバルIPアドレスを追加しました。
両方のサーバーで使用される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
MASTERサーバーのキープアライブ設定は次のとおりです。
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
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
}
BACKUPサーバーのキープアライブ設定は次のとおりです。
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
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資格情報と一致するようにAPI_USERNAME/KEYを変更する必要があります。スクリプトは、SoftLayerグローバルIPアドレスから最初のグローバルIPを取得してから、グローバル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>
(フェイルオーバーが機能した場合は機能するはずです)