高可用Web集群架构部署实验
构建一个基于Keepalived+LVS+Nginx+NFS+DNS的高可用Web集群,实现负载均衡、高可用和共享存储。
整体架构原理:客户端 → DNS解析 → VIP → LVS负载均衡 → Nginx Web服务器 → NFS共享存储
实验原理
架构:
DNS层:域名解析,提供访问入口
负载均衡层:请求分发和高可用
Web服务层:处理HTTP请求
存储层:数据共享和一致性保证
DNS解析流程
用户输入 www.example.com
↓
DNS服务器解析为 192.168.70.100 (VIP)
↓
客户端直接访问VIP
LVS负载均衡流程(DR模式)
1. 客户端发送请求到VIP (192.168.70.100)
2. LVS接收请求,根据调度算法选择后端服务器(rs1或rs2)
3. LVS修改目标MAC地址为选中的Web服务器MAC,转发请求
4. Web服务器通过lo:0接口接收请求,处理并直接返回响应给客户端
5. 客户端收到响应,源IP仍是VIP
Keepalived高可用原理
主LVS节点:定期发送VRRP广播,宣告自己是VIP拥有者
备LVS节点:监听VRRP广播
↓
主节点故障 → 备节点收不到VRRP广播
↓
备节点等待超时 → 宣布自己为主节点
↓
备节点接管VIP → 服务继续
实验环境要求
-
操作系统:RedHat/CentOS 7/8
-
虚拟化平台:VMware/VirtualBox
-
虚拟机数量:6台(最低配置)或7台(推荐配置

虚拟机规划
| 主机 | 系统 | 软件 | IP | 主要功能 |
| client | Redhat9.7 | bind-utils | 192.168.70.115/24 |
客户端测试 |
| lvs-master | Redhat9.7 |
keepalived ipvsadm |
VIP:192.168.70.100/32 DIP:192.168.70.116/24 |
LVS主负载均衡器 Keepalived MASTER |
| lvs-backup | Redhat9.7 |
keepalived ipvsadm |
VIP:192.168.70.100/32 DIP:192.168.70.117/24 |
LVS备份负载均衡器 Keepalived BACKUP |
| rs1 | Redhat9.7 |
nginx、nfs-utils | 192.168.70.118/24 |
Web服务器1 NFS客户端 |
| rs2 | Redhat9.7 |
nginx、nfs-utils | 192.168.70.119/24 |
Web服务器2 NFS客户端 |
| nfs-dns | Redhat9.7 | nfs-utils、bind | 192.168.70.120/24 |
NFS服务器 DNS主服务器 |
| dns | Redhat9.7 | bind-utils | 192.168.70.121/24 |
DNS从服务器 + 监控节点 |
部署流程:
环境准备:创建7台虚拟机,配置网络
环境准备时,可以先提前创建一台虚拟机,并对其进行相应的配置,比如仓库那些配置好,还有相关的软件下载好,然后关机拍摄快照之后,可以在那一台配置好的虚拟机进行克隆,克隆出7台虚拟机并且拍摄快照,方便后面配置错误恢复和做其他实验时不用再次创建新的虚拟机,节约时间。
首先使用命令对每台主机进行命名,方便做实验的时候区分(这里以client主机为例)
hostnamectl set-hostname client && bash
然后再用命令对每台主机的IP进行修改
nmcli c modify ens160 ipv4.method manual
ipv4.addresses 192.168.70.115/24
ipv4.gateway 192.168.70.2
ipv4.dns 223.5.5.5 connection.autoconnect yes
注意:若你的主机有多种模式并存,使用命令nmcli device status查看对应模式的设备名称如ens160,然后根据命令修改IP

若存在多个模式使用nmcli c mod "Wired connection 1" connection.id 网卡名 这个命令,将系统自动生成的、无意义的默认名称改为有意义的、标准化的名称,从而提升网络管理的效率、准确性和可维护性。
接下来关闭selinux和防火墙,在实验环境中关闭防火墙和SELinux的主要原因是为了简化配置和避免安全策略对集群组件间通信的干扰。防火墙默认会阻止LVS、Keepalived、NFS、DNS等服务所需的端口和协议,导致集群无法正常通信;SELinux的强制访问控制会严格限制Nginx访问共享目录、NFS共享文件等正常操作。关闭这两者可以让我们专注于集群架构的搭建和验证,而不必花费大量时间调试复杂的安全策略规则,确保实验顺利进行。在生产环境中则必须重新开启并配置合适的安全策略。
关闭selinux,有两种方法,暂时关闭和永久关闭
#查看selinux状态 (有enforcing和permissive 两种状态 前面为开启后面为关闭)
getenforce
# 临时关闭SELinux(重启后恢复)
setenforce 0 # 关闭
setenforce 1 # 开启
# 永久关闭(修改配置文件)
sed -i "s/SELINUX=enforcing/SELINUX=permissive/" /etc/selinux/config
关闭防火墙,在需要彻底关闭防火墙时,可使用 systemctl disable --now firewalld.service 命令来立即停止并永久禁用FirewallD服务,但需注意这会带来安全风险,通常仅在部署替代防火墙方案或特定调试环境下进行。以下命令根据需求选择运用,在其他地方也要根据提供的要求进行相应端口的开放与关闭进行防火墙配置
# 禁用防火墙会暴露系统安全风险
#停止服务,但开机仍会启动,临时停止
systemctl stop firewalld
#禁用开机启动,但不停止当前运行的服务,仅影响下次启动
systemctl disable firewalld
#停止服务并禁用开机启动,立即生效+永久生效
systemctl disable --now firewalld
#完全屏蔽服务(无法手动启动),更严格的禁用
systemctl mask firewalld
# 查看 FirewallD 状态
systemctl status firewalld
# 查看是否开机自启
systemctl is-enabled firewalld
# 查看所有服务状态
systemctl list-unit-files | grep firewalld
以上七台主机都要进行相应的配置操作,将基础环境创建
NFS+DNS主服务器配置(nfs-dns主机)
在nfs-dns主机上配置nfs
NFS的作用,数据共享:多台服务器访问相同数据,配置统一:所有服务器使用相同配置文件,日志集中:所有日志集中存储,便于分析,部署简化:更新一次,所有服务器生效
#安装nfs-utils
dnf install nfs-utils -y
#创建共享文件
mkdir /share
#添加内容
echo "this is nfs share"> /share/index.html
#修改文件权限
chown -R nobody: /share
chmod 755 /share
#查看文件是否更改
ll -d /share
#配置nfs
mkdir -p /share/rs1 /share/rs2
echo "web01 192.168.70.118" > /share/rs1/index.html
echo "web02 192.168.70.119" > /share/rs2/index.html
vim /etc/exports
#文件的内容如下
/share/rs1 192.168.70.118(rw,sync,no_subtree_check)
/share/rs2 192.168.70.119(rw,sync,no_subtree_check)
/share 192.168.70.0/24(ro,sync,no_subtree_check
#配置生效
exportfs -ra
exportfs -v
#启动服务
systemctl start nfs-server
#验证配置
showmount -e 192.168.70.120 或者 showmount -e localhost
验证结果

在nfs-dns主机上配置dns
DNS的作用:域名解析:将人类可读的域名转换为IP地址,负载均衡:DNS轮询提供简单负载均衡,故障转移:配合健康检查实现域名级别故障转移,运维便利:方便IP变更,客户端无需修改
#安装bind
dnf install -y bind
# 备份原始配置
cp /etc/named.conf /etc/named.conf.backup
#配置dns
vim /etc/named.conf
#文件的内容如下:
options {
listen-on port 53 { 127.0.0.1; 192.168.70.120; };
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { localhost; 192.168.70.0/24; };
recursion yes;
dnssec-validation no;
dnssec-enable no;
bindkeys-file "/etc/named.root.key";
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
zone "example.com" IN {
type master;
file "example.com.zone";
allow-transfer { 192.168.70.121; };
notify yes;
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
#编写区域数据文件
cp -p /var/named/named.localhost /var/named/example.com.zone
#创建正向解析区域文件
vim /var/named/example.com.zone
#文件内容如下:
$TTL 1D
@ IN SOA ns1 admin.example.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns1
NS ns2
ns1 A 192.168.70.120
ns2 A 192.168.70.121
www A 192.168.70.100
# 设置区域文件权限
chown named:named /var/named/example.com.zone
chmod 640 /var/named/example.com.zone
# 检查配置文件语法
named-checkconf /etc/named.conf
named-checkzone example.com /var/named/example.com.zone
#启动主服务器
systemctl start named
# 测试DNS解析
dig @192.168.70.120 www.example.com +short
验证结果

Web服务器配置(rs1、rs2):安装nginx,挂载NFS共享
Nginx的作用:Web服务:处理HTTP/HTTPS请求,反向代理:可配合LVS做七层负载均衡,静态资源:高效处理静态文件,动态代理:转发请求到应用服务器,状态监控:提供状态页面供LVS健康检查
配置rs1
#安装nginx和nfs-utils
dnf install nginx nfs-utils wget net-tools -y
#挂载目录(临时)
mount -t nfs 192.168.70.120:/share/rs1 /usr/share/nginx/html
#永久挂载
echo "192.168.70.120:/share/rs1 /usr/share/nginx/html nfs defaults,_netdev 0 0" >> /etc/fstab
#验证挂载
df -h | grep nfs
ls /usr/share/nginx/html/
#结果 index.html
#启动nginx
systemctl start nginx
#运行测试
curl 192.168.70.118
#配置VIP
ifconfig lo:1 192.168.70.100 netmask 255.255.255.255 up
#查看是否配置成功
ip a show lo
#搭建web01
#配置nginx
vim /etc/nginx/conf.d/example.conf
#文件内容
server {
listen 80;
server_name www.example.com;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
# 配置虚拟IP(VIP)用于DR模式
# 临时配置
ifconfig lo:0 192.168.70.100 netmask 255.255.255.255 up
route add -host 192.168.70.100 dev lo:0
#配置内核参数 由于我们采用的 DR 模式,因此我们需要为两台 RS 服务器配置内核参数。
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
#启动Nginx服务
nginx -t # 测试配置
systemctl enable --now nginx
# 测试本地访问
curl http://localhost
curl http://192.168.70.118
curl http://192.168.70.118/server_info.html

配置rs2
#安装nginx和nfs-utils
dnf install nginx nfs-utils -y
#挂载目录(临时)
mount -t nfs 192.168.70.120:/share/rs2 /usr/share/nginx/html
#永久挂在
echo "192.168.70.120:/share/rs2 /usr/share/nginx/html nfs defaults,_netdev 0 0" >> /etc/fstab
# 验证挂载
df -h | grep nfs
ls /usr/share/nginx/html/
#结果 index.html
#启动nginx
systemctl start nginx
#运行测试
curl 192.168.70.119
#配置VIP
ifconfig lo:1 192.168.70.100 netmask 255.255.255.255 up
#查看是否配置成功
ip a show lo
#搭建web02
#配置nginx
vim /etc/nginx/conf.d/example.conf
#文件内容
server {
listen 80;
server_name www.example.com;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
#配置内核参数 由于我们采用的 DR 模式,因此我们需要为两台 RS 服务器配置内核参数。
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
# 启动Nginx
nginx -t
systemctl enable --now nginx
#测试
curl http://localhost
curl http://192.168.70.119
curl http://192.168.70.119/server_info.html
LVS主负载均衡器配置(lvs-master主机):主备节点安装配置
Keepalived的作用:VIP管理:在多个LVS节点间共享虚拟IP,健康监控:监控LVS和Web服务器状态,故障切换:主节点故障时自动切换到备节点,脑裂防护:避免多个节点同时声称拥有VIP
LVS的作用:流量分发:将请求均匀分发到后端服务器,多种算法:支持轮询、加权轮询、最少连接等,高性能:四层负载,转发效率高,会话保持:确保同一用户请求分发到同一服务器
keepalived+ipvsadm
#安装ipvsadm和keepaived
dnf install ipvsadm keepalived -y
#创建lvs的配置文件
ipvsadm-save -n > /etc/sysconfig/ipvsadm
#启动lvs
systemctl start ipvsadm
ipvsadm -Ln
#配置keepalived
cp /etc/keepalived/keepalived.conf{,.bak}
vim /etc/keepalived/keepalived.conf
#文件的内容如下:
global_defs {
router_id LVS_master
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
fall 3
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.70.100
}
#track_script {
# chk_nginx
#}
}
virtual_server 192.168.70.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.70.118 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 192.168.70.119 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
#编写检查脚本
#!/bin/bash
count=`ps -C nginx --no-header | wc -l`
if [ $count -eq 0 ]; then
/usr/bin/systemctl start nginx
sleep 1
if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then
/usr/bin/systemctl stop keepalived
fi
fi
#然后给这个脚本可执行权限
chmod +x /etc/keepalived/check_nginx.sh
ll /etc/keepalived/check_nginx.sh
#启动keepalived
systemctl start keepalived.service
#查看LVS规则
ipvsadm -Ln
#查看VIP
ip a show ens160
LVS备负载均衡器配置(lvs-backup主机)
#安装ipvsadm和keepaived
dnf install ipvsadm keepalived -y
#创建lvs的配置文件
ipvsadm-save -n > /etc/sysconfig/ipvsadm
#启动lvs
systemctl start ipvsadm
ipvsadm -Ln
#配置keepalived
#从lvs-master服务器上复制配置文件
scp 192.168.70.116:/etc/keepalived/* /etc/keepalived/
#修改keepalived配置文件
vim /etc/keepalived/keepalived.conf
#文件的内容如下:
global_defs {
router_id LVS_backup
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
fall 3
rise 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens160
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.70.100
}
#track_script {
# chk_nginx
#}
}
virtual_server 192.168.70.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.70.118 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 192.168.70.119 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
#确保脚本文件的可执行权限
ll /etc/keepalived/check_nginx.sh
#启动keepalived
systemctl start keepalived.service
#查看LVS规则
ipvsadm -Ln
#查看VIP
ip a show ens160
#此处没有VIP,因为VIP在 master 主机上。
DNS从服务器配置(monitor主机)
#安装bind
dnf install bind -y
#配置dns
vim /etc/named.conf
#文件内容如下:
options {
listen-on port 53 { 127.0.0.1; 192.168.70.121; };
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { localhost; 192.168.70.0/24; };
recursion yes;
dnssec-validation no;
dnssec-enable no;
bindkeys-file "/etc/named.root.key";
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
zone "example.com" IN {
type slave;
file "slaves/example.com.zone";
masters { 192.168.70.120; };
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
#创建slaves目录并设置权限
mkdir -p /var/named/slaves
chown named:named /var/named/slaves
chmod 770 /var/named/slaves
# 检查配置
named-checkconf /etc/named.conf
#启动主服务器
systemctl start named
# 验证从服务器同步
# 查看同步文件
ls -la /var/named/slaves/
# 测试解析
dig @192.168.70.121 www.example.com +short
客户端配置:配置DNS指向DNS服务器
#配置DNS
cat > /etc/resolv.conf << EOF
nameserver 192.168.70.120
nameserver 192.168.70.121
search example.com
EOF
# 2. 安装测试工具
dnf install bind-utils curl wget -y
# 测试DNS解析
nslookup www.example.com
dig www.example.com +short
#测试负载均衡
curl -s http://www.example.com/index.html
#测试VIP访问 创建脚本 vip-test.sh
curl -s http://192.168.70.100/index.html
# 4. 创建监控脚本
cat > /home/monitor_lvs.sh << 'EOF'
#!/bin/bash
# LVS集群监控脚本
VIP="192.168.70.100"
RS_LIST=("192.168.70.118" "192.168.70.119")
LVS_NODES=("192.168.70.116" "192.168.70.117")
echo "=== LVS集群状态监控 $(date) ==="
echo
echo "1. DNS解析检查:"
dig www.example.com +short
echo
echo "2. VIP连通性检查:"
ping -c 3 $VIP
echo
echo "3. 真实服务器状态:"
for rs in ${RS_LIST[@]}; do
STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://$rs/server_info.html)
if [ "$STATUS" = "200" ]; then
echo " $rs: UP (HTTP $STATUS)"
else
echo " $rs: DOWN (HTTP $STATUS)"
fi
done
echo
echo "4. LVS节点VIP状态:"
for node in ${LVS_NODES[@]}; do
VIP_STATUS=$(ssh root@$node "ip addr show ens160 | grep '192.168.70.100' 2>/dev/null")
if [ -n "$VIP_STATUS" ]; then
echo " $node: VIP ACTIVE (当前Master)"
else
echo " $node: VIP INACTIVE"
fi
done
EOF
chmod +x /home/monitor_lvs.sh
完整测试与验证
基础连通性测试
# 在客户端执行
# 1. 测试DNS解析
dig www.example.com ANY
dig -x 192.168.70.100
# 测试负载均衡
curl -s http://www.example.com
# 3. 测试会话持久性
curl -s --cookie "SESSION=test" http://www.example.com
测试结果
故障切换测试
# 1. 停止主LVS节点的keepalived服务192.168.70.116
systemctl stop keepalived
# 2. 观察VIP漂移(等待10秒)192.168.70.117
ip addr show ens160 | grep 192.168.70.100
# 3. 测试服务可用性
curl http://www.example.com/index.html
# 4. 恢复主节点192.168.70.116
systemctl start keepalived
# 5. 观察VIP是否回切192.168.70.116
ip addr show ens160 | grep 192.168.70.100
# 6. 测试后端服务器故障192.168.70.118
systemctl stop nginx
sleep 5
curl http://www.example.com/index.html
# 7. 恢复后端服务器192.168.70.118
systemctl start nginx
性能测试
# 安装压力测试工具
dnf install httpd-tools -y
# 进行压力测试
ab -n 1000 -c 50 http://www.example.com
# 监控各节点资源
ssh root@192.168.70.116 "top -b -n 1 | head -20"
ssh root@192.168.70.118 "top -b -n 1 | head -20"
项目总结
本实验成功构建了一个基于Keepalived+LVS+Nginx+NFS+DNS的企业级高可用Web集群架构。通过7台虚拟机实现了从域名解析、负载均衡、Web服务到共享存储的完整解决方案,展示了现代互联网服务的高可用性、可扩展性和故障容错能力。
高可用性验证:VIP自动漂移:主LVS故障时,VIP在5秒内自动切换到备机,服务不中断:任何单点故障不影响客户端访问,健康检查:故障节点自动剔除,恢复后自动加入
负载均衡验证:请求分发:按配置的权重(3:2)将请求分发到不同Web服务器,性能扩展:系统吞吐量随Web服务器数量线性增长,会话保持:支持连接持久化,确保用户体验
数据一致性验证:内容同步:所有Web服务器提供相同内容,日志集中:访问日志统一存储在NFS共享目录,配置统一:通过共享存储实现配置文件一致性
故障容错验证:LVS层故障:主备切换,服务不中断,Web层故障:故障服务器自动剔除,请求转发到健康节点,存储层故障:实验中的单点,实际生产需做高可用
实验局限性及改进
当前局限性:NFS单点故障:存储层没有高可用,安全配置简化:关闭了防火墙和SELinux,监控告警缺失:缺少实时监控和告警机制,备份恢复缺失:没有数据备份和灾难恢复方案,存储高可用:使用DRBD+Heartbeat或分布式存储,安全加固:配置防火墙规则和SELinux策略,监控部署:集成Prometheus+Grafana监控体系,自动化部署:使用Ansible实现一键部署









