找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1757

积分

0

好友

263

主题
发表于 13 小时前 | 查看: 2| 回复: 0

在互联网行业,“业务不中断”是底线要求。一次服务器宕机可能导致百万级损失,而单点故障正是业务中断的头号元凶。

一套兼具高性能负载均衡与故障自动切换能力的架构,既能扛住百万级并发请求,又能在节点故障时无缝衔接,已成为企业级应用不可或缺的“稳定性基石”。今天,我们就从原理到实操,深入解析这套由LVS、Keepalived和Nginx构建的、被众多大厂采用的高可用负载均衡方案。

一、核心组件:三位一体构建高可用基石

一套可靠的高可用架构,离不开“负载分发、故障兜底、应用适配”的三重保障。LVS、Keepalived、Nginx各司其职,协同工作:

(一)Keepalived:高可用集群的“守护者”

如果将集群比作一支军队,那么Keepalived就是其中的“指挥官”,其核心使命是消除单点故障。它基于VRRP(虚拟路由冗余协议)工作,机制可概括为“主备心跳检测”:

  • 主服务器(Master):对外提供统一的访问入口——虚拟IP(VIP),并持续向备用服务器发送“心跳包”宣告存活。
  • 备用服务器(Backup):持续监听心跳。一旦在设定时间内未收到信号,则判定主服务器故障,立即升为主服务器并接管VIP。
  • 无缝切换:整个故障切换过程在毫秒级完成,对用户完全透明,实现真正的业务零中断。

此外,Keepalived内置健康检查功能,可通过TCP、HTTP等方式监控后端真实服务器的状态,自动剔除故障节点并在其恢复后重新加入集群,确保流量不会流向不可用的服务。

(二)LVS:内核级的“流量调度员”

面对海量并发请求,单台服务器必然捉襟见肘。LVS作为工作于Linux内核态的负载均衡器,是专司“流量分发”的专家。

其最大优势在于极致性能。由于工作在内核态,避免了用户态的资源开销,能轻松处理数十万级别的并发连接。它支持NAT、TUN和DR三种转发模式,其中DR(直接路由)模式因报文转发效率最高,成为Web服务场景下的首选。

LVS根据预设的调度算法(如轮询rr、加权轮询wrr),将客户端请求均匀地分发到后端多台服务器上,既避免了单点过载,也显著提升了集群整体的吞吐能力。

(三)Nginx:应用层的“灵活适配器”

如果说LVS擅长的是四层“粗粒度”的流量调度,那么Nginx则精于七层“细粒度”的应用协议处理。它擅长HTTP/HTTPS协议解析、静态资源缓存、反向代理,并能实现基于URL、Cookie等更复杂的负载均衡策略。

在LVS+Keepalived+Nginx的架构中,Nginx作为后端Web服务节点,接收来自LVS分发的请求后,可以进一步根据后端应用服务器(如Tomcat)的状态进行转发。这样既分担了应用服务器的直接压力,又通过其丰富的模块化特性提升了服务的灵活性与可管理性。

三者协同的工作流程非常清晰:客户端请求首先到达VIP → LVS根据算法将请求分发至某一台Nginx节点 → Nginx将请求代理到最终的应用服务器。若主LVS节点发生故障,Keepalived会立即将VIP漂移至备用LVS节点,整个过程业务无感知。

二、架构优势:为何成为大厂标配?

这套组合方案能经久不衰,核心在于它精准地解决了企业级应用最关键的几个诉求:

1. 性能卓越,应对高并发游刃有余

LVS内核态转发的高性能,结合Nginx高效的异步事件处理模型,使得整个集群能够从容应对数十万乃至百万级的并发连接。相比单纯使用Nginx做负载均衡,LVS分担了最底层的TCP连接压力,有效防止Nginx自身成为瓶颈,特别适用于电商大促、直播等突发流量场景。

2. 高可用兜底,保障业务连续性

通过Keepalived实现的主备自动切换与节点健康检查,从负载均衡器到后端服务节点,全方位杜绝了单点故障。服务可用性可轻松达到99.99%以上,满足大厂对业务连续性的严苛要求。

3. 灵活可扩展,适配复杂业务场景

架构具有良好的水平扩展能力。业务增长时,只需横向增加Nginx节点或应用服务器即可,无需改动整体架构。同时,它支持多种负载均衡算法、会话保持策略,能够灵活适配Web网站、API网关、数据库代理等多种场景。

4. 稳定可靠,运维成本可控

LVS、Keepalived、Nginx均是久经考验的开源软件,社区活跃、成熟稳定。一旦配置完成,即可长期稳定运行,后续主要以监控和维护为主,极大降低了大规模集群的运维管理复杂度与成本。

三、实战搭建:从零部署高可用集群

以下以“2台负载调度器 + 2台Nginx后端节点”的典型拓扑为例,逐步搭建整套环境。

(一)环境规划

所有服务器采用CentOS 7系统,角色与IP规划如下:

角色 IP地址 核心软件 虚拟IP(VIP)
主负载调度器(Master) 192.168.10.110 ipvsadm, Keepalived 192.168.10.180
备负载调度器(Backup) 192.168.10.119 ipvsadm, Keepalived 192.168.10.180
Nginx节点1 192.168.10.120 Nginx 192.168.10.180(绑定至lo:0)
Nginx节点2 192.168.10.123 Nginx 192.168.10.180(绑定至lo:0)
客户端 192.168.10.2 - -

基础环境配置(所有服务器执行):

# 关闭防火墙与SELinux(生产环境应配置安全策略)
systemctl stop firewalld && systemctl disable firewalld
setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

# 安装基础工具
yum -y install wget gcc gcc-c++ make

(二)负载调度器配置(主备节点相同步骤)

1. 安装核心软件
yum -y install ipvsadm keepalived

# 加载IPVS内核模块
modprobe ip_vs
# 验证模块加载
cat /proc/net/ip_vs
2. 配置Keepalived(主备配置差异见注释)

备份原配置后编辑:

cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
vim keepalived.conf

主节点 (192.168.10.110) 配置文件示例:

global_defs {
    smtp_server 127.0.0.1
    router_id LVS_01  # 备节点此处改为 LVS_02
}

vrrp_instance VI_1 {
    state MASTER       # 备节点改为 BACKUP
    interface ens33    # 网卡名称请根据实际情况调整(ifconfig查看)
    virtual_router_id 10 # 主备必须相同
    priority 100       # 备节点改为 90(值低优先级低)
    advert_int 1       # 心跳间隔1秒
    authentication {
        auth_type PASS
        auth_pass abc123 # 主备密码必须一致
    }
    virtual_ipaddress {
        192.168.10.180  # 虚拟IP(VIP)
    }
}

# 定义LVS虚拟服务器
virtual_server 192.168.10.180 80 {
    delay_loop 6       # 健康检查间隔6秒
    lb_algo rr         # 调度算法:轮询(rr),可选wrr(加权轮询)
    lb_kind DR         # 转发模式:直接路由(DR)
    persistence_timeout 50 # 会话保持时间50秒

    # 后端真实服务器1(Nginx节点1)
    real_server 192.168.10.120 80 {
        weight 1        # 权重
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    # 后端真实服务器2(Nginx节点2)
    real_server 192.168.10.123 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

备用节点 (192.168.10.119) 需修改:router_id LVS_02state BACKUPpriority 90

3. 绑定VIP到物理网卡(主备节点都需配置)

创建子接口配置文件:

vim /etc/sysconfig/network-scripts/ifcfg-ens33:0

添加内容:

DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255

重启网络并激活:

systemctl restart network
ifup ens33:0
# 验证
ifconfig ens33:0
4. 调整内核参数(防止ICMP重定向干扰)
vim /etc/sysctl.conf

添加:

net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0

应用配置:

sysctl -p
5. 启动服务
systemctl start keepalived
# 保存LVS规则并启动
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
# 查看规则列表
ipvsadm -ln

(三)Nginx后端节点配置

1. 安装并启动Nginx
yum -y install nginx
systemctl start nginx && systemctl enable nginx
2. 配置测试页面(用于区分节点)
  • 在节点1 (192.168.10.120) 执行:
    echo "<h1>This is Nginx Node 1 (192.168.10.120)</h1>" > /usr/share/nginx/html/index.html
  • 在节点2 (192.168.10.123) 执行:
    echo "<h1>This is Nginx Node 2 (192.168.10.123)</h1>" > /usr/share/nginx/html/index.html
3. 绑定VIP到本地回环接口(DR模式关键步骤)

创建回环子接口配置:

vim /etc/sysconfig/network-scripts/ifcfg-lo:0

添加:

DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255

重启网络并添加路由:

systemctl restart network
ifup lo:0
route add -host 192.168.10.180 dev lo:0
4. 优化ARP参数(防止VIP响应冲突)
vim /etc/sysctl.conf

添加:

net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

应用配置:

sysctl -p

四、功能验证:测试集群效果

完成搭建后,通过以下测试验证架构是否正常工作。

1. 负载均衡测试

在客户端浏览器访问VIP地址:http://192.168.10.180。多次刷新页面,观察页面内容应在“Node 1”和“Node 2”之间交替显示,说明LVS的轮询调度生效。

2. 高可用故障切换测试

  1. 在主负载调度器(192.168.10.110)上停止Keepalived服务:systemctl stop keepalived
  2. 稍等片刻,在备用负载调度器(192.168.10.119)上执行 ip addr show,应能看到VIP (192.168.10.180) 已绑定到其网卡上。
  3. 客户端再次访问VIP,服务应完全正常,无任何中断感。

3. 健康检查测试

  1. 在其中一台Nginx节点(如192.168.10.120)上停止Nginx服务:systemctl stop nginx
  2. 客户端访问VIP,此时应只能看到来自另一台正常Nginx节点(192.168.10.123)的页面。
  3. 重新启动故障节点的Nginx:systemctl start nginx。稍等片刻(Keepalived健康检查周期),再次访问VIP,流量恢复被分配到两个节点。

五、生产环境避坑指南

1. 脑裂问题

现象:主备节点都认为自己是Master,导致VIP冲突,服务不可用。
原因:心跳线网络中断、防火墙阻止VRRP报文、主备配置不一致。
解决方案

  • 使用双心跳线进行冗余。
  • 配置第三方仲裁(如网关),心跳中断时,无法Ping通仲裁IP的节点自动降级。
  • 部署监控脚本,检测到脑裂时立即告警。

2. ARP缓存问题

现象:客户端偶尔访问VIP失败。
解决方案:确保后端Nginx节点的ARP参数配置正确。可在客户端临时清理ARP缓存:arp -d 192.168.10.180

3. 内核参数错误

现象:LVS转发不成功或Keepalived状态异常。
解决方案:严格按照上述步骤配置内核参数,并使用 sysctl -p 确认生效。

六、总结

LVS+Keepalived+Nginx架构的成功,在于它以相对简单的组合,实现了高性能、高可用与高灵活性的完美平衡:

  • 性能层面:LVS内核态处理能力为高并发打下坚实基础。
  • 可用性层面:Keepalived确保了从入口到后端服务的全链路故障自动切换。
  • 灵活性层面:Nginx提供了丰富的应用层处理能力,适配复杂业务。

这套架构不仅适用于传统Web服务,其思想也可扩展至数据库读写分离、API网关等场景,是企业服务从“可用”迈向“可靠、高效”的关键一步。

关于技术选型的思考:或许有读者认为此架构有些“传统”,如今云原生和Kubernetes更为流行。确实,K8s在容器编排、自动扩缩容等方面功能强大。但技术选型的核心在于匹配业务现状与团队能力。LVS+Keepalived+Nginx方案架构清晰、运维简单、稳定可靠,对于许多业务规模适中或追求极致稳定性的场景,它依然是性价比极高的选择。即便在现代化的云原生体系中,它也常作为K8s集群边缘的入口负载均衡方案,继续发挥着重要作用。适合自己的,才是最好的技术方案。




上一篇:Kotlin避坑指南:Android开发实战中应规避的编码陷阱与规范
下一篇:网站访问环境异常?安全身份验证来护航
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-24 17:08 , Processed in 0.153255 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表