Cài đặt cấu hình hệ thống Cân bằng tải Load Balancing HAProxy và Keepalived

Trong bài viết này chúng ta sẽ cùng nhau đi thực hiện cài đặt giả lập hệ thống Cân bằng tải (Load Balancing) mềm sử dụng Haproxy và Keepalived, đây là bài toán thực tế các hệ thống đang áp dụng để tối ưu và mở rộng hệ thống CNTT.

Thế nào là hệ thống Load Balancing? Load balancing là một thành phần quan trọng của cơ sở hạ tầng thường được sử dụng để cải thiện hiệu suất và độ tin cậy của các trang web, các ứng dụng, cơ sở dữ liệu và các dịch vụ khác bằng cách phân phối khối lượng công việc trên nhiều máy chủ.

word image 6824 1

1. Sơ đồ mạng mô hình

Chúng ta sử dụng mô hình thực tế có 5 node, trong đó 2 node làm thiết bị load balancer, 3 node làm webserver chi tiết như bên dưới đây:

Giả sử IP các máy như sau:

Tên node Vai trò IP
haproxy1 Load balancer 192.168.68.10
haproxy2 Load balancer 192.168.68.11
web1 Web server 192.168.68.20
web2 Web server 192.168.68.21
web3 Web server 192.168.68.22

Ở đây chúng ta dùng VirtualBox là máy chủ ảo hóa để triển khai cho thuận tiện, bác nào có PC thật cũng làm tương tự nhé.

Hệ điều hành sử dụng là Ubuntu 24.04 được cài đặt sẵn trên máy ảo (các bạn có thể sử dụng Linux cũng được) => Các bạn nên cài đặt sẵn sau đó nhân bản lên để có nhiều máy chủ trong LAB và tiết kiệm thời gian.

Xem thêm bài viết: hướng dẫn cài đặt Hệ điều hành Ubuntu trên VirtualBox

Cài đặt Ubuntu trên Virtualbox

# Chúng ta đặt địa chỉ IP và thay đổi thông tin hostname + update hệ điều hành cho 5 máy chủ:

sudo apt update
sudo apt upgrade
sudo apt full-upgrade

# nâng cấp OS nếu muốn

sudo do-release-upgrade

# kiểm tra thông tin hostname hiện tại:

hostnamectl

# đổi tên của hostname:

sudo hostnamectl set-hostname haproxy1
sudo hostnamectl set-hostname haproxy2
sudo hostnamectl set-hostname web1
sudo hostnamectl set-hostname web2
sudo hostnamectl set-hostname web3

# Cập nhật file /etc/hosts

sudo nano /etc/hosts

127.0.1.1 haproxy1
127.0.1.1 haproxy2
127.0.1.1 web1
127.0.1.1 web2
127.0.1.1 web3

# Thay đổi IP cho các host:

word image 6824 2

word image 6824 3

word image 6824 4

=> Các node khác làm tương tự như trên theo thông tin IP và tên tương ứng với nó

# Cài đặt thêm ssh server để có thể remote ssh từ bên ngoài: ví dụ như chúng ta có thể sử dụng MobaXterm để ssh vào trong server từ xa, cài đặt trên tất cả các node.

sudo systemctl status ssh
sudo apt update
sudo apt install openssh-server

# Khởi động SSH và cho phép chạy cùng hệ thống

sudo systemctl start ssh
sudo systemctl enable ssh

# Kiểm tra xem ssh có đang chạy hay không

sudo systemctl status ssh

word image 6824 5

Sau khi cài đặt xong hết thì tiến hành khởi động lại các node và tiến hành các bước tiếp theo.

2. Cài đặt Apache trên 3 Web Server

Trên cả 3 node web1, web2, web3: (các bạn có thể cài cái gì cũng được nhé, mục đích của việc này là chứng minh được hệ thống load balancing hoạt động đúng, phân tải theo cấu hình chính xác)

sudo apt update
sudo apt install apache2 -y

# Sau khi cài đặt xong trên cả 3 node web => chúng ta kiểm tra xem đã thành công hay chưa bằng cách truy cập web theo địa chỉ IP của node:

http://192.168.68.20

http://192.168.68.21

http://192.168.68.22

word image 6824 6

Tùy chỉnh nội dung trang web để dễ phân biệt, bước này chúng ta tạo file index cho web trên mỗi node:

# trên web1

echo "This is web1" | sudo tee /var/www/html/index.html

# trên web2

echo "This is web2" | sudo tee /var/www/html/index.html

# trên web3

echo "This is web3" | sudo tee /var/www/html/index.html

3. Cài đặt HAProxy trên 2 Load Balancer

Trên cả 2 node haproxy1 và haproxy2:

sudo apt update
sudo apt install haproxy -y

Chỉnh sửa file cấu hình HAProxy:

sudo nano /etc/haproxy/haproxy.cfg

# cấu hình như sau:

global
    log /dev/log    local0
    maxconn 2048
    daemon

defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    timeout connect 5s
    timeout client  30s
    timeout server  30s

frontend http_front
    bind *:80
    default_backend http_back

backend http_back
    balance roundrobin
    server web1 192.168.68.20:80 check
    server web2 192.168.68.21:80 check
    server web3 192.168.68.22:80 check

Chú ý: nếu trong file mặc định của hệ thống mà có sẵn phần nào rồi thì chúng ta bỏ qua phần đó mà chỉ cần thêm các thông tin chưa có thôi, ví dụ như ở bên trên là global và defaults là có sẵn trong file rồi thì chúng ta bỏ qua mà chỉ cần thêm phần frontend và backend mà thôi.

# Sau đó khởi động lại dịch vụ:

sudo systemctl restart haproxy

4. Kiểm tra hoạt động

Truy cập địa chỉ IP của haproxy1 hoặc haproxy2 từ trình duyệt, ví dụ:

http://192.168.68.10/

http://192.168.68.11/

word image 6824 7

Bạn sẽ thấy nội dung trang web thay đổi mỗi lần tải lại theo thứ tự web1, web2, web3, lặp lại — nhờ thuật toán round-robin (phân tải xoay vòng thứ tự).

Ngoài ra chúng ta có thể cấu hình cho backend sử dụng nhiều thuật toán phân phối tải khác như sau:

# chỉnh sửa thông tin file haproxy.cfg trong phần backend theo các thuật toán tương ứng:

# ít kết nối nhất => ưu tiên phân tải tới server đang có ít kết nối nhất

backend http_back
    balance leastconn
    server web1 192.168.68.20:80 check
    server web2 192.168.68.21:80 check

# Source IP (để giữ session) Phân phối dựa trên IP client – giúp giữ phiên (session persistence).

backend http_back
    balance source
    hash-type consistent
    server web1 192.168.68.20:80 check
    server web2 192.168.68.21:80 check

# random => phân phối ngẫu nhiên có trọng số => server nào nhanh hơn thì được phân phối nhiều hơn

backend http_back
    balance random
    server web1 192.168.68.20:80 check weight 3
    server web2 192.168.68.21:80 check weight 1
    server web3 192.168.68.22:80 check weight 1

# Khởi động lại dịch vụ để các thông số được cập nhật sau khi thay đổi

sudo systemctl restart haproxy

5. Đồng bộ giữa 2 HAProxy (high availability)

Câu hỏi đặt ra là chúng ta đang sử dụng 1 node cho Haproxy nếu node này down thì toàn bộ hệ thống của chúng ta sẽ không truy cập được => chúng ta cần thêm node backup nữa để tăng tính HA (sẵn sàng cao) lên thì cài đặt thế nào?

Chúng ta sẽ cài đặt 2 HAProxy hoạt động như một cặp master-slave hoặc failover, có thể kết hợp thêm Keepalived để tạo IP ảo (VIP là virtual IP). Khi haproxy1 bị down thì haproxy2 tự động nhận VIP và tiếp tục phục vụ.

# Mô hình

Tên node Vai trò IP riêng VIP (ảo)
haproxy1 Master 192.168.68.10 192.168.68.33
haproxy2 Backup 192.168.68.11 192.168.68.33
web1–3 Web servers 192.168.68.20, 21, 22

VIP 192.168.68.33 là địa chỉ mà client truy cập, sẽ luôn được gán cho 1 trong 2 HAProxy.

# Cài đặt Keepalived

Trên cả 2 node haproxy1 và haproxy2:

sudo apt update
sudo apt install keepalived -y

# Cấu hình Keepalived

◾ Trên haproxy1 (Master): sửa file conf

sudo nano /etc/keepalived/keepalived.conf

# thêm nội dung bên dưới

vrrp_instance VI_1 {
    state MASTER
    interface enp0s3                     # thay the bang interface mang thuc te (vd: ens33, enp0s3)
    virtual_router_id 51
    priority 100                      # Cao hon -> lam MASTER
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.68.33
    }
}

◾ Trên haproxy2 (Backup):

sudo nano /etc/keepalived/keepalived.conf

# thêm nội dung bên dưới

vrrp_instance VI_1 {
    state BACKUP
    interface enp0s3                     # Thay bang interface mang thuc te
    virtual_router_id 51
    priority 90                        # thap hon master
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.68.33
    }
}

# Khởi động Keepalived

Trên cả 2 node:

sudo systemctl status keepalived
sudo systemctl enable keepalived
sudo systemctl start keepalived

Kiểm tra IP ảo:

ip a | grep 192.168.68.33

Chúng ta sẽ thấy IP này gắn trên node haproxy1. Nếu tắt dịch vụ HAProxy hoặc Keepalived trên haproxy1, node haproxy2 sẽ tự động nhận VIP. (nếu bình thường thì IP 33 sẽ có trên master node là Haproxy1 => nếu tắt node1 thì VIP .33 sẽ được gán cho node 2 một cách tự động)

word image 6824 8

word image 6824 9

# Kiểm tra hoạt động failover

Truy cập trình duyệt: http://192.168.68.33

Dừng haproxy1:

sudo systemctl stop keepalived

Chờ 1–2 giây, VIP sẽ chuyển sang haproxy2. Truy cập lại IP vẫn hoạt động.

Chúng ta truy cập địa chỉ .33 là có thể vào hệ thống rồi vì .33 đang được gán cho master => nếu master down thì sẽ chuyển sang sử dụng Backup

word image 6824 10

6. Gửi thông báo tự động khi hệ thống cân bằng tải gặp vấn đề

Tiếp theo: Nếu 1 trong 2 node Haproxy mà down thì làm thế nào chúng ta nhận biết được thông tin này mà khắc phục kịp thời trước khi node còn lại cũng down? Chúng ta phải nhận được thông báo từ hệ thống và chúng ta phải cấu hình hệ thống để làm được việc này.

Hướng dẫn cấu hình Keepalived gửi thông báo, cảnh báo khi failover xảy ra (ví dụ: khi một node trở thành MASTER hoặc bị mất VIP). => Chúng ta sẽ thực hiện gửi tin nhắn vào Telegram.

# Tạo Telegram Bot (qua BotFather)

Mở ứng dụng Telegram trên điện thoại hoặc web.

Tìm kiếm @BotFather rồi bấm Start (hoặc gõ /start).

Gõ lệnh tạo bot mới:

/newbot

Đặt tên bot, chọn username cho bot (kết thúc bằng _bot)

Sau đó chúng ta nhận được Token từ hệ thống:

Use this token to access the HTTP API:
XXXXXXXX:XXXXXXXXXXXXX

# Lấy Chat ID Telegram của bạn

Gửi tin nhắn bất kỳ tới bot bạn vừa tạo.

Mở trình duyệt, dán URL sau (thay TOKEN bằng token ở bước 1):

https://api.telegram.org/bot<TOKEN>/getUpdates

https://api.telegram.org/bot123456789:AAAbbbcccddd111222333444/getUpdates

Kết quả:

"chat":{"id":123456789,"first_name":"YourName", ... }

123456789 chính là chat_id chúng ta cần.

# Tạo script gửi cảnh báo trên cả 2 node

sudo nano /etc/keepalived/notify.sh

# thêm vào nội dung bên dưới:

#!/bin/bash
STATE=$1
HOSTNAME=$(hostname)
BOT_TOKEN="xxxxxxxxxxxxxx"  	# thay bang token that
CHAT_ID="xxxxxxxxxxxxx"                  # thay bang chat_id
MESSAGE="⚠️ Keepalived thong bao chuyen trang thai => co the la server down: Server: *$HOSTNAME*, Trang thai: *$STATE*, IP=$(hostname -I | awk '{print $1}')"
curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
     -d chat_id="$CHAT_ID" \
     -d text="$MESSAGE" \
     -d parse_mode="Markdown"

word image 6824 11

# Cấp quyền thực thi cho file:

sudo chmod +x /etc/keepalived/notify.sh

word image 6824 12

# Gọi script từ cấu hình Keepalived

sudo nano /etc/keepalived/keepalived.conf

# Thêm vào trong vrrp_instance nội dung bên dưới (trên cả 2 node HAproxy):

notify_master "/etc/keepalived/notify.sh MASTER"
notify_backup "/etc/keepalived/notify.sh BACKUP"
notify_fault "/etc/keepalived/notify.sh FAULT"

# cụ thể như sau:

vrrp_instance VI_1 {
    state MASTER
    interface enp0s3                     # thay the bang interface mang thuc te (vd: ens33, enp0s3)
    virtual_router_id 51
    priority 100                      # Cao hon -> lam MASTER
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.68.33
    }
   notify_master "/etc/keepalived/notify.sh MASTER"
   notify_backup "/etc/keepalived/notify.sh BACKUP"
   notify_fault  "/etc/keepalived/notify.sh FAULT"
}

word image 6824 13

# Cài đặt CURL trên cả 2 node

sudo apt install curl -y

# Khởi động lại dịch vụ Keepalived

sudo systemctl restart keepalived

word image 6824 14

# Kiểm tra hoạt động

# Dừng dịch vụ Keepalived trên haproxy1:

sudo systemctl stop keepalived

# Xem có nhận được thông báo Telegram?

word image 6824 15

Chúc các bạn thành công !!!

 

Datalinks.vn

Hello các bạn, mình là Dương Nguyễn tác giả của blog này. Với gần 20 năm làm việc trong lĩnh vực CNTT, VT trong và ngoài nước, mong muốn được chia sẻ kiến thức và kinh nghiệm về database với các bạn đam mê và quan tâm đến lĩnh vực này. Đặc biệt là #OracleDatabase hoặc luyện thi #OCP database admin. Các bạn cần người đồng hành thì alo mình nhé. Call/Zalo: 0765 871 888. Thanks you !.....
0 0 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
guest

0 Góp ý
Phản hồi nội tuyến
Xem tất cả bình luận