LVS(Linux Virtual Server)是由章文嵩博士在1998年开发的开源项目,现已成为Linux内核标准模块。它通过将网络请求智能分发到多个后端服务器,构建高性能、高可用的服务器集群,广泛应用于淘宝、YouTube等大型网站架构中。
Director(调度器):
Real Server(真实服务器):
负载均衡策略对比:
策略类型 | 算法原理 | 适用场景 | 配置示例 |
---|---|---|---|
轮询(RR) | 依次分配给每个RS | 服务器性能相近 | ipvsadm -A -t VIP:80 -s rr |
加权轮询(WRR) | 根据权重比例分配 | 服务器性能差异较大 | ipvsadm -A -t VIP:80 -s wrr |
最少连接(LC) | 分配给当前连接数最少的RS | 长连接场景(如数据库) | ipvsadm -A -t VIP:80 -s lc |
源地址散列(SH) | 相同源IP总分配到同一RS | 需要会话保持的应用 | ipvsadm -A -t VIP:80 -s sh |
NAT模式深入分析:
TUN模式特殊配置:
modprobe ipip
DR模式性能测试:
arp_ignore=1
:仅响应目标IP是本地接口的ARP请求arp_announce=2
:始终使用接口的真实IP做ARP响应网络拓扑要求:
IP规划示例:
+---------------------+
| 交换机/路由器 |
+----------+----------+
|
+--------------+--------------+
| |
+----------+----------+ +---------+---------+
| Director (主) | | Director (备) |
| eth0: 192.168.1.1 | | eth0: 192.168.1.5 |
| eth0:0: 192.168.1.100(VIP) | |
+----------+----------+ +---------+---------+
| |
+----------+----------+ +---------+---------+
| RS1 | | RS2 |
| eth0: 192.168.1.2 | | eth0: 192.168.1.3 |
| lo:0: 192.168.1.100 | | lo:0: 192.168.1.100|
+---------------------+ +---------------------+
内核参数优化:
# /etc/sysctl.conf 关键参数
net.ipv4.ip_forward = 1
net.ipv4.vs.conntrack = 1 # 开启连接跟踪
net.ipv4.vs.expire_nodest_conn = 1 # 快速释放无效连接
IPVSADM持久化服务:
# 创建systemd服务(/usr/lib/systemd/system/ipvsadm.service)
[Unit]
Description=IPVS Load Balancer
After=network.target
[Service]
Type=oneshot
ExecStart=/bin/bash -c '/sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm'
ExecStop=/sbin/ipvsadm-save > /etc/sysconfig/ipvsadm
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
VIP配置脚本(/usr/local/bin/lvs-dr.sh):
#!/bin/bash
VIP=192.168.1.100
case "$1" in
start)
echo "Starting LVS-DR real server"
/sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP up
/sbin/route add -host $VIP dev lo:0
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
;;
stop)
echo "Stopping LVS-DR real server"
/sbin/ifconfig lo:0 down
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
配置验证要点:
ipvsadm -lcn
查看实时连接分布tcpdump -i lo -nn host 192.168.1.100
验证VIP流量ab -n 100000 -c 500 http://192.168.1.100/
VRRP协议工作流程:
脑裂问题处理:
# 添加脚本检测(/etc/keepalived/check_script.sh)
#!/bin/bash
if ping -c 1 -W 1 192.168.1.254 &>/dev/null; then
exit 0
else
systemctl stop keepalived
exit 1
fi
# keepalived.conf添加:
vrrp_script chk_gateway {
script "/etc/keepalived/check_script.sh"
interval 2
weight -20
}
多级健康检查示例:
real_server 192.168.1.2 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 5
}
HTTP_GET {
url {
path /health
status_code 200
}
connect_timeout 5
nb_get_retry 3
}
MISC_CHECK {
misc_path "/etc/keepalived/check_mysql.sh"
misc_timeout 10
}
}
自定义检查脚本示例(check_mysql.sh):
#!/bin/bash
if mysql -h127.0.0.1 -uroot -p'password' -e "SHOW STATUS;" &>/dev/null; then
exit 0
else
exit 1
fi
连接跟踪优化:
# /etc/sysctl.conf
net.ipv4.vs.conn_reuse_mode = 1 # 连接复用
net.ipv4.vs.expire_quiescent_template = 1 # 快速释放空闲连接
net.ipv4.vs.cache_bypass = 1 # 缓存加速
TCP协议栈调优:
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_max_tw_buckets = 10000
连接状态分析:
# 查看连接分布(每2秒刷新)
watch -n 2 ipvsadm -l --stats
# 跟踪特定客户端连接
ipvsadm -l --timeout
ipvsadm -l --persistent-conn
性能瓶颈定位:
# 内核处理统计
cat /proc/net/ip_vs_stats
# 中断负载检查
cat /proc/interrupts | grep eth
典型部署模型:
客户端 → LVS集群(DR模式) → Nginx集群(七层LB) → 应用服务器
优势对比:
upstream app_servers {
server 10.0.1.1:8080;
server 10.0.1.2:8080;
keepalive 32;
}
AWS部署注意事项:
# 添加辅助IP
aws ec2 assign-private-ip-addresses \
--network-interface-id eni-123456 \
--private-ip-addresses 192.168.1.100
Exporter部署:
# 编译ipvs_exporter
go get github.com/damjan/go-ipvs-exporter
# 启动参数
./ipvs_exporter --web.listen-address=":9292"
Grafana仪表板指标:
ELK日志收集方案:
filter {
if [type] == "lvs-access" {
grok {
match => { "message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:response} %{NUMBER:bytes}" }
}
}
}
iptables规则示例:
# 只允许Director访问RS的服务端口
iptables -A INPUT -p tcp --dport 80 -s 192.168.1.1 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j DROP
# 限制VIP的ARP响应
iptables -A INPUT -p arp --arp-op Request --arp-ip-dst 192.168.1.100 -j DROP
SYN Cookie防护:
# 启用SYN Cookie
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# 调整半连接队列
echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
连接限制规则:
ipvsadm --set tcp tcpfin udp
ipvsadm --start-daemon --master --syncid=100
各Linux发行版支持情况:
发行版 | 内核模块名称 | 管理工具 |
---|---|---|
RHEL/CentOS | ip_vs | ipvsadm |
Ubuntu | ip_vs | ipvsadm |
SUSE | ip_vs | ipvsadm |
ArchLinux | ip_vs | ipvsadm |
双VIP迁移步骤:
www IN A 192.168.1.100
www IN A 192.168.1.200
通过以上深度配置和优化,LVS集群可以支撑千万级PV的网站流量。实际部署时建议先进行压力测试,推荐使用Locust或JMeter模拟真实流量模式。对于金融级应用,应考虑部署LVS+Keepalived的双活架构实现零中断升级。