1. 高可用Web集群架构概述
在当今互联网服务中,高可用性已成为基础需求。一个典型的Web集群需要解决三个核心问题:如何应对单点故障、如何实现流量均衡分发、如何保证数据一致性。本实验构建的Keepalived+LVS+Nginx+NFS+DNS架构正是针对这些问题的完整解决方案。
这套架构的核心优势在于:
- 四层+七层双重负载:LVS实现高性能四层负载均衡,Nginx提供灵活的七层处理能力
- 无缝故障转移:Keepalived确保VIP自动漂移,实现秒级切换
- 统一数据视图:NFS共享存储保证所有Web节点数据一致
- 域名解耦:DNS层隐藏后端架构细节,便于运维调整
2. 实验环境规划与准备
2.1 硬件资源配置建议
对于学习环境,建议采用以下配置:
- CPU:每虚拟机至少2核(LVS节点建议4核)
- 内存:Web节点2GB,LVS节点1GB,存储节点4GB
- 磁盘:系统盘20GB,NFS节点额外挂载50GB数据盘
- 网络:所有节点使用桥接模式,确保同网段互通
生产环境注意事项:
- 物理服务器建议万兆网络互联
- NFS存储应使用RAID10阵列
- 建议为LVS节点配置多网卡(业务与管理分离)
2.2 系统初始化配置
基础环境配置是后续工作的基石,需要特别注意以下要点:
主机名与网络配置
bash复制# 设置永久主机名(以client节点为例)
hostnamectl set-hostname client && exec bash
# 网络配置模板(适配RHEL9/CentOS9)
nmcli connection modify ens160 \
ipv4.method manual \
ipv4.addresses 192.168.70.115/24 \
ipv4.gateway 192.168.70.2 \
ipv4.dns "223.5.5.5 8.8.8.8" \
connection.autoconnect yes
nmcli connection up ens160
安全策略调整
bash复制# 临时关闭SELinux(实验环境推荐)
setenforce 0
# 防火墙放行必要服务(生产环境应精确配置)
firewall-cmd --permanent --add-service={http,https,nfs,dns}
firewall-cmd --reload
系统优化参数
bash复制# 增加文件描述符限制
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
# 内核参数优化(所有节点)
cat >> /etc/sysctl.conf << EOF
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65000
net.core.somaxconn = 32768
EOF
sysctl -p
3. 核心组件部署详解
3.1 NFS共享存储部署
NFS服务器是保证数据一致性的关键节点,部署时需特别注意:
存储规划建议
- 创建独立的逻辑卷作为共享存储
- 为不同服务建立隔离的挂载点
bash复制# 创建逻辑卷(假设已有VG名为vg_data)
lvcreate -n lv_web -L 20G vg_data
mkfs.xfs /dev/vg_data/lv_web
mkdir -p /data/web
mount /dev/vg_data/lv_web /data/web
精细化权限控制
bash复制# 创建专用用户组
groupadd -g 2000 webadmin
useradd -u 2001 -g webadmin webuser
# 目录结构规划
mkdir -p /data/web/{html,logs,config}
chown -R webuser:webadmin /data/web
chmod 2775 /data/web # 设置SGID保持组权限
NFS服务高级配置
bash复制# 安装必要组件
dnf install nfs-utils rpcbind -y
# 精细化的exports配置
cat > /etc/exports << EOF
/data/web/html 192.168.70.118(rw,sync,all_squash,anonuid=2001,anongid=2000) 192.168.70.119(rw,sync,all_squash,anonuid=2001,anongid=2000)
/data/web/logs 192.168.70.0/24(rw,sync,no_root_squash)
/data/web/config 192.168.70.118(ro,sync) 192.168.70.119(ro,sync)
EOF
# 启动服务并设置开机自启
systemctl enable --now {nfs-server,rpcbind}
3.2 DNS主从服务搭建
DNS服务为整个集群提供名称解析,关键配置要点:
主服务器配置优化
bash复制# 安装BIND9
dnf install bind bind-utils -y
# 精细化区域配置
cat > /etc/named.conf << EOF
options {
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 { any; };
recursion no; # 关闭递归查询
dnssec-enable no;
dnssec-validation no;
bindkeys-file "/etc/named.root.key";
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
listen-on port 53 { any; };
listen-on-v6 port 53 { none; };
};
zone "example.com" IN {
type master;
file "example.com.zone";
allow-transfer { 192.168.70.121; };
also-notify { 192.168.70.121; };
notify yes;
};
EOF
区域文件高级配置
bash复制# TTL时间规划
cat > /var/named/example.com.zone << EOF
$TTL 86400
@ IN SOA ns1.example.com. admin.example.com. (
2023081501 ; serial
3600 ; refresh (1 hour)
900 ; retry (15 minutes)
604800 ; expire (1 week)
300 ) ; minimum (5 minutes)
NS ns1.example.com.
NS ns2.example.com.
MX 10 mail.example.com.
; 基础记录
ns1 A 192.168.70.120
ns2 A 192.168.70.121
mail A 192.168.70.125
; 服务记录
www A 192.168.70.100
api CNAME www.example.com.
EOF
# 权限设置
chown named:named /var/named/example.com.zone
chmod 640 /var/named/example.com.zone
3.3 Web节点部署最佳实践
Nginx作为Web服务核心,部署时需要关注:
编译安装优化
bash复制# 下载最新稳定版
wget https://nginx.org/download/nginx-1.25.3.tar.gz
tar zxvf nginx-1.25.3.tar.gz
cd nginx-1.25.3
# 编译参数优化
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-file-aio \
--with-threads \
--with-stream
make && make install
系统服务集成
bash复制# 创建系统服务文件
cat > /usr/lib/systemd/system/nginx.service << EOF
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=/bin/kill -s QUIT \$MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
# 创建专用用户
useradd -r -s /sbin/nologin nginx
NFS客户端挂载优化
bash复制# 创建systemd挂载单元
cat > /etc/systemd/system/data-web-html.mount << EOF
[Unit]
Description=Mount NFS share for web content
After=network.target
[Mount]
What=192.168.70.120:/data/web/html
Where=/usr/local/nginx/html
Type=nfs
Options=_netdev,noatime,vers=4.2,rsize=65536,wsize=65536,hard,intr
[Install]
WantedBy=multi-user.target
EOF
# 启用并测试挂载
systemctl daemon-reload
systemctl enable --now data-web-html.mount
4. LVS+Keepalived高可用方案
4.1 LVS核心配置解析
LVS的DR模式是实现高性能负载均衡的关键,配置要点:
内核参数调优
bash复制# 所有Real Server需要设置
echo "net.ipv4.conf.all.arp_ignore = 1" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.arp_announce = 2" >> /etc/sysctl.conf
echo "net.ipv4.conf.lo.arp_ignore = 1" >> /etc/sysctl.conf
echo "net.ipv4.conf.lo.arp_announce = 2" >> /etc/sysctl.conf
sysctl -p
# LVS Director节点参数优化
echo "net.ipv4.vs.conntrack = 1" >> /etc/sysctl.conf
echo "net.ipv4.vs.expire_nodest_conn = 1" >> /etc/sysctl.conf
IPVSADM规则管理
bash复制# 清空现有规则
ipvsadm -C
# 添加虚拟服务(80端口轮询)
ipvsadm -A -t 192.168.70.100:80 -s rr -p 600
# 添加真实服务器
ipvsadm -a -t 192.168.70.100:80 -r 192.168.70.118:80 -g -w 1
ipvsadm -a -t 192.168.70.100:80 -r 192.168.70.119:80 -g -w 1
# 持久化配置
ipvsadm-save > /etc/sysconfig/ipvsadm
4.2 Keepalived高级配置
Keepalived的配置需要关注高可用细节:
主备节点配置差异
bash复制# 主节点配置片段
vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass d7f5x9
}
virtual_ipaddress {
192.168.70.100/32 dev ens160 label ens160:1
}
track_interface {
ens160 # 监控网卡状态
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
健康检查增强
bash复制# 自定义HTTP检查脚本
virtual_server 192.168.70.100 80 {
delay_loop 10
lb_algo wlc # 加权最小连接
lb_kind DR
protocol TCP
persistence_timeout 300 # 会话保持
real_server 192.168.70.118 80 {
weight 3
HTTP_GET {
url {
path /healthz
status_code 200
}
connect_timeout 5
nb_get_retry 3
delay_before_retry 3
}
}
}
脑裂防护机制
bash复制# 添加vrrp_script检测
vrrp_script chk_lvs {
script "/usr/bin/killall -0 ipvsadm" # 检查LVS进程
interval 2
fall 2
rise 2
}
vrrp_instance VI_1 {
track_script {
chk_lvs
}
}
5. 集群验证与排错指南
5.1 全链路测试方案
DNS解析验证
bash复制# 检查DNS解析一致性
for i in {1..10}; do
dig +short www.example.com @192.168.70.120
dig +short www.example.com @192.168.70.121
done
# 检查主从同步
rndc refresh example.com
rndc retransfer example.com
LVS状态监控
bash复制# 实时查看连接分发
watch -n 1 ipvsadm -ln --stats
# 详细连接跟踪
ipvsadm -lcn | awk '{print $4,$5,$6}' | sort | uniq -c
故障转移测试
bash复制# 模拟主LVS故障
ssh root@192.168.70.116 "systemctl stop keepalived"
# 观察VIP漂移(应在3秒内完成)
watch -n 0.5 ip a show ens160 | grep 192.168.70.100
# 测试服务连续性
ab -n 1000 -c 100 http://www.example.com/
5.2 常见问题排查
问题1:VIP无法访问
- 检查项:
bash复制# 查看VIP绑定情况 ip addr show | grep 192.168.70.100 # 检查防火墙规则 firewall-cmd --list-all # 验证LVS规则 ipvsadm -Ln
问题2:NFS挂载失败
- 排查步骤:
bash复制# 检查NFS服务状态 rpcinfo -p 192.168.70.120 # 手动测试挂载 mount -t nfs -o vers=4 192.168.70.120:/data/web/html /mnt/test # 查看内核日志 dmesg | grep nfs
问题3:Keepalived主备切换异常
- 诊断方法:
bash复制# 查看VRRP报文交互 tcpdump -i ens160 vrrp -n # 检查Keepalived日志 journalctl -u keepalived --since "5 minutes ago" # 验证脚本执行权限 ls -l /etc/keepalived/check_*.sh
6. 生产环境优化建议
6.1 架构扩展方案
多活LVS集群
- 部署多个VIP分别对应不同业务
- 使用BGP+ECMP实现跨机房流量调度
NFS高可用改进
bash复制# 使用DRBD+Heartbeat构建双主存储
pcs resource create nfs_ip ocf:heartbeat:IPaddr2 ip=192.168.70.130 cidr_netmask=24 op monitor interval=30s
pcs resource create nfs_export fs device=/dev/drbd0 directory=/data/web fstype=xfs options="noatime" --group nfs_group
pcs resource create nfs_server systemd:nfs-server --group nfs_group
DNS智能解析
- 部署GeoDNS实现地域解析
- 设置动态DNS记录基于健康检查
6.2 监控体系搭建
Prometheus监控配置
yaml复制# LVS监控指标
- job_name: 'lvs'
static_configs:
- targets: ['192.168.70.116:9100', '192.168.70.117:9100']
metrics_path: '/probe'
params:
module: [ipvs]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox-exporter:9115
Grafana监控看板
- LVS连接数/吞吐量监控
- NFS IOPS/延迟监控
- 节点资源水位监控
- 服务可用性状态聚合
6.3 安全加固措施
网络隔离规划
- 业务网络与管理网络分离
- 使用VLAN隔离不同层级服务
- 配置严格的ACL规则
服务安全配置
bash复制# NFS安全增强
cat >> /etc/exports << EOF
/data/web/html 192.168.70.0/24(rw,sync,all_squash,anonuid=2001,anongid=2000,sec=krb5p)
EOF
# Keepalived认证强化
vrrp_instance VI_1 {
authentication {
auth_type AH # 使用IPSec AH认证
auth_pass a1b2c3d4e5f6
}
}
这套架构经过适当优化后,可以支撑日均千万级PV的Web服务。实际部署时,建议先进行压力测试,根据业务特点调整LVS调度算法和Nginx参数,并建立完善的监控告警系统。