Web 集群高可用全方案:Keepalived+LVS (DR) 负载均衡 + Apache 服务 + NFS 共享存储搭建指南

文章目录

Keepalived + LVS(DR)+ Apache + NFS

项目背景

业务场景与核心需求

随着企业数字化转型加速,Web 服务作为业务对外输出的核心载体,其高可用性、高并发承载能力、数据一致性成为支撑业务稳定运行的关键。以电商平台、企业官网、在线教育等典型场景为例,需满足以下核心需求:

  1. 高可用保障:Web 服务需实现 7×24 小时不间断运行,避免因单点故障(如服务器宕机、网络中断)导致业务中断,尤其在促销活动、峰值访问时段,服务不可用将直接造成经济损失或用户流失;

  2. 高并发承载:面对日益增长的用户访问量(如日均 PV 从 10 万级提升至百万级),单台 Web 服务器的 CPU、内存、网络带宽易成为瓶颈,需通过负载均衡分摊请求压力,保障页面响应速度(目标:95% 请求响应时间<1 秒);

  3. 数据一致性:Web 服务涉及大量静态资源(如 HTML、CSS、图片、视频)与动态业务数据(如用户上传文件、订单记录),多台 Web 服务器需共享资源,避免出现 "不同服务器展示内容不一致"(如用户在 A 服务器上传的图片,在 B 服务器无法访问)的问题;

  4. 易维护与扩展性:业务增长过程中,需支持快速新增 Web 节点扩展集群能力,同时减少运维复杂度(如避免每台服务器重复部署资源、手动同步配置)。

传统架构的痛点与局限

在采用《Keepalived + LVS(DR)+ Apache + NFS》方案前,多数企业曾使用 "单 Web 服务器" 或 "简单负载均衡" 架构,面临以下难以突破的局限:

  1. 单点故障风险高
  • 传统 "单台 Apache 服务器 + 本地存储" 架构中,服务器硬件故障(如硬盘损坏、电源故障)或软件异常(如 Apache 进程崩溃)将直接导致服务完全不可用,MTTR(平均恢复时间)依赖人工干预,通常超过 30 分钟,远无法满足业务连续性要求;

  • 即使采用 "2 台 Apache 服务器 + 简单 DNS 轮询",若其中一台服务器宕机,DNS 缓存可能导致部分用户仍被解析至故障节点,且 DNS 轮询无法感知服务器负载状态,易出现 "故障节点持续接收请求" 或 "高负载节点被分配更多请求" 的问题。

  1. 并发承载能力不足
  • 单台 Apache 服务器受限于 CPU 核心数(如 4 核 8G 服务器仅能稳定承载约 2000-3000 并发连接),当访问量峰值超过阈值时,会出现请求排队、页面超时、503 错误等问题;

  • 若仅通过 "增加服务器数量" 扩展,缺乏高效的负载均衡机制,无法将请求合理分配至各节点,导致资源浪费(部分服务器空闲)与性能瓶颈(部分服务器过载)并存。

  1. 数据共享与一致性难题
  • 多台 Apache 服务器采用 "本地存储静态资源" 时,需通过脚本定期同步资源(如 rsync),但同步延迟易导致 "用户访问不同节点看到不同版本内容"(如首页图片更新后,部分节点仍展示旧图);

  • 动态数据(如用户上传的头像、订单附件)若存储在本地,将无法在多节点间共享,导致 "用户在 A 节点上传文件后,切换至 B 节点无法查看" 的业务异常。

  1. 运维效率低下
  • 每台 Web 服务器需单独部署 Apache 配置、静态资源、业务代码,新增节点时运维人员需重复操作,耗时且易出错(如配置文件漏改、资源版本不一致);

  • 缺乏统一的资源管理机制,当静态资源更新(如 CSS 样式调整、图片替换)时,需逐台服务器修改,运维成本随节点数量增加呈线性上升。

技术方案的选型逻辑

针对上述痛点,需构建一套 "高可用负载均衡 + 共享存储 + Web 服务集群" 的一体化架构,而《Keepalived + LVS(DR)+ Apache + NFS》组合正是基于以下核心诉求选型:

  1. 解决高可用与负载均衡
  • LVS(Direct Routing 模式)作为四层负载均衡器,具备超高并发承载能力(单机可支撑 10 万 + 并发连接),通过 DR 模式避免 "请求回程流量" 占用带宽,保障转发效率;

  • Keepalived 通过 VRRP 协议实现 LVS 主备高可用,主节点故障时,备节点可在 1-3 秒内自动接管虚拟 IP(VIP),实现 "无感知切换",彻底消除负载均衡层单点故障。

  1. 保障 Web 服务稳定性
  • Apache 作为成熟的 Web 服务器,兼容性强、配置灵活,可稳定运行 PHP、Python 等动态业务代码,同时通过模块(如 mod_cache、mod_gzip)优化静态资源访问性能;

  • 多台 Apache 组成集群,通过 LVS 分摊请求压力,单节点故障时,LVS 自动将请求转发至其他健康节点,保障服务连续性。

  1. 实现数据一致性与共享
  • NFS(网络文件系统)作为共享存储,将所有 Web 服务器的静态资源(如 /images、/css 目录)与动态上传目录(如 /uploads)挂载至 NFS 服务器,实现 "多节点访问同一存储资源",彻底解决数据同步问题;

  • NFS 支持权限控制与读写分离(可选配置),可保障资源访问安全性与存储性能。

  1. 降低运维复杂度
  • 架构模块化设计,各组件职责清晰(LVS 负责转发、Apache 负责服务、NFS 负责存储),便于故障定位与单独扩展;

  • 新增 Web 节点时,仅需安装 Apache 并挂载 NFS 目录,无需重复部署资源,运维效率提升 80% 以上。

项目价值与预期目标

通过部署《Keepalived + LVS(DR)+ Apache + NFS》架构,预期实现以下业务与技术价值:

  1. 业务连续性:Web 服务可用性从 99.9% 提升至 99.99%(年均 downtime 从 8.76 小时降至 52.56 分钟),核心业务场景(如电商促销、在线考试)无服务中断风险;

  2. 性能提升:并发承载能力从单台服务器 3000 并发提升至集群 10 万 + 并发,页面响应时间稳定在 500ms 以内,用户体验显著优化;

  3. 运维效率:资源部署与更新效率提升 80%,新增节点时间从 2 小时缩短至 15 分钟,减少重复人工操作;

  4. 扩展性:支持 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 存储服务器

网络说明:

  1. 所有主机:第一块网卡名为 ens33,第二块网卡名为 ens192
  2. 默认第一块网卡模式为nat,第二块网卡模式为hostonly
  3. 网关设置: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加入后端虚拟主机中。

相关推荐
七夜zippoe5 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
Fcy6487 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满7 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠7 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
主机哥哥7 小时前
阿里云OpenClaw部署全攻略,五种方案助你快速部署!
服务器·阿里云·负载均衡
Harvey9037 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技9 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀9 小时前
Linux环境变量
linux·运维·服务器
zzzsde9 小时前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
聆风吟º11 小时前
CANN开源项目实战指南:使用oam-tools构建自动化故障诊断与运维可观测性体系
运维·开源·自动化·cann