1. 架构设计背景与核心目标
在现代互联网服务架构中,高可用性和负载均衡能力已成为基础需求。这套由HAProxy、Nginx、NFS和DNS组成的解决方案,完美解决了单点故障和流量分配不均的问题。我在实际部署中发现,这种架构特别适合日均PV在50万-500万之间的中型Web服务,既能保证稳定性又不会过度设计。
整套系统的核心思路是:通过DNS轮询实现初级分流,HAProxy作为七层负载均衡器进行智能流量分配,Nginx集群处理实际业务请求,NFS共享存储保证多节点数据一致性。这种分层设计使得每个组件都可以独立扩展,某层出现故障时也不会导致服务完全中断。
2. 基础环境准备
2.1 服务器规划建议
根据我的部署经验,建议采用以下配置方案:
- 负载均衡层:2台HAProxy服务器(4核8G)
- Web服务层:至少3台Nginx服务器(根据业务需求配置)
- 存储层:2台NFS服务器(建议SSD存储)
重要提示:所有服务器必须配置时间同步服务(ntpd),时间不一致会导致NFS和会话同步出现问题
2.2 系统环境配置
bash复制# 基础依赖安装(所有节点)
yum install -y epel-release
yum install -y gcc make openssl-devel pcre-devel systemd-devel
建议统一使用CentOS 7.9系统,内核版本建议3.10.0-1160以上。我曾遇到过低版本内核的NFS锁机制问题,导致文件同步延迟。
3. 核心组件部署详解
3.1 HAProxy部署与优化
安装最新稳定版(当前推荐2.6版本):
bash复制wget https://www.haproxy.org/download/2.6/src/haproxy-2.6.0.tar.gz
tar -xzf haproxy-2.6.0.tar.gz
cd haproxy-2.6.0
make TARGET=linux-glibc USE_OPENSSL=1 USE_ZLIB=1 USE_PCRE=1
make install
配置示例(/etc/haproxy/haproxy.cfg):
conf复制global
log /dev/log local0
maxconn 100000
user haproxy
group haproxy
daemon
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http-in
bind *:80
default_backend nginx_cluster
backend nginx_cluster
balance roundrobin
option httpchk GET /healthcheck
server web1 192.168.1.101:80 check inter 2000 rise 2 fall 3
server web2 192.168.1.102:80 check inter 2000 rise 2 fall 3
server web3 192.168.1.103:80 check inter 2000 rise 2 fall 3
性能调优经验:maxconn参数需要根据服务器内存调整,一般每1GB内存可支持约4000并发连接
3.2 Nginx集群配置
建议采用Nginx 1.20+版本,编译时加入以下模块:
bash复制./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream
关键配置优化(nginx.conf):
conf复制worker_processes auto;
worker_rlimit_nofile 100000;
events {
worker_connections 4096;
use epoll;
multi_accept on;
}
http {
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
# 其他业务配置...
}
3.3 NFS共享存储部署
主NFS服务器配置(/etc/exports):
conf复制/data 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check)
客户端挂载建议使用以下参数:
bash复制mount -t nfs -o rw,nosuid,nodev,noexec,hard,intr,rsize=32768,wsize=32768,timeo=15 192.168.1.100:/data /mnt/data
踩坑记录:必须设置hard和intr参数,否则网络波动会导致进程挂起。rsize/wsize建议设为32KB,这是经过多次测试得出的最佳值
4. DNS轮询配置
在DNS解析中添加多条A记录:
code复制example.com. IN A 203.0.113.1
example.com. IN A 203.0.113.2
example.com. IN A 203.0.113.3
TTL值建议设置为300秒(5分钟),这样既不会给DNS服务器造成太大压力,又能在故障时快速切换。
5. 高可用实现方案
5.1 HAProxy双活配置
在两台HAProxy服务器上配置相同的服务,通过DNS轮询实现初级负载均衡。建议在两台HAProxy之间配置keepalived实现VIP漂移:
conf复制vrrp_script chk_haproxy {
script "pidof haproxy"
interval 2
weight 2
}
vrrp_instance VI_1 {
interface eth0
state MASTER
virtual_router_id 51
priority 101
virtual_ipaddress {
192.168.1.200/24
}
track_script {
chk_haproxy
}
}
5.2 NFS高可用方案
采用DRBD+Heartbeat实现NFS主从切换:
conf复制# DRBD配置示例 (/etc/drbd.d/nfs.res)
resource nfs {
protocol C;
disk { on-io-error detach; }
on nfs1 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.2.1:7788;
meta-disk internal;
}
on nfs2 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.2.2:7788;
meta-disk internal;
}
}
6. 监控与维护
6.1 关键指标监控
建议监控以下核心指标:
- HAProxy:会话率、错误率、队列长度
- Nginx:活跃连接、请求处理速率
- NFS:IO延迟、锁等待时间
使用Prometheus+Granfana的监控配置示例:
yaml复制# haproxy exporter配置
scrape_configs:
- job_name: 'haproxy'
static_configs:
- targets: ['haproxy1:9101','haproxy2:9101']
6.2 日志分析方案
统一日志收集架构:
code复制Filebeat(各节点) -> Logstash(过滤) -> Elasticsearch(存储) -> Kibana(展示)
关键日志解析规则:
ruby复制filter {
if [type] == "haproxy" {
grok {
match => { "message" => "%{HAPROXYHTTP}" }
}
}
}
7. 性能调优实战经验
7.1 TCP协议栈优化
所有节点建议调整以下内核参数(/etc/sysctl.conf):
conf复制net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.core.somaxconn = 32768
net.ipv4.tcp_max_syn_backlog = 8192
net.core.netdev_max_backlog = 50000
7.2 HAProxy连接池优化
对于Java应用,建议配置连接池:
properties复制# Tomcat配置示例
maxThreads=500
minSpareThreads=50
acceptCount=1000
8. 故障排查手册
8.1 常见问题速查表
| 故障现象 | 可能原因 | 解决方案 |
|---|---|---|
| NFS挂载点无响应 | 网络中断或服务崩溃 | 检查网络连接,重启nfs服务 |
| HAProxy 503错误 | 后端服务全部下线 | 检查后端服务健康状态 |
| 文件锁冲突 | 多节点同时写同一文件 | 优化应用逻辑,使用文件锁 |
8.2 诊断命令集锦
bash复制# 检查NFS连接状态
nfsstat -c
# 查看HAProxy实时会话
socat /var/run/haproxy.sock - <<< "show stat"
# 检测Nginx工作状态
curl http://localhost/nginx_status
9. 安全加固措施
9.1 网络层防护
建议配置iptables规则:
bash复制iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 100 -j DROP
iptables -A INPUT -p tcp --dport 2049 -s 192.168.1.0/24 -j ACCEPT
9.2 应用层防护
Nginx配置防CC攻击:
conf复制limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;
server {
location / {
limit_req zone=one burst=5;
}
}
10. 架构扩展思路
当业务增长到一定规模后,可以考虑:
- 用LVS替代DNS轮询做四层负载均衡
- 引入Redis集群替代部分NFS共享存储场景
- 使用CDN加速静态资源
- 考虑容器化部署方案
这套架构在我负责的多个电商项目中表现稳定,曾支撑过双11级别的流量冲击。最关键的经验是:监控系统一定要提前部署完善,很多问题都是通过监控指标的趋势变化提前发现的。