目 录
1 项目概述
1.1 项目背景
1.2 项目功能
2 项目的部署
2.1 部署环境介绍
2.2 项目的拓扑结构
2.3 项目环境调试
2.4 项目的部署
2.5 项目功能的验证
2.6 项目对应服务使用的日志
3 项目的注意事项
3.1 常见问题与解决方案
3.2 项目适用背景
1 项目概述
1.1 项目背景
乙公司近年来业务规模快速扩张,线上用户量和访问量激增,现有单台Web服务器已无法承载高并发请求,导致以下问题频发:
服务响应延迟:用户访问网页时常出现卡顿,平均响应时间超过3秒,严重影响用户体验。
频繁服务中断:高峰期服务器CPU和内存利用率长期超过90%,多次因资源耗尽触发宕机。
业务损失风险:618、双十一等大促期间,订单提交失败率高达15%,直接影响公司营收。
为保障业务连续性并提升服务质量,需对现有架构进行升级,核心需求包括:
高并发支持:单台服务器峰值QPS不足1000,需扩展至多节点分担流量。
高可用保障:消除单点故障,实现故障自动切换,确保服务SLA≥99.9%。
资源统一管理:静态内容(商品图片、HTML模板)需多节点实时同步,避免人工维护不一致。
经技术评估,采用 LVS-DR + Keepalived + NFS + Nginx 架构实现:
负载均衡:通过LVS(Linux Virtual Server)将流量分发至多台Web服务器,支持横向扩展。
故障自动转移:Keepalived实现主备节点VIP漂移,切换时间<2秒。
共享存储:NFS统一托管静态资源,确保各节点内容一致性。
性能监控:集成Prometheus对服务器状态、流量调度实时监控。
本项目实施后,乙公司服务器压力问题将得到根本解决,为后续业务增长提供稳定技术支撑。
1.2 项目功能
1.1.1项目优势
高可用性:无单点故障,主备切换时间秒级。
高性能:DR模式避免LVS Director成为带宽瓶颈。
低成本:完全基于开源软件,无需硬件负载均衡设备。
易扩展:横向增加Real Server即可提升处理能力。
1.1.2 功能介绍
(1)负载均衡(LVS-DR)
功能描述:
通过Linux Virtual Server(LVS)的直接路由(DR)模式,将客户端请求分发到多台后端Real Server(Web服务器)。
调度算法:支持轮询(rr)、加权轮询(wrr)等,本项目采用rr实现简单均衡。
高性能:DR模式下,Real Server直接响应客户端,避免LVS Director成为带宽瓶颈。
技术实现:
LVS Director通过内核模块ip_vs管理流量转发。
Real Server需绑定VIP到本地回环接口(lo:1),并配置ARP抑制。
(2)高可用(Keepalived)
功能描述:
实现LVS Director的主备故障自动切换,避免单点故障。
VIP漂移:主节点故障时,备节点自动接管虚拟IP(10.1.1.140)。
健康检查:定期检测Real Server的80端口,自动剔除故障节点。
技术实现:
基于VRRP协议(虚拟路由冗余协议)实现主备协商。
通过TCP_CHECK机制监控Real Server状态。
(3)统一内容分发(NFS共享存储)
功能描述:
使用NFS(网络文件系统)在多台Web服务器间共享静态资源(如HTML、图片等),确保内容一致性。
实时同步:所有Web服务器挂载同一NFS目录,文件修改即时生效。
权限控制:通过/etc/exports限制仅允许Real Server访问。
技术实现:
NFS服务端导出目录:/nfs/web。
Web客户端挂载:mount -t nfs 10.1.1.134:/nfs/web /var/www/html/shared。
(4)Web服务(Nginx)
功能描述:
部署Nginx作为Real Server的Web服务器,提供静态内容服务。
多节点区分:通过不同index文件(如index1.html、index2.html)标识不同Real Server。
容灾测试:关闭任意Web节点后,LVS自动将流量切至存活节点。
技术实现:
Nginx配置根目录指向NFS共享路径:root /var/www/html/shared。
监听VIP和本地IP的80端口。
(5)自动化运维支持
日志监控:
Keepalived日志(/var/log/messages):记录VIP漂移和健康检查事件。
Nginx日志(/var/log/nginx/access.log):统计客户端访问情况。
一键启停:
通过systemctl管理服务(如systemctl restart keepalived)。
2 项目的部署
2.1 部署环境介绍
系统版本: CentOS 7.x
软件版本:
keepalived-1.3.5, ipvsadm-1.27, nginx-1.20.1, nfs-utils-1.3.0
2.2 项目的拓扑结构
2.3 项目环境调试
LVS-master | 10.1.1.130 |
LVS-node01 | 10.1.1.131 |
Web01-RS | 10.1.1.132 |
Web02-RS | 10.1.1.133 |
NFS | 10.1.1.134 |
VIP | 10.1.1.140 |
全部机子都需要操作
2.3.1配置静态ip
以10.1.1.130为例
vi /etc/sysconfig/network-scripts/ifcfg-ens33
systemctl restart network
2.3.2关闭防火墙和selinux(环境是centos7,个别机子需要关闭两个防火墙)
systemctl stop firewalld
systemctl disable firewalld
systemctl stop iptables
systemctl disable iptables
vi /etc/selinux/config
将enforcing修改成disabled
#重启生效
reboot
2.3.3连通性测试
ping www.baidu.com
ping 10.1.1.140
ping 10.1.1.131
ping 10.1.1.132
ping 10.1.1.133
ping 10.1.1.134
2.4 项目的部署
2.4.1 Master节点操作(keepalived主节点10.1.1.130)
(1)修改主机名
hostnamectl set-hostname master-hn
bash
(2)安装keepalived ipvsadm
yum -y install keepalived ipvsadm
(3)加载内核模块
modprobe ip_vs
(4)备份keepalived配置文件
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
(5)修改配置文件
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs { router_id LVS_MASTER } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 10 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.1.1.140 } } virtual_server 10.1.1.140 80 { delay_loop 15 lb_algo rr lb_kind DR ! persistence_timeout 50 protocol TCP real_server 10.1.1.132 80 { weight 1 TCP_CHECK { connect_port 80 connect_timeout 3 nb_get_retry 3 delay_before_retry 4 } } real_server 10.1.1.133 80 { weight 1 TCP_CHECK { connect_port 80 connect_timeout 3 nb_get_retry 3 delay_before_retry 4 } } } |
2.4.2 node01节点操作keepalived备节点(10.1.1.131)
(1)克隆一台master节点作为node01节点并且修改ip为10.1.1.131,并且修改主机名为node01
hostnamectl set-hostname node01-hn
Bash
(2)修改备机keepalived配置文件
修改router id
修改state BACKUP
修改优先权(低于master)
注意:只需要修改这三个地方
2.4.3 keepalived服务启动,查看,关闭的方法介绍
(1)主备启动keepalived并设置开机自启和查看状态
systemctl start keepalived #开启服务
systemctl enable keepalived #开机自启
systemctl status keepalived #查看状态
systemctl stop keepalived #关闭服务
systemctl restart keepalived #重启服务
(2)检查VIP绑定
ip addr show dev ens33
实际状态为 MASTER 的主服务器将为 ens33 接口自动添加 VIP 地址,通过 ip 命令可以查看。
10.1.1.140 是一个浮动 VIP(虚拟 IP),同一时间只有一个节点会持有这个 VIP,/32 表示这是一个单机 IP,此时只有主节点会有这个ip,从节点时没有的
(3)查看LVS规则,列出所有RS及调度状态(RR/WLC等)
ipvsadm -ln
(4)正常状态确认
VIP绑定正确
主节点(10.1.1.130)成功持有VIP 10.1.1.140(ip addr show显示10.1.1.140/32),备节点未绑定VIP,符合预期。
IPVS规则完整
主备节点的 ipvsadm -ln 均显示两台Real Server(10.1.1.132和10.1.1.133),调度算法为轮询(rr),转发模式为DR(Route)。
主备切换逻辑
备节点(node01)重启Keepalived后未抢占VIP,说明 state BACKUP 和 priority 配置已生效。
2.4.4 NFS配置(10.1.1.134)
(1)修改主机名
hostnamectl set-hostname NFS-hn
Bash
(2)安装 NFS 工具
yum install -y nfs-utils
(3)创建共享目录(把文件内容共享给web服务器),设置权限
mkdir -p /nfs/web
chmod 777 /nfs/web
(4)修改exports文件,把web服务器ip暴露给nfs,允许 Web 主机 IP 访问
vi /etc/exports
/nfs/web 10.1.1.132(rw,sync,no_root_squash,no_subtree_check)
/nfs/web 10.1.1.133(rw,sync,no_root_squash,no_subtree_check)
(5)启动nfs并设置开机自启
2.4.5 web(10.1.1.132和10.1.1.132)配置,搭建(RS真实后端服务器)
Web02除了IP为10.1.1.133,其他配置和web01相同
(1)修改主机名:
hostnamectl set-hostname web01-hn
Bash
(2)安装 NFS 客户端工具
yum install -y nfs-utils
(3)启动nsf服务
systemctl start nfs-server
systemctl enable nfs-server
(4)创建本地挂载点,并且把共享目录挂载到本地挂载点
mkdir -p /var/www/html/shared
mount -t nfs 10.1.1.134:/nfs/web /var/www/html/shared
如果一直挂载不能成功,查看配置都没有问题,可能是centos的防火墙iptables的问题,需要关掉重新挂载
(5)设置永久挂载
vi /etc/fstab
10.1.1.134:/nfs/web /var/www/html/shared nfs defaults 0 0
mount -a测试挂载,如果无报错,说明修复成功。
(6)df -h | grep nfs # 查看挂载信息
cat /var/www/html/shared/index.html # 应显示 NFS 服务端的 IP
(7)安装nginx
yum install -y epel-release # 安装 EPEL 仓库
yum install -y nginx
(8)启动nginx
systemctl start nginx
systemctl status nginx
systemctl enable nginx
如果启动失败
查看80端口是否被别的应用占用,比如apache
ss -tulnp | grep ':80'
如果被占用可以关闭并禁止开机自启,再进行启动nginx
systemctl stop httpd
systemctl disable httpd
(9)检查nfs中共享目录的内容web01和web02中是否能查看
cd /var/www/html/shared/
cat index.html
2.5 项目功能的验证
2.5.1 验证VIP漂移和LVS流量分发是否均衡
(1)原来的状态
关闭主机点的keepalived后的状态对比
2.5.2 验证NFS共享
Nfs服务器上:
(1)查看nfs配置
exportfs -v
(2)创建测试文件
echo $(hostname -I | awk '{print $1}') > /nfs/web/index.html # 写入本机 IP 到 HTML 文件
(3)进行测试
暴露共享位置,一定要先启动服务再暴露位置,不然会报错
showmount -e 10.1.1.134
showmount -e localhost # 显示本地导出的 NFS 共享目录
Web01/02上:
showmount -e 10.1.1.134 # 替换为你的 NFS 服务器 IP
2.5.3 nginx网页测试
(1)查看nginx的网页文件存储目录
rpm -ql nginx |grep html
(2)为了区分web01与web02的内容,配置nginx
在服务器134上:
cd /nfs/web/
ls
mv index.html index1.html
echo "Web01 index.html" > index1.html
echo "Web02 index.html" > index2.html
在web01和web02上查看是否共享配置文件:
Web01和web02上操作:
vi /etc/nginx/conf.d/web01.conf
server {
listen 80;
server_name 10.1.1.132;
location / {
root /var/www/html/shared;
index index1.html;
}
}
systemctl restart nginx
vi /etc/nginx/conf.d/web02.conf
server {
listen 80;
server_name 10.1.1.133;
location / {
root /var/www/html/shared;
index index2.html;
}
}
配置内核参数
vi /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.ip_forward=0
sysctl -p 更新
添加虚拟IP(两台web对要)
yum install -y net-tools #安装工具包
ifconfig lo:1 10.1.1.140 netmask 255.255.255.255 broadcast 10.1.1.140 up
增加路由
route add -host 10.1.1.140 dev lo:1
route -n
(3)正式测试nginx网页
在网页输入虚拟ip,10.1.1.140,出现以下界面
关掉web02
可看到web01内容
如果再启动web02,关掉web01
又可以看到web02内容
2.6.1 Keepalived(LVS主备节点)
日志文件:/var/log/messages
作用:主日志文件,记录VRRP状态切换、VIP漂移、健康检查结果
journalctl -u keepalived
查找方法:grep keepalived /var/log/messages
示例:
日志文件:journalctl -u keepalived
作用:Systemd日志,详细记录服务启停和错误(需配置log_facility后更完整)
查看方法:journalctl -u keepalived -f
示例:
2.6.2 LVS(IPVS内核模块)
日志文件:ipvsadm -lcn
作用:实时连接状态,显示当前活动的LVS连接和RS状态
查看方法:watch -n 1 ipvsadm -lcn
示例:
2.6.3 NFS Server(10.1.1.134)
日志文件:/var/log/messages
作用:记录NFS服务启停、客户端挂载/访问权限错误
查看方法:grep nfs /var/log/messages
示例:
2.6.4 Nginx(Web1/Web2节点)
日志文件:/var/log/nginx/access.log
作用:所有客户端访问记录(IP、请求路径、状态码等
查看方法:tail -f /var/log/nginx/access.log
示例:
日志文件:/var/log/nginx/error.log
作用:Nginx错误日志(配置错误、权限问题等)
查看方法:tail -f /var/log/nginx/error.log
示例:
日志文件:/var/log/messages
作用:系统级Nginx服务启停记录(通过Systemd管理时)
查看方法:grep nginx /var/log/messages
示例:
3 项目的注意事项
3.1 常见问题与解决方案
3.1.1 VIP无法漂移
原因:VRRP组播通信被防火墙阻止,或主备节点优先级配置错误。
解决:
检查防火墙是否放行VRRP协议:firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
确认主节点priority高于备节点(如主100,备50)。
使用tcpdump -i ens33 vrrp抓包验证组播通信。
3.1.2 LVS规则中缺少部分Real Server
原因:Real Server的健康检查失败(Nginx未启动或端口不通)。
解决:
在LVS节点测试RS端口:telnet 10.1.1.132 80
检查RS的Nginx状态:systemctl status nginx
查看Keepalived日志:grep "TCP_CHECK" /var/log/messages
3.1.3 NFS挂载失败
原因:防火墙未放行NFS端口(2049、111),或SELinux限制。
解决:
开放NFS端口:firewall-cmd --add-service=nfs --permanent
临时关闭SELinux:setenforce 0
检查挂载日志:grep mountd /var/log/messages
3.1.4 备节点异常持有IPVS规则
原因:备节点误配置为state MASTER。
解决:
修改备节点配置:state BACKUP,并降低priority(如50)。
清理异常规则:ipvsadm -C && systemctl restart keepalived
3.1.5 访问VIP返回502错误
原因:Real Server未正确绑定VIP到本地回环接口。
解决:
在RS上执行:ifconfig lo:1 10.1.1.140 netmask 255.255.255.255 up
添加永久路由:echo "route add -host 10.1.1.140 dev lo:1" >> /etc/rc.local
3.1.6 NFS共享内容不同步
原因:挂载点权限不足或客户端未重新挂载。
解决:
服务端设置权限:chmod -R 777 /nfs/web
客户端强制重新挂载:mount -o remount /var/www/html/shared
3.2 项目适用背景
适用场景
高并发Web服务:需要横向扩展多台Web服务器分担流量压力。
静态资源一致性:通过NFS共享HTML、图片等静态文件,确保各节点内容一致。
低成本高可用:利用开源软件(LVS+Keepalived)替代硬件负载均衡设备。
不适用场景
高性能数据库集群:LVS的DR模式不适合频繁写入的数据库负载均衡。
跨地域部署:NFS对网络延迟敏感,异地场景建议改用CDN或分布式存储(如MinIO)。