Haproxy Keepalived

Để tránh điểm chết ở nút cổ chai khi sử dụng HAProxy để hệ thống có tính sẵn sàng cao và cân bằng tải. Ta sẽ triển khai hai node HAProxy (mô hình active/standby) và sử dụng Keepalived để chạy VRRP giữa chúng. VRRP cung cấp một địa chỉ IP ảo để khởi động HAProxy-active, và trong trường hợp lỗi sẽ tự động chuyển đổi IP ảo sang HAProxy-standby.

Trong ví dụ này, chúng ta sử dụng 2 node hoạt động như là load balancer với IP chuyển đổi dự phòng ở phía trước của cụm máy chủ cơ sở dữ liệu. VIP sẽ trỏ động giữa LB1(master) và LB2(backup). Khi LB1 chết, VIP sẽ được tiếp quản bởi LB2 và khi LB1 sống lại, VIP sẽ được trả lại cho LB1 do nó có số ưu tiên cao hơn.

Chúng ta sử dụng các địa chỉ IPs/hosts sau:

VIP: 192.168.10.100
LB1: 192.168.10.101
LB2: 192.168.10.102

DB1: 192.168.10.1
DB2: 192.168.10.100
DB3: 192.168.10.100

Kiến trúc triển khai hệ thống như sau đây:

Haproxy Keepalived

Cài đặt HAProxy

Các bước sau đây được thực hiện trên LB1 và LB2

On Debian/Ubuntu:

sudo apt-get update
sudo apt-get install haproxy

On RHEL/CentOS:

...

Cài đặt Keepalived

Các bước sau đây được thực hiện trên LB1 và LB2

1. Cài đặt gói Keepalived trên Repo

On Debian/Ubuntu:

$ sudo apt-get install -y keepalived
$ sudo update-rc.d keepalived defaults 

On RHEL/CentOS:

$ yum install -y centos-release
$ yum install -y keepalived
$ chkconfig keepalived on 

2. Báo với Kernel cho phép binding non-local IP vào hosts và apply các thay đổi

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

Cấu hình Keepalived và Virtual IP

1. Đăng nhập LB1 và thêm cấu hình vào file  /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. Đăng nhập LB2 và cấu hình tương tự như trên

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. Khởi chạy Keepalived trên cả 2 node.

$ sudo /etc/init.d/keepalived start

4. Kiểm tra trạng thái của Keepalived. Tại thời điểm này, LB1 sẽ tiếp quản VIP và trạng thái của nó là  MASTER , LB2 sẽ có trạng thái là  BACKUP  mà không cần 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

LB1 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: Có thể log sẽ nằm ở /var/log/messages hoặc /var/log/syslog

Ok, quá trình cài đặt hoàn tất! Giờ ta có thể truy cập máy chủ dữ liệu qua VIP, 192.168.10.100 port 33306

About The Author

  • Trung Nguyen

    Anh cho em hỏi con ClusterControl trên hình để quản lý những gì vậy, và dùng công cụ nào để quản lý vậy ạ