• Install HAProxy and Keepalived (Virtual IP)

  • To avoid a single point of failure with your HAProxy. One would set up two identical HAProxy instances (one active and one standby) and use Keepalived to run VRRP between them. VRRP provides for you a virtual IP address to the active HAProxy, and transfers the Virtual IP to the standby HAProxy in case of failure. This is seamless because the two HAProxy instances need no shared state.

  • Sunday, 26 July 2015, 05:06:43 PM
  • Install HAProxy and Keepalived (Virtual IP)
  • In this example, we are using 2 nodes to act as the load balancer with IP failover in front of our database cluster. VIP will be floating around between LB1 (master) and LB2 (backup). When LB1 is down, the VIP will be taking over by LB2 and once the LB1 up again, the VIP will be failback to LB1 since it hold the higher priority number.

    We are using following hosts/IPs:

    VIP: 192.168.10.100

    LB1: 192.168.10.101

    LB2: 192.168.10.102

    DB1: 192.168.10.111

    DB2: 192.168.10.112

    DB3: 192.168.10.113

    ClusterControl: 192.168.10.115

    You may refer to following diagram for the architecture:

    Install HAproxy

    1. Login into ClusterControl node to perform this installation. We have built a script to deploy HAproxy automatically which is available under our Git repository https://github.com/severalnines/s9s-admin. Navigate to the installation directory which you used to deploy the database cluster and clone the repo:

    $ cd /root/s9s-galera-2.2.0/mysql/scripts/install

    $ git clone https://github.com/severalnines/s9s-admin.git

    2. Before we start to deploy, make sure LB1 and LB2 are accessible using passwordless SSH. Copy the SSH keys to the load balancer nodes:

    $ ssh-copy-id -i ~/.ssh/id_rsa 192.168.10.101

    $ ssh-copy-id -i ~/.ssh/id_rsa 192.168.10.102

    3. Install HAproxy into both nodes:

    ./s9s-admin/cluster/s9s_haproxy --install -i 1 -h 192.168.10.101

    ./s9s-admin/cluster/s9s_haproxy --install -i 1 -h 192.168.10.102

    4. You will noticed that these 2 load balancer nodes have been installed and provisioned by ClusterControl. You can verify this by login into ClusterControl > Nodes and you should see similar screenshot as below:

    haproxy.png

    Install Keepalived

    Following steps should be performed in LB1 and LB2 accordingly.

    1. Install Keepalived package:

    On RHEL/CentOS:

    $ yum install -y centos-release

    $ yum install -y keepalived

    $ chkconfig keepalived on

    On Debian/Ubuntu:

    $ sudo apt-get install -y keepalived

    $ sudo update-rc.d keepalived defaults

    2. Tell kernel to allow binding non-local IP into the hosts and apply the changes:

    $ echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf

    $ sysctl -p

    Configure Keepalived and Virtual IP

    1. Login into LB1 and add following line into /etc/keepalived/keepalived.conf:

    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
    }
     
    vrrp_instance VI_1 {
       interface eth0                  # interface to monitor
       state MASTER
       virtual_router_id 51          # Assign one ID for this route
       priority 101                     # 101 on master, 100 on backup
       virtual_ipaddress { 
           192.168.10.100           # the virtual IP
       }
       track_script {
           chk_haproxy
       }
    }

    2. Login into LB2 and add following line into /etc/keepalived/keepalived.conf:

    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
    }
     
    vrrp_instance VI_1 {
       interface eth0                  # interface to monitor
       state MASTER
       virtual_router_id 51          # Assign one ID for this route
       priority 100                     # 101 on master, 100 on backup
       virtual_ipaddress { 
           192.168.10.100           # the virtual IP
       }
       track_script {
           chk_haproxy
       }
    }

     

    3. Start Keepalived in both nodes:

    $ sudo /etc/init.d/keepalived start

    4. Verify the Keepalived status. LB1 should hold the VIP and the MASTER state while LB2 should run as BACKUP state without VIP:

    LB1 IP:

    $ ip a | grep -e inet.*eth0
     inet 192.168.10.101/24 brd 192.168.10.255 scope global eth0
     inet 192.168.10.100/32 scope global eth0

    LB1 Keepalived state:

    $ cat /var/log/messages | grep VRRP_Instance
    Apr 19 15:47:25 lb1 Keepalived_vrrp[6146]: VRRP_Instance(VI_1) Transition to MASTER STATE
    Apr 19 15:47:25 lb1 Keepalived_vrrp[6146]: VRRP_Instance(VI_1) Entering MASTER STATE

    LB2 IP:

    $ ip a | grep -e inet.*eth0
     inet 192.168.10.102/24 brd 192.168.10.255 scope global eth0

    LB2 Keepalived state:

    $ cat /var/log/messages | grep VRRP_Instance
    Apr 19 15:47:25 lb2 Keepalived_vrrp[6146]: VRRP_Instance(VI_1) Transition to MASTER STATE
    Apr 19 15:47:25 lb2 Keepalived_vrrp[6146]: VRRP_Instance(VI_1) Received higher prio advert
    Apr 19 15:47:25 lb2 Keepalived_vrrp[6146]: VRRP_Instance(VI_1) Entering BACKUP STATE

    *Debian/Ubuntu: Under some distributions /var/log/messages might be missing , try to find the similar log under /var/log/syslog.

    Installation completed! You can now access your database servers through VIP, 192.168.10.100 port 33306.

    (Source: http://support.severalnines.com/)