文章目錄
- Keepalived + LVS(DR)+ Apache + NFS
- 項目背景
- 業務場景與核心需求
- 傳統架構的痛點與局限
- 技術方案的選型邏輯
- 項目價值與預期目標
- 項目實踐
- 項目環境
- 基礎配置
- 配置 router
- 配置免密登錄-可選
- 配置 nfs
- 配置 web
- 配置 LVS-RS
- 配置 HA 和 LVS-DS
- 配置 ha1
- 配置 ha2
- 測試
- 功能性測試
- 高可用測試
- 負載均衡測試
- 負載均衡測試
Keepalived + LVS(DR)+ Apache + NFS
項目背景
業務場景與核心需求
隨著企業數字化轉型加速,Web 服務作為業務對外輸出的核心載體,其高可用性、高并發承載能力、數據一致性成為支撐業務穩定運行的關鍵。以電商平臺、企業官網、在線教育等典型場景為例,需滿足以下核心需求:
-
高可用保障:Web 服務需實現 7×24 小時不間斷運行,避免因單點故障(如服務器宕機、網絡中斷)導致業務中斷,尤其在促銷活動、峰值訪問時段,服務不可用將直接造成經濟損失或用戶流失;
-
高并發承載:面對日益增長的用戶訪問量(如日均 PV 從 10 萬級提升至百萬級),單臺 Web 服務器的 CPU、內存、網絡帶寬易成為瓶頸,需通過負載均衡分攤請求壓力,保障頁面響應速度(目標:95% 請求響應時間<1 秒);
-
數據一致性:Web 服務涉及大量靜態資源(如 HTML、CSS、圖片、視頻)與動態業務數據(如用戶上傳文件、訂單記錄),多臺 Web 服務器需共享資源,避免出現 “不同服務器展示內容不一致”(如用戶在 A 服務器上傳的圖片,在 B 服務器無法訪問)的問題;
-
易維護與擴展性:業務增長過程中,需支持快速新增 Web 節點擴展集群能力,同時減少運維復雜度(如避免每臺服務器重復部署資源、手動同步配置)。
傳統架構的痛點與局限
在采用《Keepalived + LVS(DR)+ Apache + NFS》方案前,多數企業曾使用 “單 Web 服務器” 或 “簡單負載均衡” 架構,面臨以下難以突破的局限:
- 單點故障風險高:
-
傳統 “單臺 Apache 服務器 + 本地存儲” 架構中,服務器硬件故障(如硬盤損壞、電源故障)或軟件異常(如 Apache 進程崩潰)將直接導致服務完全不可用,MTTR(平均恢復時間)依賴人工干預,通常超過 30 分鐘,遠無法滿足業務連續性要求;
-
即使采用 “2 臺 Apache 服務器 + 簡單 DNS 輪詢”,若其中一臺服務器宕機,DNS 緩存可能導致部分用戶仍被解析至故障節點,且 DNS 輪詢無法感知服務器負載狀態,易出現 “故障節點持續接收請求” 或 “高負載節點被分配更多請求” 的問題。
- 并發承載能力不足:
-
單臺 Apache 服務器受限于 CPU 核心數(如 4 核 8G 服務器僅能穩定承載約 2000-3000 并發連接),當訪問量峰值超過閾值時,會出現請求排隊、頁面超時、503 錯誤等問題;
-
若僅通過 “增加服務器數量” 擴展,缺乏高效的負載均衡機制,無法將請求合理分配至各節點,導致資源浪費(部分服務器空閑)與性能瓶頸(部分服務器過載)并存。
- 數據共享與一致性難題:
-
多臺 Apache 服務器采用 “本地存儲靜態資源” 時,需通過腳本定期同步資源(如 rsync),但同步延遲易導致 “用戶訪問不同節點看到不同版本內容”(如首頁圖片更新后,部分節點仍展示舊圖);
-
動態數據(如用戶上傳的頭像、訂單附件)若存儲在本地,將無法在多節點間共享,導致 “用戶在 A 節點上傳文件后,切換至 B 節點無法查看” 的業務異常。
- 運維效率低下:
-
每臺 Web 服務器需單獨部署 Apache 配置、靜態資源、業務代碼,新增節點時運維人員需重復操作,耗時且易出錯(如配置文件漏改、資源版本不一致);
-
缺乏統一的資源管理機制,當靜態資源更新(如 CSS 樣式調整、圖片替換)時,需逐臺服務器修改,運維成本隨節點數量增加呈線性上升。
技術方案的選型邏輯
針對上述痛點,需構建一套 “高可用負載均衡 + 共享存儲 + Web 服務集群” 的一體化架構,而《Keepalived + LVS(DR)+ Apache + NFS》組合正是基于以下核心訴求選型:
- 解決高可用與負載均衡:
-
LVS(Direct Routing 模式)作為四層負載均衡器,具備超高并發承載能力(單機可支撐 10 萬 + 并發連接),通過 DR 模式避免 “請求回程流量” 占用帶寬,保障轉發效率;
-
Keepalived 通過 VRRP 協議實現 LVS 主備高可用,主節點故障時,備節點可在 1-3 秒內自動接管虛擬 IP(VIP),實現 “無感知切換”,徹底消除負載均衡層單點故障。
- 保障 Web 服務穩定性:
-
Apache 作為成熟的 Web 服務器,兼容性強、配置靈活,可穩定運行 PHP、Python 等動態業務代碼,同時通過模塊(如 mod_cache、mod_gzip)優化靜態資源訪問性能;
-
多臺 Apache 組成集群,通過 LVS 分攤請求壓力,單節點故障時,LVS 自動將請求轉發至其他健康節點,保障服務連續性。
- 實現數據一致性與共享:
-
NFS(網絡文件系統)作為共享存儲,將所有 Web 服務器的靜態資源(如 /images、/css 目錄)與動態上傳目錄(如 /uploads)掛載至 NFS 服務器,實現 “多節點訪問同一存儲資源”,徹底解決數據同步問題;
-
NFS 支持權限控制與讀寫分離(可選配置),可保障資源訪問安全性與存儲性能。
- 降低運維復雜度:
-
架構模塊化設計,各組件職責清晰(LVS 負責轉發、Apache 負責服務、NFS 負責存儲),便于故障定位與單獨擴展;
-
新增 Web 節點時,僅需安裝 Apache 并掛載 NFS 目錄,無需重復部署資源,運維效率提升 80% 以上。
項目價值與預期目標
通過部署《Keepalived + LVS(DR)+ Apache + NFS》架構,預期實現以下業務與技術價值:
-
業務連續性:Web 服務可用性從 99.9% 提升至 99.99%(年均 downtime 從 8.76 小時降至 52.56 分鐘),核心業務場景(如電商促銷、在線考試)無服務中斷風險;
-
性能提升:并發承載能力從單臺服務器 3000 并發提升至集群 10 萬 + 并發,頁面響應時間穩定在 500ms 以內,用戶體驗顯著優化;
-
運維效率:資源部署與更新效率提升 80%,新增節點時間從 2 小時縮短至 15 分鐘,減少重復人工操作;
-
擴展性:支持 Web 節點與 NFS 存儲獨立擴展(如新增 Apache 節點提升并發、擴容 NFS 存儲容量),滿足業務 3-5 年增長需求。
項目實踐
項目環境
主機名 | IP 地址 | VIP 地址 | 服務器角色 |
---|---|---|---|
client2.laoma.cloud | 10.1.1.21 | 無 | 客戶端 |
client1.laoma.cloud | 10.1.8.21 | 無 | 客戶端 |
router.laoma.cloud | 10.1.1.20, 10.1.8.20 | 無 | 路由器 |
ha1.laoma.cloud | 10.1.8.14 | 10.1.8.100 | HA 和 LVS 服務器 |
ha2.laoma.cloud | 10.1.8.15 | 10.1.8.100 | HA 和 LVS 服務器 |
web1.laoma.cloud | 10.1.8.11, 10.1.2.11 | 10.1.8.100 | Web 服務器 |
web2.laoma.cloud | 10.1.8.12, 10.1.2.12 | 10.1.8.100 | Web 服務器 |
web3.laoma.cloud | 10.1.8.13, 10.1.2.13 | 10.1.8.100 | Web 服務器 |
nfs.laoma.cloud | 10.1.2.100 | 無 | 存儲服務器 |
網絡說明:
- 所有主機:第一塊網卡名為 ens33,第二塊網卡名為 ens192
- 默認第一塊網卡模式為nat,第二塊網卡模式為hostonly
- 網關設置:10.1.1.0/24 網段網關為10.1.1.20,10.1.8.0/24 網段網關為10.1.8.20
基礎配置
-
主機名
-
IP 地址
-
網關
## 網關配置命令參考## 10.1.1.0/24 網段網關為10.1.1.20 nmcli connection modify ens33 ipv4.gateway 10.1.8.20 nmcli connection up ens33## 10.1.8.0/24 網段網關為10.1.8.20 nmcli connection modify ens33 ipv4.gateway 10.1.1.20 nmcli connection up ens33
配置 router
## 開啟路由
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
## 或者
## sed -i "s/ip_forward=0/ip_forward=1/g" /etc/sysctl.conf
sysctl -p
配置免密登錄-可選
[root@client ~]##
echo 'StrictHostKeyChecking no' >> /etc/ssh/ssh_config
ssh-keygen -t rsa -f .ssh/id_rsa -N ''
for host in server server{1..5}; do ssh-copy-id root@$host; done
for host in server server{1..5}; do scp /etc/ssh/ssh_config root@$host:/etc/ssh/ssh_config; done
for host in server server{1..5}; do ssh root@$host hostname; done## 同步/etc/hosts文件
for host in server server{1..5}; do scp /etc/hosts root@$host:/etc/hosts; done
配置 nfs
## 安裝軟件
yum install -y nfs-utils## 準備共享目錄和文件
mkdir /var/www/html/ -p
echo Welcome to www.laoma.cloud > /var/www/html/index.html## 配置共享
echo '/var/www 10.1.2.0/24(rw,sync)' >> /etc/exports## 啟用并啟動服務
systemctl enable nfs-server.service --now
配置 web
[root@web1-3 ~]### 部署 web
yum install -y httpd
echo Welcome to $(hostname) > /var/www/html/index.html
systemctl enable httpd.service --now## 訪問后端 web
[root@client1 ~]## curl 10.1.8.11
Welcome to web1.laoma.cloud
[root@client1 ~]## curl 10.1.8.12
Welcome to web2.laoma.cloud
[root@client1 ~]## curl 10.1.8.13
Welcome to web3.laoma.cloud## 配置NFS掛載
[root@web1-3 ~]#
yum install -y nfs-utils
echo '10.1.2.100:/var/www /var/www/html nfs defaults 0 0' >> /etc/fstab
systemctl daemon-reload
mount -a
df /var/www/html
配置 LVS-RS
所有后端主機都要做相同配置。
[root@web1-3 ~]### 增加虛擬網卡
nmcli connection add type dummy ifname dummy con-name dummy ipv4.method manual ipv4.addresses 10.1.8.100/32
nmcli connection up dummy## 配置arp參數,關閉arp對dummy網卡的解析
cat >> /etc/sysctl.conf << EOF
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.dummy.arp_ignore = 1
net.ipv4.conf.dummy.arp_announce = 2
EOF
sysctl -p
配置 HA 和 LVS-DS
配置 ha1
yum install -y keepalived ipvsadm
cp /etc/keepalived/keepalived.conf{,.bak}
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {router_id ha1
}vrrp_instance web {state MASTERinterface ens33virtual_router_id 51priority 110advert_int 1authentication {auth_type PASSauth_pass laoma@123}virtual_ipaddress {10.1.8.100/24}
}virtual_server 10.1.8.100 80 {delay_loop 6lb_algo rrlb_kind DRprotocol TCPreal_server 10.1.8.11 80 {weight 1TCP_CHECK {connect_timeout 3retry 3delay_before_retry 3}}real_server 10.1.8.12 80 {weight 2TCP_CHECK {connect_timeout 3retry 3delay_before_retry 3}}real_server 10.1.8.13 80 {weight 2TCP_CHECK {connect_timeout 3retry 3delay_before_retry 3}}
}
systemctl enable keepalived.service --now
配置 ha2
yum install -y keepalived ipvsadm
cp /etc/keepalived/keepalived.conf{,.bak}
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {router_id ha2
}vrrp_instance web {state BACKUPinterface ens33virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass laoma@123}virtual_ipaddress {10.1.8.100/24}
}virtual_server 10.1.8.100 80 {delay_loop 6lb_algo rrlb_kind DRprotocol TCPreal_server 10.1.8.11 80 {weight 1TCP_CHECK {connect_timeout 3retry 3delay_before_retry 3}}real_server 10.1.8.12 80 {weight 1TCP_CHECK {connect_timeout 3retry 3delay_before_retry 3}}real_server 10.1.8.13 80 {weight 1TCP_CHECK {connect_timeout 3retry 3delay_before_retry 3}}
}
systemctl enable keepalived.service --now
測試
功能性測試
[root@client1 ~]## while true ;do curl -s http://10.1.8.100;sleep 1;done
Welcome to www.laoma.cloud
......[root@client2 ~]## while true ;do curl -s http://10.1.8.100;sleep 1;done
Welcome to www.laoma.cloud
......
高可用測試
持續監控集群可用性。
[root@client2 ~]## while true ;do curl -s http://10.1.8.100;sleep 1;done
......
測試1:停止 ha1 上 keepalived 服務。
[root@ha1 ~]## systemctl stop keepalived.service
結果:客戶端無感知故障,正常訪問集群。
測試2:恢復 ha1 上 keepalived 服務。
[root@ha1 ~]## systemctl start keepalived.service
結果:客戶端無感知故障,正常訪問集群。
負載均衡測試
測試1:停止 web2 上 httpd 服務,監控客戶端訪問情況。
[root@web2 ~]## systemctl stop httpd.httpd
結果:大概 15 秒,LVS 將 web2 從后端虛擬主機中剔除。
測試2:啟動 web2 上 httpd 服務,監控客戶端訪問情況。
[root@web2 ~]## systemctl start httpd.service
結果**:客戶端無感知故障,正常訪問集群。
測試2:恢復 ha1 上 keepalived 服務。
[root@ha1 ~]## systemctl start keepalived.service
結果:客戶端無感知故障,正常訪問集群。
負載均衡測試
測試1:停止 web2 上 httpd 服務,監控客戶端訪問情況。
[root@web2 ~]## systemctl stop httpd.httpd
結果:大概 15 秒,LVS 將 web2 從后端虛擬主機中剔除。
測試2:啟動 web2 上 httpd 服務,監控客戶端訪問情況。
[root@web2 ~]## systemctl start httpd.service
結果:大概 5 秒,LVS將web2加入后端虛擬主機中。