[HAProxy] Phần 1: Cơ bản về HA Keepalive

Tác giả: 15/05/2023

HAProxy hay High Availability Proxy là một công cụ mã nguồn mở nổi tiếng được sử dụng để cân bằng tải TCP/HTTP cũng như giải pháp máy chủ Proxy (Proxy Server).

HAProxy có thể chạy trên nhiều nền tảng như Linux, Solaris, FreeBSD với mục đích là cải thiện hiệu năng, tăng độ tin cậy của hệ thống máy chủ bằng cách phân phối khối lượng công việc trên nhiều máy chủ (như Web, App, cơ sở dữ liệu).

KeepAlive là một dịch vụ được sử dụng để tạo ra virtual IP address cho hệ thống. Tiến trình KeepAlive có thể tự động giám sát dịch vụ hoặc hệ thống và có khả năng chịu lỗi cho hệ thống khi dịch vụ hoặc hệ điều hành xảy ra vấn đề.

Thành phần chính của KeepAlive

  • Keepalive Interval: Thời gian giữa các lần gửi gói tin Keepalive từ thiết bị. Giá trị này có thể thay đổi tùy chỉnh
  • Keepalive Retries: Số lần mà một thiết bị cố gắng gửi gói tin Keepalive kiểm tra trạng thái khi không nhận được phản hồi từ thiết bị khác. Nếu quá số lần này thì có thể xem là thiết bị đầu kia có trạng thái đường kết nối đứt hoặc không còn hoạt động

Cách thức hoạt động

  • Một gói tin Keepalive sẽ được gửi từ một thiết bị A đến thiết bị B, thời gian giữa mỗi gói tin là <Keepalive Interval>
  • Sau khi gói tin Keepalive đó gửi đi, A sẽ chờ gói tin phản hồi từ B để kiểm tra đường kết nối giữa 2 thiết bị đang hoạt động ổn định
  • Nếu không nhận được gói tin phản hồi, thiết bị A sẽ tiếp tục gửi lại gói tin và lại chờ
  • Sau số lần là <Keepalive Retries> vẫn không nhận được phản hồi thì lúc này, thiết bị A sẽ xem như thiết bị B đã down hoặc đường truyền giữa 2 thiết bị không còn khả dụng nữa
  • Lúc này dịch vụ sẽ quyết định các hoạt động khác nếu thiết bị B down như chuyển hướng dữ liệu sang đường khác

Triển khai HAProxy Keepalive cho Apache trên CentOS 7

1. Phân hoạch

Hostname Hardware Interface
node1 2vCPU – 2GB RAM – 25GB Disk ens3: 172.16.7.153 (Public) – eth0: 192.168.60.210
node2 2vCPU – 2GB RAM – 25GB Disk ens3: 172.16.7.163 (Public) – eth0: 192.168.60.220
node3 2vCPU – 2GB RAM – 25GB Disk ens3: 172.16.7.173 (Public) – eth0: 192.168.60.230

2. Mô hình

3. Cấu hình Apache trên các node

Thực hiện tại Node 1:

yum install httpd -y
cat /etc/httpd/conf/httpd.conf | grep 'Listen 80'
sed -i "s/Listen 80/Listen 192.168.60.210:8081/g" /etc/httpd/conf/httpd.conf
echo '<h1>Đây là website từ Node 1</h1>' > /var/www/html/index.html
systemctl start httpd
systemctl enable httpd

Thực hiện tại Node 2:

yum install httpd -y
cat /etc/httpd/conf/httpd.conf | grep 'Listen 80'
sed -i "s/Listen 80/Listen 192.168.60.220:8081/g" /etc/httpd/conf/httpd.conf
echo '<h1>Đây là website từ Node 2</h1>' > /var/www/html/index.html
systemctl start httpd
systemctl enable httpd
yum install httpd -y
cat /etc/httpd/conf/httpd.conf | grep 'Listen 80'
sed -i "s/Listen 80/Listen 192.168.60.230:8081/g" /etc/httpd/conf/httpd.conf
echo '<h1>Đây là website từ Node 3</h1>' > /var/www/html/index.html
systemctl start httpd
systemctl enable httpd

4. Cài đặt và triển khai Keepalive

Cài đặt gói Keepalive trên cả 3 node

yum install keepalived -y

File cấu hình chính của keepalive nằm ở /etc/keepalived/keepalived.conf. Chúng ta thêm các cấu hình này vào file trên từng node như sau:

  • Node 1
echo '
vrrp_script chk_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight 2
}
vrrp_instance VI_1 {
    interface ens3
    state MASTER
    virtual_router_id 51
    priority 101
    virtual_ipaddress {
        172.16.7.200/24
    }
    track_script {
        chk_haproxy
    }
}' > /etc/keepalived/keepalived.conf
  • Node 2
echo '
vrrp_script chk_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight 2
}
vrrp_instance VI_1 {
    interface ens3
    state BACKUP
    virtual_router_id 51
    priority 100
    virtual_ipaddress {
        172.16.7.200/24
    }
    track_script {
        chk_haproxy
    }
}' > /etc/keepalived/keepalived.conf
  • Node 3
echo '
vrrp_script chk_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight 2
}
vrrp_instance VI_1 {
    interface ens3
    state BACKUP
    virtual_router_id 51
    priority 99
    virtual_ipaddress {
        172.16.7.200/24
    }
    track_script {
        chk_haproxy
    }
}' > /etc/keepalived/keepalived.conf

Trong đó đối với block vrrp_script:

  • script “killall -0 haproxy: kiểm tra tiến trình HAProxy
  • interval 2: việc kiểm tra được thực hiện mỗi 2 giây
  • weight 2: nếu kiểm tra thành công thì được +2 điểm

Với block vrrp_instance:

  • interface ens3: tên card mạng
  • state MASTER: chỉ định node này là MASTER hay SLAVE
  • virtual_router_id 51: mỗi cụm Keepalive chỉ cần 1 ID chia sẻ giữa các node, ở đây ta chọn 51
  • priority 101: giá trị ưu tiên, node nào có priority cao nhất sẽ được chọn để hiển thị web
  • virtual_ipaddress: khai báo 1 IP cùng dải với ens3, ví dụ 172.16.7.200
  • track_script: giúp Keepalive xác định node nào sẽ nắm IP Virtual. Ví dụ Node 1 có priority là 101 thì Node 1 sẽ nắm IP Virtual. Nếu khi check HA service không thành công thì giá trị này sẽ giảm đi 2 và thấp hơn Node 2, lúc này Node 2 sẽ nắm IP Virtual.

Cuối cùng ta start dịch vụ keepalived

systemctl start keepalived

5. Cài đặt HAProxy

Thực hiện các bước sau trên cả 3 Node

yum install wget socat -y
wget https://cbs.centos.org/kojifiles/packages/haproxy/1.8.23/3.el7/x86_64/haproxy18-1.8.23-3.el7.x86_64.rpm --no-check-certificate
yum install haproxy18-1.8.23-3.el7.x86_64.rpm -y

Tạo bản backup cho cấu hình mặc định và chỉnh sửa cấu hình cho HAproxy

cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak

Cấu hình HAProxy

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
    maxconn                 8000
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    retries                 3
    timeout http-request    20s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s

listen stats
    bind *:8080 interface ens3
    mode http
    stats enable
    stats uri /stats
    stats realm HAProxy\ Statistics
    stats admin if TRUE

listen web-backend
    bind *:80
    balance  roundrobin
    cookie SERVERID insert indirect nocache
    mode  http
    option  httpchk
    option  httpclose
    option  httplog
    option  forwardfor
    server node1 192.168.60.210:8081 check cookie node1 inter 5s fastinter 2s rise 3 fall 3
    server node2 192.168.60.220:8081 check cookie node2 inter 5s fastinter 2s rise 3 fall 3
    server node3 192.168.60.230:8081 check cookie node3 inter 5s fastinter 2s rise 3 fall 3' > /etc/haproxy/haproxy.cfg

Cấu hình Log cho HAProxy

sed -i "s/#\$ModLoad imudp/\$ModLoad imudp/g" /etc/rsyslog.conf
sed -i "s/#\$UDPServerRun 514/\$UDPServerRun 514/g" /etc/rsyslog.conf
echo '$UDPServerAddress 127.0.0.1' >> /etc/rsyslog.conf
echo 'local2.*    /var/log/haproxy.log' > /etc/rsyslog.d/haproxy.conf
systemctl restart rsyslog

Bổ sung cấu hình cho phép kernel có thể binding tới IP Virtual

echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf

Kiểm tra

sysctl -p

Khởi tạo dịch vụ HAProxy

systemctl restart haproxy
systemctl enable haproxy

Kết quả

Tổng kết

Khi mà công nghệ ngày càng phát triển, việc tìm kiếm 1 giải pháp cân bằng tải để đáp ứng uptime 100% và các nhu cầu khác ngày càng tăng cao, thì HAProxy dường như là một cách rất tốt để làm điều này.

Trong các bài viết tiếp theo, Nhân Hòa sẽ nói sâu hơn về cách cấu hình HAProxy. Mình là Vương Bảo Trung, hiện đang thực tập và học việc tại Nhân Hòa, các bạn hãy tiếp tục đón đọc các bài viết của mình tại Wiki Nhân Hòa.

 

Chúc các bạn luôn may mắn và thành công trong công việc!

Trả lời