Keepalived + LVS(DR)+ Nginx + NFS
Keepalived LVSDR Nginx NFS项目背景业务场景与核心需求随着企业数字化转型加速Web 服务作为业务对外输出的核心载体其高可用性、高并发承载能力、数据一致性成为支撑业务稳定运行的关键。以电商平台、企业官网、在线教育等典型场景为例需满足以下核心需求高可用保障Web 服务需实现 7×24 小时不间断运行避免因单点故障如服务器宕机、网络中断导致业务中断尤其在促销活动、峰值访问时段服务不可用将直接造成经济损失或用户流失高并发承载面对日益增长的用户访问量如日均 PV 从 10 万级提升至百万级单台 Web 服务器的 CPU、内存、网络带宽易成为瓶颈需通过负载均衡分摊请求压力保障页面响应速度目标95% 请求响应时间1 秒数据一致性Web 服务涉及大量静态资源如 HTML、CSS、图片、视频与动态业务数据如用户上传文件、订单记录多台 Web 服务器需共享资源避免出现 “不同服务器展示内容不一致”如用户在 A 服务器上传的图片在 B 服务器无法访问的问题易维护与扩展性业务增长过程中需支持快速新增 Web 节点扩展集群能力同时减少运维复杂度如避免每台服务器重复部署资源、手动同步配置。传统架构的痛点与局限在采用《Keepalived LVSDR 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 LVSDR Apache NFS》组合正是基于以下核心诉求选型解决高可用与负载均衡LVSDirect Routing 模式作为四层负载均衡器具备超高并发承载能力单机可支撑 10 万 并发连接通过 DR 模式避免 “请求回程流量” 占用带宽保障转发效率Keepalived 通过 VRRP 协议实现 LVS 主备高可用主节点故障时备节点可在 1-3 秒内自动接管虚拟 IPVIP实现 “无感知切换”彻底消除负载均衡层单点故障。保障 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 LVSDR 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.lzh.cloud10.1.1.21无客户端client1.lzh.cloud10.1.8.21无客户端router.lzh.cloud10.1.1.20, 10.1.8.20无路由器ha1.lzh.cloud10.1.8.1410.1.8.100HA 和 LVS 服务器ha2.lzh.cloud10.1.8.1510.1.8.100HA 和 LVS 服务器web1.lzh.cloud10.1.8.11, 10.1.2.1110.1.8.100Web 服务器web2.lzh.cloud10.1.8.12, 10.1.2.1210.1.8.100Web 服务器web3.lzh.cloud10.1.8.13, 10.1.2.1310.1.8.100Web 服务器nfs.lzh.cloud10.1.2.100无存储服务器网络说明所有主机第一块网卡名为 ens33第二块网卡名为 ens192默认第一块网卡模式为nat第二块网卡模式为hostonly网关设置10.1.1.0/24 网段网关为10.1.1.2010.1.8.0/24 网段网关为10.1.8.20基础配置主机名IP 地址网关## 网关配置命令参考## 10.1.1.0/24 网段网关为10.1.1.20nmcli connection modify ens33 ipv4.gateway10.1.8.20 nmcli connection up ens33## 10.1.8.0/24 网段网关为10.1.8.20nmcli connection modify ens33 ipv4.gateway10.1.1.20 nmcli connection up ens33配置 router## 开启路由echonet.ipv4.ip_forward1/etc/sysctl.conf## 或者## sed -i s/ip_forward0/ip_forward1/g /etc/sysctl.confsysctl-p配置免密登录-可选[rootclient ~]##echoStrictHostKeyChecking no/etc/ssh/ssh_config ssh-keygen-trsa-f.ssh/id_rsa-Nforhostinserver server{1..5};dossh-copy-id root$host;doneforhostinserver server{1..5};doscp/etc/ssh/ssh_config root$host:/etc/ssh/ssh_config;doneforhostinserver server{1..5};dosshroot$hosthostname;done## 同步/etc/hosts文件forhostinserver server{1..5};doscp/etc/hosts root$host:/etc/hosts;done配置 nfs## 安装软件yuminstall-ynfs-utils## 准备共享目录和文件mkdir/usr/share/nginx/html-pechoWelcome to www.lzh.cloud/usr/share/nginx/html/index.html## 配置共享echo/usr/share/nginx/html 10.1.2.0/24(rw,sync)/etc/exports## 启用并启动服务systemctlenablenfs-server.service--now配置 web[rootweb1-3 ~]### 部署 webyuminstall-ynginxechoWelcome to$(hostname)/usr/share/nginx/html/index.html systemctlenablenginx.service--now## 访问后端 web[rootclient1 ~]## curl 10.1.8.11Welcome to web1.lzh.cloud[rootclient1 ~]## curl 10.1.8.12Welcome to web2.lzh.cloud[rootclient1 ~]## curl 10.1.8.13Welcome to web3.lzh.cloud## 配置NFS挂载[rootweb1-3 ~]#yuminstall-ynfs-utilsecho10.1.2.100:/usr/share/nginx/html /usr/share/nginx/html nfs defaults 0 0/etc/fstab systemctl daemon-reloadmount-adf/usr/share/nginx/html配置 LVS-RS所有后端主机都要做相同配置。[rootweb1-3 ~]### 增加虚拟网卡nmcli connectionaddtypedummy ifname dummy con-name dummy ipv4.method manual ipv4.addresses10.1.8.100/32 nmcli connection up dummy## 配置arp参数关闭arp对dummy网卡的解析cat/etc/sysctl.confEOF 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 EOFsysctl-p配置 HA 和 LVS-DS配置 ha1yuminstall-ykeepalived ipvsadmcp/etc/keepalived/keepalived.conf{,.bak}vim/etc/keepalived/keepalived.conf!Configuration Fileforkeepalived global_defs{router_id ha1}vrrp_instance web{state MASTER interface ens33 virtual_router_id51priority110advert_int1authentication{auth_type PASS auth_pass lzh123}virtual_ipaddress{10.1.8.100/24}}virtual_server10.1.8.10080{delay_loop6lb_algo rr lb_kind DR protocol TCP real_server10.1.8.1180{weight1TCP_CHECK{connect_timeout3retry3delay_before_retry3}}real_server10.1.8.1280{weight2TCP_CHECK{connect_timeout3retry3delay_before_retry3}}real_server10.1.8.1380{weight2TCP_CHECK{connect_timeout3retry3delay_before_retry3}}}systemctlenablekeepalived.service--now配置 ha2yuminstall-ykeepalived ipvsadmcp/etc/keepalived/keepalived.conf{,.bak}vim/etc/keepalived/keepalived.conf!Configuration Fileforkeepalived global_defs{router_id ha2}vrrp_instance web{state BACKUP interface ens33 virtual_router_id51priority100advert_int1authentication{auth_type PASS auth_pass lzh123}virtual_ipaddress{10.1.8.100/24}}virtual_server10.1.8.10080{delay_loop6lb_algo rr lb_kind DR protocol TCP real_server10.1.8.1180{weight1TCP_CHECK{connect_timeout3retry3delay_before_retry3}}real_server10.1.8.1280{weight1TCP_CHECK{connect_timeout3retry3delay_before_retry3}}real_server10.1.8.1380{weight1TCP_CHECK{connect_timeout3retry3delay_before_retry3}}}systemctlenablekeepalived.service--now测试功能性测试[rootclient1 ~]## while true ;do curl -s http://10.1.8.100;sleep 1;doneWelcome to www.lzh.cloud......[rootclient2 ~]## while true ;do curl -s http://10.1.8.100;sleep 1;doneWelcome to www.lzh.cloud......高可用测试持续监控集群可用性。[rootclient2 ~]## while true ;do curl -s http://10.1.8.100;sleep 1;done......测试1停止 ha1 上 keepalived 服务。[rootha1 ~]## systemctl stop keepalived.service结果客户端无感知故障正常访问集群。测试2恢复 ha1 上 keepalived 服务。[rootha1 ~]## systemctl start keepalived.service结果客户端无感知故障正常访问集群。负载均衡测试测试1停止 web2 上 httpd 服务监控客户端访问情况。[rootweb2 ~]## systemctl stop httpd.httpd结果大概 15 秒LVS 将 web2 从后端虚拟主机中剔除。测试2启动 web2 上 httpd 服务监控客户端访问情况。[rootweb2 ~]## systemctl start httpd.service结果**客户端无感知故障正常访问集群。测试2恢复 ha1 上 keepalived 服务。[rootha1 ~]## systemctl start keepalived.service结果客户端无感知故障正常访问集群。负载均衡测试测试1停止 web2 上 httpd 服务监控客户端访问情况。[rootweb2 ~]## systemctl stop httpd.httpd结果大概 15 秒LVS 将 web2 从后端虚拟主机中剔除。测试2启动 web2 上 httpd 服务监控客户端访问情况。[rootweb2 ~]## systemctl start httpd.service结果大概 5 秒LVS将web2加入后端虚拟主机中。