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.conf
: net.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ả.