Bài viết này giải thích làm thế nào để thiết lập một cân bằng tải với HAProxy và keepalived trên Centos 6.5. Bộ cân bằng tải ngồi giữa người sử dụng và hai (hoặc nhiều hơn) các máy chủ web Apache phụ trợ mà giữ cùng một nội dung. Không chỉ thực hiện cân bằng tải phân phối các yêu cầu đến hai máy chủ Apache phụ trợ, nó cũng kiểm tra sức khỏe của các máy chủ phụ trợ. Nếu một trong số họ là xuống, tất cả các yêu cầu sẽ tự động được chuyển hướng đến các máy chủ phụ trợ còn lại. Bên cạnh đó, hai nút cân bằng tải theo dõi nhau bằng cách sử dụng keepalived, và nếu Máy chủ không hoạt động, các máy backup sẽ trở thành máy chủ thay thế, có nghĩa là người dùng sẽ không nhận thấy bất kỳ sự gián đoạn của dịch vụ. HAProxy là session-aware, có nghĩa là bạn có thể sử dụng nó với bất kỳ ứng dụng web mà làm cho việc sử dụng các phiên giao dịch (như diễn đàn,cửa hàng mua sắm, vv ).

Sau đây AdminVietnam.org sẽ hướng dẫn các bạn cài đặt và cấu hình hệ thống HAProxy và Keepalived

Sơ đồ mạng như sau

Đang tải

  • Load Balancer 1: lb1.adminvietnam.org, IP address: 192.168.11.130
  • Load Balancer 2: lb2.adminvietnam.org, IP address: 192.168.11.131
  • Web Server 1: server.adminvietnam.org, IP address: 192.168.11.128
  • Web Server 2: server2.adminvietnam.org, IP address: 192.168.11.129
  • Chúng ta cũng cần một địa chỉ IP ảo giữa lb1 và lb2: 192.168.11.132

Cách cấu hình hai máy web server các bạn có thể tham khảo bài viết sau đây 

  1. Cấu hình Keepalived

Trên cả hai máy:

# wget  http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm –ivh  epel-release-6-8.noarch.rpm 
# yum install keepalived -y

Để cho phép HAProxy để ràng buộc vào các địa chỉ IP được chia sẻ, chúng ta thêm dòng sau vào /etc/sysctl.conf :

# vi /etc/sysctl.conf

thêm vào file dòng sau:

[...]
net.ipv4.ip_nonlocal_bind=1

kiểm tra

# sysctl -p
  • Tiếp theo chúng ta phải cấu hình keepalived (điều này được thực hiện thông qua các tập tin /etc/keepalived/keepalived.conf cấu hình). Tôi muốn LB1 là máy chính (master) cân bằng tải, vì vậy chúng tôi cấu hình như sau trên LB1:

LB1:

# vi /etc/keepalived/keepalived.conf
vrrp_script chk_haproxy {           # Requires keepalived-1.1.13
        script "killall -0 haproxy"     
        interval 2                      # Kiểm tra 2 giây/1 lần
        weight 2                        # Thêm vào 2 điểm của prio
}

vrrp_instance VI_1 {
        interface eth0
        state MASTER
        virtual_router_id 51
        priority 101                    # 101 on master, 100 on backup
        virtual_ipaddress {
            192.168.11.132              # Địa chỉ IP ảo giữa LB1 và LB2
        }
        track_script {
            chk_haproxy
        }
}
# service keepalived start
  • Chúng ta kiểm tra xem máy LB1 đã nhận IP ảo bằng lệnh:
# ip a

Kết quả

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 inet 127.0.0.1/8 scope host lo
 inet6 ::1/128 scope host
 valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
 link/ether 00:0c:29:78:1c:7b brd ff:ff:ff:ff:ff:ff
 inet 192.168.11.130/24 brd 192.168.11.255 scope global eth0
 inet 192.168.11.132/32 scope global eth0
 inet6 fe80::20c:29ff:fe78:1c7b/64 scope link
 valid_lft forever preferred_lft forever
3: pan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN
 link/ether 12:90:5b:ba:7b:0d brd ff:ff:ff:ff:ff:ff
  • Bây giờ chúng ta làm gần như giống nhau về LB2. Có một sự khác biệt nhỏ trong /etc/keepalived/keepalived.conf :

LB2

# vi /etc/keepalived/keepalived.conf
vrrp_script chk_haproxy {           # Requires keepalived-1.1.13
        script "killall -0 haproxy"     
        interval 2                      # Kiểm tra 2 giây/1 lần
        weight 2                        # Thêm vào 2 điểm của prio
}

vrrp_instance VI_1 {
        interface eth0
        state BACKUP
        virtual_router_id 51
        priority 100                    # 101 on master, 100 on backup
        virtual_ipaddress {
            192.168.11.132              # Địa chỉ IP ảo giữa LB1 và LB2
        }
        track_script {
            chk_haproxy
        }
}
# service keepalived start

2. Cấu hình HAProxy ( cấu hình chia sẽ tải)

LB1:

# yum install haproxy -y
# vi /etc/haproxy/haproxy.cfg
  • xóa hết nội dung trong đó và thêm vào nội dung như sau:
listen http_proxy
bind 192.168.11.132:80                    # IP ảo giữa LB1 va LB2
mode http                                 # chế độ HTTP
stats enable
stats auth root:123456           # tài khoản và mật khẩu để vào haproxy phân tíchbalance roundrobin
backlog 2048
option httpclose
option forwardfor
timeout connect 10000
timeout client 30000
timeout server 30000
timeout queue 30000
maxconn 4000
option httpchk
option abortonclose
server web1 192.168.11.128:80 cookie web1 check
server web2 192.168.11.129:80 cookie web2 check
# service haproxy start
# chkconfig haproxy on

LB2: Tương tự

3. Kiểm tra

Trên Client vào địa chỉ:

http://192.168.11.132/haproxy?stats

Đang tải

  • Cả hai máy web server đều đang hoạt động. Ta vào địa chỉ http://192.168.11.132 sẽ thấy máy server 1 đang hoạt động !

Đang tải

  • Ta thử tắt máy Web server 1 đi và kiểm tra lại sẽ thấy máy Web server 2 sẽ hoạt động thay cho máy 1 bị hư !

4 5

Nguyễn Hoàng Anh – AdminVietnam.org