web-dev-qa-db-ja.com

フェイルオーバーを備えたSoftlayerHAProxy

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をセットアップした人はいないのでしょうか。

1
Franz Kafka

私はなんとかこれを設定することができました、そしてこれが私がそれをした方法です:

  1. SoftLayerのコントロール・パネルを使用してグローバルIPアドレスを作成しました。

  2. 両方のHAProxy仮想サーバーにDebian7があります。両方のサーバーのeth1インターフェイスにグローバルIPアドレスを追加しました。

  3. 両方のサーバーで使用される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 
    
  4. 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
    }
    
  5. 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
    }
    
  6. 上で述べたように、私は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
    
  7. すべての依存関係が整ったので、スクリプトは機能するはずです。 /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アドレスをそれ自体にルーティングします。

テスト

  1. curl http://<global_IP>
  2. マスターサーバーでは、service haproxy stop
  3. バックアップ時: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
    
  4. curl http://<global_IP>(フェイルオーバーが機能した場合は機能するはずです)
5
Franz Kafka