[High Available] Sử dụng Keepalived (kết nối dự phòng) kết hợp với haproxy (cân bằng tải).



Hoàng Hải Triều / 20-08-2018

Như ở bài trước ta có sử dụng cân bằng tải để tăng tốc độ xử lý của web server. Thuật toán Round robin có vẻ giống như một kết nối dự phòng trong trường hợp web server này chết thì sẽ sử dụng web server khác. Tuy nhiên mục đích chính của cân bằng tải vẫn là đảm bảo sự ổn định của web server. Trong bài này, chúng ta sẽ thiết lập kết nối dự phòng trong trường hợp nếu một web server chết sẽ sử dụng web server khác để thực hiện.

 

Sau đây là cách thiết lập kết nối dự phòng kết hợp với cân bằng tải.

Yêu cầu chuẩn bị:

  • Web Server 1
    OS: CentOS 7 + Nginx + haproxy + keepalived
    IP web server: 192.168.1.129:8080
    IP haproxy: 192.168.1.129:80
  • Web Server 2
    OS: CentOS 6+ Nginx + haproxy + keepalived
    IP web server: 192.168.1.128:8080
    IP haproxy: 192.168.1.128:80

Cài đặt keepalived bằng lệnh ở cả 2 webserver: yum install keepalived

Dịch vụ Keepalived sẽ giúp chúng ta tạo 1 Virtual IP để dùng cho máy chủ, nói một cách nôm na là máy chủ sẽ sử dụng IP do chúng ta tự định nghĩa bằng Keepalived chứ không phải dùng IP trên interface của máy chủ (được cấp bởi 1 DHCP nào đó hay do chúng ta tự gán.). Để làm việc này, chúng ta cần vào file /etc/sysctl.conf và thêm hoặc sửa dòng sau vào file sysctl.confnet.ipv4.ip_nonlocal_bind=1

Trên Web Server 1 ta cấu hình file /etc/keepalived/keepalived.conf như sau:


global_defs {
router_id test1 #khai báo route_id của keepalived
}
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight 2
}
vrrp_instance VI_1 {
virtual_router_id 51
advert_int 1
priority 100
state MASTER
interface ens33 #thông tin tên interface của server, bạn dùng lệnh `ifconfig` để xem và điền cho đúng
virtual_ipaddress {
192.168.1.69 dev ens33 #Khai báo Virtual IP cho interface tương ứng
}
authentication {
auth_type PASS
auth_pass 123456 #Password này phải khai báo giống nhau giữa các server keepalived
}
track_script {
chk_haproxy
}
}

 

Trên Web Server 2 ta cấu hình file /etc/keepalived/keepalived.conf như sau:


global_defs {
router_id test2 #khai báo route_id của keepalived
}
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight 2
}
vrrp_instance VI_1 {
virtual_router_id 51
advert_int 1
priority 99
state BACKUP
interface eth0 #thông tin tên interface của server, bạn dùng lệnh `ifconfig` để xem và điền cho đúng
virtual_ipaddress {
192.168.1.69 dev eth0 #Khai báo Virtual IP cho interface tương ứng
}
authentication {
auth_type PASS
auth_pass 123456 #Password này phải khai báo giống nhau giữa các server keepalived
}
track_script {
chk_haproxy
}
}

Trong file cấu hình Keepalived trên của 2 máy test1 và test2 đều có track_script – có nghĩa là cả 2 server đều sẽ tiến hành chạy đoạn script check trạng thái của dịch vụ process ID (PID) được khai báo trong script ( ở đây khai báo check service haproxy). Giả sử service haproxy trên test1 (được khởi tạo ban đầu với state MASTER và priotiry 100) vì một lý do nào đó không hoạt động, Keepalived sẽ trừ trọng số (priority 100-2=98) trên máy test1. Lúc này priority của test1 sẽ là 98 và nhỏ hơn priority=99 được khai báo ban đầu ở test2 , do đó Keepalived sẽ chuyển trạng thái của test2 từ BACKUP thành MASTER và test2 sẽ được giữ VIP đã khai báo.

Config haproxy Web Server 1:

global
daemon
maxconn 256

defaults
 mode http
 timeout connect 5000ms
 timeout client 50000ms
 timeout server 50000ms

 stats enable
 stats hide-version
 stats refresh 30s
 stats show-node
 stats auth admin:123456
 stats uri /haproxy?stats
frontend http-in
 bind *:80
 default_backend servers

backend static
 balance roundrobin
 server static 192.168.1.69:80

backend servers
 balance roundrobin
 server webserver1 192.168.1.128:8080 check
 server webserver2 192.168.1.129:8080 check

Config haproxy Web Server 2:

global
daemon
maxconn 256

defaults
 mode http
 timeout connect 5000ms
 timeout client 50000ms
 timeout server 50000ms

 stats enable
 stats hide-version
 stats refresh 30s
 stats show-node
 stats auth admin:123456
 stats uri /haproxy?stats
frontend http-in
 bind *:80
 default_backend servers

backend static
 balance roundrobin
 server static 192.168.1.69:80

backend servers
 balance roundrobin
 server webserver1 192.168.1.128:8080 check
 server webserver2 192.168.1.129:8080 check

Chạy lệnh service keepalived start đối với CentOS 6, systemctl start keepalived đối với CentOS 7.
Lần lượt tắt haproxy để xem kết quả.


to-top