HAProxy viết tắt (High Availability Proxy) là phần mềm mã nguồn mở, cung cấp dịch vụ cân bằng tải, proxy cho TCP/HTTP dựa trên request người dùng. HAProxy hiện đã và đang được sử dụng bởi nhiều website lớn như GoDaddy, GitHub, Bitbucket, Stack Overflow, Reddit, Speedtest.net, Twitter và trong nhiều sản phẩm cung cấp bởi Amazon Web Service.
Khái Quát:
Load balancing ( Cân bằng tải ) là kỹ thuật phân phối tải trên các web site có lượng truy cập cao. Giải pháp hỗ trợ việc tối ưu hóa tài nguyên, tăng sự đảm bảo, giảm độ trễ trên hệ thống.
Các thuật toán cân bằng tải cơ bản:
- Round Robin: Các Request phân phối tuần tự tới các server, phương thức được sử dụng mặc định.
- Least Connection: Request phân phối tới server có số kết nối tới ít nhất.
- IP Hash: Lựa chọn Kết nối tới server bằng IP kết nối tới, tức IP A sẽ luôn kết nối tới server A trừ khi server A xảy ra sự cố.
Nếu một server đơn lẻ bị hỏng, cân bằng tải (load balancer) sẽ chuyển hướng lưu lượng truy cập đến các server trực tuyến còn lại. Khi một server mới được thêm vào nhóm máy chủ, bộ cân bằng tải sẽ tự động bắt đầu gửi yêu cầu đến máy chủ mới thêm này.
Mô Hình:
Yêu Cầu:
I. Thiết Lập Ban Đầu
A. LoadBalancer
-Thiết lập hostname trên Server và cập nhật hệ thống:
[root@loadbalancer ~]# hostnamectl set-hostname loadbalancer
[root@loadbalancer ~]# yum update -y
-Tắt SELinux và mở port 8080:
1.Tắt SELinux
*Tìm kiếm SELINUX=enforcing
thay thế bằng SELINUX=disabled
trên 2 file config vs selinux. (Nếu có sẵn là SELINUX=disabled rồi thì không cần thay đổi gì)
[root@loadbalancer ~]# vi /etc/selinux/config
[root@loadbalancer ~]# vi /etc/sysconfig/selinux
2.Mở port 8080
[root@loadbalancer ~]# service firewalld start
[root@loadbalancer ~]# firewall-cmd --permanent --zone=public --add-port=8080/tcp
[root@loadbalancer ~]# firewall-cmd --reload
-Cấu hình file hosts:
[root@loadbalancer ~]# vi /etc/hosts
Thêm 3 IP + hostname của 3 Server.
-Khởi động lại hệ thống:
[root@loadbalancer ~]# init 6
B. Web 01 vs Web 02
-Thiết lập hostname trên Server và cập nhật hệ thống:
[root@loadbalancer ~]# hostnamectl set-hostname web01
[root@loadbalancer ~]# hostnamectl set-hostname web02
[root@loadbalancer ~]# yum update -y
-Tắt SELinux:
*Tìm kiếm SELINUX=enforcing
thay thế bằng SELINUX=disabled
trên 2 file config vs selinux. (Nếu có sẵn là SELINUX=disabled rồi thì không cần thay đổi gì)
[root@loadbalancer ~]# vi /etc/selinux/config
[root@loadbalancer ~]# vi /etc/sysconfig/selinux
-Cấu hình file hosts:
[root@loadbalancer ~]# vi /etc/hosts
Thêm 3 IP + hostname của 3 Server. (Cả 2 web server sửa file hosts giống nhau)
-Khởi động lại hệ thống:
[root@loadbalancer ~]# init 6
II. Cài Đặt
A. LoadBanlancer cài đặt HAProxy phiên bản 1.8
HAProxy mặc đinh tại origin yum repo là 1.5, để sử dụng phiển bản 1.8 chúng ta sẽ cài từ RPM tùy chọn
-Cài đặt:
[root@loadbalancer ~]# yum install wget socat -y
[root@loadbalancer ~]# wget http://cbs.centos.org/kojifiles/packages/haproxy/1.8.1/5.el7/x86_64/haproxy18-1.8.1-5.el7.x86_64.rpm
[root@loadbalancer ~]# yum install haproxy18-1.8.1-5.el7.x86_64.rpm -y
-Tạo backup cho cấu hình mặc định và chỉnh sửa cấu hình HAproxy:
[root@loadbalancer ~]# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
Thay đổi file haproxy.cfg: ( Copy tất cả )
[root@loadbalancer ~]# echo 'global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
listen stats
bind :8080
mode http
stats enable
stats uri /stats
stats realm HAProxy\ Statistics
listen webcluster
bind :80
balance roundrobin
mode http
option forwardfor
server web1 10.10.11.87:80 check
server web2 10.10.11.88:80 check' > /etc/haproxy/haproxy.cfg
-Khởi động lại dịch vụ HAProxy:
[root@loadbalancer ~]# systemctl enable haproxy
[root@loadbalancer ~]# systemctl restart haproxy
B. Web01 vs 02 cài đặt Nginx cho Server
[root@loadbalancer ~]# yum update
(Cài đặt CentOS 7 EPEL repository cho server)
[root@loadbalancer ~]# yum install epel-release
[root@loadbalancer ~]# yum install nginx
(Cài đặt Nginx cho server)
[root@loadbalancer ~]# systemctl start nginx
(cần start Nginx để Nginx có thể bắt đầu hoạt động)
[root@loadbalancer ~]# systemctl status nginx
(kiểm tra trạng thái)
[root@loadbalancer ~]# systemctl enable nginx
(enable để Nginx có thể start khi boot để trong 1 số trường hợp chúng ta cần reset server thì Nginx có thể tự động start)
C. Test Server
-Loadbalancer
-Web01
-Web02
III. Cấu hình log cho HAProxy Trên Loadbalancer
Mặc định HAProxy sẽ gửi log tới rsyslog trên IP local.
-Kiểm tra cấu hình log mặc định:
[root@loadbalancer ~]# cat /etc/haproxy/haproxy.cfg | grep ^global -A 1
=> Kết quả ra:
global
log 127.0.0.1 local2
-Chỉnh sửa cấu hình rsyslog.conf:
[root@loadbalancer ~]# sed -i "s/#\$ModLoad imudp/\$ModLoad imudp/g" /etc/rsyslog.conf
[root@loadbalancer ~]# sed -i "s/#\$UDPServerRun 514/\$UDPServerRun 514/g" /etc/rsyslog.conf
[root@loadbalancer ~]# echo '$UDPServerAddress 127.0.0.1' >> /etc/rsyslog.conf
-Tạo file cấu hình rsyslog cho Haproxy:
[root@loadbalancer ~]# echo 'local2.* /var/log/haproxy.log' > /etc/rsyslog.d/haproxy.conf
-Khởi động lại Rsyslog và HAProxy:
[root@loadbalancer ~]# systemctl restart rsyslog
[root@loadbalancer ~]# systemctl restart haproxy
IV. Kết quả
-File cấu hình log:
[root@loadbalancer ~]# ll /var/log/haproxy.log
=> kết quả:
-rw------- 1 root root 4577 Feb 8 10:43 /var/log/haproxy.log