文章目录
- [Keepalived + LVS(DR)+ Apache + NFS](#Keepalived + LVS(DR)+ Apache + NFS)
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 地址
-
网关
bash## 网关配置命令参考 ## 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
bash
## 开启路由
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
## 或者
## sed -i "s/ip_forward=0/ip_forward=1/g" /etc/sysctl.conf
sysctl -p
配置免密登录-可选
bash
[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
bash
## 安装软件
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
bash
[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
所有后端主机都要做相同配置。
bash
[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
bash
yum install -y keepalived ipvsadm
cp /etc/keepalived/keepalived.conf{,.bak}
vim /etc/keepalived/keepalived.conf
bash
! Configuration File for keepalived
global_defs {
router_id ha1
}
vrrp_instance web {
state MASTER
interface ens33
virtual_router_id 51
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass laoma@123
}
virtual_ipaddress {
10.1.8.100/24
}
}
virtual_server 10.1.8.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 10.1.8.11 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 10.1.8.12 80 {
weight 2
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 10.1.8.13 80 {
weight 2
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
bash
systemctl enable keepalived.service --now
配置 ha2
bash
yum install -y keepalived ipvsadm
cp /etc/keepalived/keepalived.conf{,.bak}
vim /etc/keepalived/keepalived.conf
bash
! Configuration File for keepalived
global_defs {
router_id ha2
}
vrrp_instance web {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass laoma@123
}
virtual_ipaddress {
10.1.8.100/24
}
}
virtual_server 10.1.8.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 10.1.8.11 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 10.1.8.12 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 10.1.8.13 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
bash
systemctl enable keepalived.service --now
测试
功能性测试
bash
[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
......
高可用测试
持续监控集群可用性。
bash
[root@client2 ~]## while true ;do curl -s http://10.1.8.100;sleep 1;done
......
测试1:停止 ha1 上 keepalived 服务。
bash
[root@ha1 ~]## systemctl stop keepalived.service
结果:客户端无感知故障,正常访问集群。
测试2:恢复 ha1 上 keepalived 服务。
bash
[root@ha1 ~]## systemctl start keepalived.service
结果:客户端无感知故障,正常访问集群。
负载均衡测试
测试1:停止 web2 上 httpd 服务,监控客户端访问情况。
bash
[root@web2 ~]## systemctl stop httpd.httpd
结果:大概 15 秒,LVS 将 web2 从后端虚拟主机中剔除。
测试2:启动 web2 上 httpd 服务,监控客户端访问情况。
bash
[root@web2 ~]## systemctl start httpd.service
结果**:客户端无感知故障,正常访问集群。
测试2:恢复 ha1 上 keepalived 服务。
bash
[root@ha1 ~]## systemctl start keepalived.service
结果:客户端无感知故障,正常访问集群。
负载均衡测试
测试1:停止 web2 上 httpd 服务,监控客户端访问情况。
bash
[root@web2 ~]## systemctl stop httpd.httpd
结果:大概 15 秒,LVS 将 web2 从后端虚拟主机中剔除。
测试2:启动 web2 上 httpd 服务,监控客户端访问情况。
bash
[root@web2 ~]## systemctl start httpd.service
结果:大概 5 秒,LVS将web2加入后端虚拟主机中。