Назад | Перейти на главную страницу

Softlayer HAProxy с аварийным переключением

У меня есть 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, и как они это сделали?

Мне удалось это настроить, и вот как я это сделал:

  1. Я создал глобальный IP-адрес с помощью панели управления SoftLayer.

  2. У меня Debian 7 установлен на обоих виртуальных серверах HAProxy. Я добавил глобальный IP-адрес в интерфейс eth1 на обоих серверах.

  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. Вот настройки 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
    }
    
  5. Вот настройки 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
    }
    
  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_USERNAME / KEY в соответствии с вашими учетными данными API. Сценарий берет первый глобальный IP-адрес с ваших глобальных IP-адресов SoftLayer, а затем перенаправляет глобальный 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> (он должен работать, если отработка отказа сработала)