1. 項目背景
在現代Web應用中,高可用性和負載均衡是兩個至關重要的需求。本項目旨在通過HAProxy實現流量分發,通過Keepalived實現高可用性,通過Nginx提供后端服務。該架構能夠確保在單點故障的情況下,系統仍然能夠正常運行,并且能夠均衡地分配流量到多個后端服務器。
2. 環境準備
2.1 服務器配置
角色 | IP 地址 | 服務器名稱 | 功能描述 |
---|---|---|---|
HAProxy 主節點 | 192.168.65.131 | haproxy-master | 負載均衡器(主) |
HAProxy 備節點 | 192.168.65.132 | haproxy-backup | 負載均衡器(備) |
后端 Web 服務器 1 | 192.168.65.133 | webserver1 | 提供 Web 服務 |
后端 Web 服務器 2 | 192.168.65.134 | webserver2 | 提供 Web 服務 |
虛擬 IP | 192.168.65.100 | - | 用于 Keepalived 高可用 |
2.2 軟件需求
服務器角色 | 需要安裝的軟件 |
---|---|
HAProxy 主節點 | HAProxy, Keepalived |
HAProxy 備節點 | HAProxy, Keepalived |
后端 Web 服務器 | Nginx |
3. 服務器網絡環境配置
3.1 設置靜態IP地址
為確保服務器在重啟后仍能保持固定的網絡配置,在rhel9系統中,需要為每臺服務器設置靜態IP地址。編輯 /etc/NetworkManager/system-connections/ens160.nmconnection文件:
[ipv4]
address1=192.168.65.131/24,192.168.65.2
dns=8.8.8.8;
method=manual
3.2 配置主機名和主機映射
為便于在集群環境中快速識別和管理各服務器,需要為每臺服務器配置主機名。
HAProxy 主節點(192.168.65.131)
-
設置主機名
sudo hostnamectl set-hostname haproxy-master
-
更新
/etc/hosts
文件sudo vi /etc/hosts
添加以下內容:
127.0.0.1 haproxy-master 192.168.65.131 haproxy-master 192.168.65.132 haproxy-backup 192.168.65.133 webserver1 192.168.65.134 webserver2
HAProxy 備節點(192.168.65.132)
-
設置主機名
sudo hostnamectl set-hostname haproxy-backup
-
更新
/etc/hosts
文件sudo vi /etc/hosts
添加以下內容:
127.0.0.1 haproxy-backup 192.168.65.131 haproxy-master 192.168.65.132 haproxy-backup 192.168.65.133 webserver1 192.168.65.134 webserver2
后端 Web 服務器 1(192.168.65.133)
-
設置主機名
sudo hostnamectl set-hostname webserver1
-
更新
/etc/hosts
文件sudo vi /etc/hosts
添加以下內容:
127.0.0.1 webserver1 192.168.65.131 haproxy-master 192.168.65.132 haproxy-backup 192.168.65.133 webserver1 192.168.65.134 webserver2
后端 Web 服務器 2(192.168.65.134)
-
設置主機名
sudo hostnamectl set-hostname webserver2
-
更新
/etc/hosts
文件sudo vi /etc/hosts
添加以下內容:
127.0.0.1 webserver2 192.168.65.131 haproxy-master 192.168.65.132 haproxy-backup 192.168.65.133 webserver1 192.168.65.134 webserver2
3.3 永久關閉selinux?
sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
重啟并查看
reboot
getenforce
3.4?配置防火墻規則
為保障網絡安全,需要優化防火墻規則,開啟必要的服務端口,同時關閉不必要的端口。使用 firewalld
配置防火墻:
# 開啟HAProxy的80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload# 開啟Keepalived的VRRP端口
firewall-cmd --zone=public --add-port=112/udp --permanent
firewall-cmd --reload
3.5?實現SSH免密登錄
為提高運維效率并減少人為錯誤,需要實現SSH免密登錄。生成SSH密鑰對,并將公鑰復制到所有服務器:
# 在主節點生成密鑰對
ssh-keygen -t rsa# 將公鑰復制到其他服務器
ssh-copy-id haproxy-backup
ssh-copy-id webserver1
ssh-copy-id webserver2
4. 軟件安裝與配置
4.1 HAProxy 主節點和備節點配置
4.1.1 安裝 HAProxy 和 Keepalived
在HAProxy主節點和備節點上安裝必要的軟件:
yum install -y haproxy keepalived
4.1.2 配置 HAProxy
編輯 /etc/haproxy/haproxy.cfg
文件,配置HAProxy以實現流量分發到后端Web服務器:
globallog /dev/log local0log /dev/log local1 noticechroot /var/lib/haproxyuser haproxygroup haproxydaemondefaultslog globalmode httpoption httplogoption dontlognulltimeout connect 5000timeout client 50000timeout server 50000frontend http_frontbind *:80default_backend http_backbackend http_backbalance roundrobinserver web1 192.168.65.133:80 checkserver web2 192.168.65.134:80 check
4.1.3 配置 Keepalived
編輯 /etc/keepalived/keepalived.conf
文件,配置Keepalived以實現主備切換,確保高可用性:
主節點(192.168.65.131):
global_defs {router_id SERVER1
}
vrrp_instance VI_1 {state MASTERinterface ens160virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1234}virtual_ipaddress {192.168.65.100}
}
備節點(192.168.65.132):
global_defs {router_id SERVER2
}
vrrp_instance VI_1 {state BACKUPinterface ens160virtual_router_id 51priority 90advert_int 1authentication {auth_type PASSauth_pass 1234}virtual_ipaddress {192.168.65.100}
}
4.1.4 啟動服務
啟動并啟用HAProxy和Keepalived服務,確保配置生效:
sudo systemctl enable haproxy
sudo systemctl start haproxy
sudo systemctl enable keepalived
sudo systemctl start keepalived
?keepalived主節點(192.168.65.131):成功獲取vip:192.168.100?
?keepalived備節點(192.168.65.132):沒有獲取vip,正常
4.2 后端 Web 服務器配置
4.2.1 安裝 Nginx
在后端Web服務器上安裝Nginx,為用戶提供Web服務:
sudo yum install -y nginx
4.2.2 配置 Nginx
編輯 /etc/nginx/conf.d/test1.conf
和 /etc/nginx/conf.d/test2.conf
文件,配置Nginx以響應HTTP請求,并返回服務器標識信息:
Web服務器1(192.168.65.133):
server {listen 80;location / {return 200 "Welcome to Web Server webserver1\n";}
}
Web服務器2(192.168.65.134):
server {listen 80;location / {return 200 "Welcome to Web Server webserver2\n";}
}
4.2.3 啟動 Nginx并測試
啟動并啟用Nginx服務,確保其正常運行:
sudo systemctl enable nginx
sudo systemctl start nginx
5. 測試與驗證
5.1 驗證 HAProxy 和 Keepalived
5.1.1 正常訪問測試
驗證客戶端是否能夠通過虛擬IP正常訪問后端服務器:
curl 192.168.65.100
預期結果: 返回 Welcome to Web Server
webserver1?或 Welcome to Web Server
webserver2。
5.1.2 主節點故障模擬
驗證在主節點故障時,備節點是否能夠正常接管虛擬IP:
-
在主節點(192.168.65.131)上停止Keepalived服務
systemctl stop keepalived
-
在客戶端再次訪問虛擬IP,觀察響應內容。
預期結果: 備節點接管虛擬IP,客戶端仍能正常訪問后端服務器。
主節點(192.168.65.131)失去vip?
?備用節點(192.168.65.132)成功獲取vip?
5.2 驗證 Nginx
驗證后端服務器的Nginx服務是否正常運行:
curl http://192.168.65.133
curl http://192.168.65.134
預期結果: 分別返回 Welcome to Web Server
webserver1和 Welcome to Web Server
webserver2。