导读:本期聚焦于长沙SEO公司创作的《多台服务器如何组建高可用集群?手把手带你落地高可用架构》,敬请观看详情。一台服务器挂了业务就全停,这种单点故障问题该怎么彻底解决?答案就是高可用集群。本文从实际部署出发,详细讲解如何用Keepalived配合LVS或Nginx搭建主备与负载均衡架构,包括虚拟IP漂移原理、心跳检测机制、脑裂问题的预防、故障自动切换的验证方法,以及集群后期运维中需要关注的日志排查与健康检查调优。整套方案不依赖昂贵商业设备,普通云主机或物理机即可完成部署,适合中小团队快速落地,让业务在任意节点宕机时仍能持续对外提供服务。

高可用集群的核心目标是消除单点故障,让任意一台服务器宕机时业务仍然可以正常对外提供服务。相比单机部署,集群架构通过冗余节点加自动故障转移机制,把服务的不可用时间压缩到分钟级甚至秒级。本文将以最常见的Web服务场景为例,讲解如何用几台普通服务器搭建一套可落地的高可用集群,涵盖虚拟IP漂移、负载均衡、健康检查和脑裂预防等关键环节。

多台服务器如何组建高可用集群?手把手带你落地高可用架构

一、高可用集群的整体架构设计

搭建集群之前,先要明确架构分层。一套典型的高可用Web集群由三层组成:最前面是入口层,负责接收用户请求,通常由两台负载均衡器组成主备结构,通过虚拟IP对外提供服务;中间是应用层,由多台Web服务器组成,实际处理业务逻辑;最底层是数据层,数据库主从复制或分布式存储保障数据不丢。

入口层是整个方案的关键。用户的DNS解析只指向一个虚拟IP,这个IP并不固定绑定在某台机器上,而是由Keepalived这样的软件动态持有。当主负载均衡器正常时,虚拟IP在主节点上;主节点一旦故障,备节点会在几秒内把虚拟IP接管过来,用户完全无感知。这种机制叫IP漂移,是实现高可用最基础也最可靠的手段。

应用层建议至少部署两台Web服务器,前面由Nginx做七层负载均衡,把请求按权重或轮询策略分发下去。任何一台Web服务器出问题,Nginx通过健康检查自动把它摘除,流量全部打到健康节点上。假设你有三台应用服务器,挂掉一台理论上还剩三分之二的处理能力,对中小流量业务来说足够扛住故障窗口期。

二、用Keepalived实现主备与虚拟IP漂移

Keepalived基于VRRP协议工作,VRRP即虚拟路由冗余协议,它允许多台服务器共享一个虚拟IP,其中一台作为MASTER持有该IP,其余作为BACKUP待命。节点之间通过组播发送心跳报文,默认每1秒一次。BACKUP如果连续三个周期收不到MASTER的心跳,就认为主节点失效,立即提升自己为新的MASTER并接管虚拟IP,整个切换过程通常在3到4秒内完成。

先准备两台负载均衡服务器,假设主节点IP为192.168.10.11,备节点为192.168.10.12,虚拟IP为192.168.10.100。在两台机器上分别安装Keepalived和Nginx:

# CentOS/RHEL 系统安装
yum install -y keepalived nginx
# Debian/Ubuntu 系统安装
apt-get install -y keepalived nginx

主节点的Keepalived配置如下,配置文件路径为/etc/keepalived/keepalived.conf:

vrrp_instance VI_1 {
    state MASTER              # 初始角色为主节点
    interface eth0            # 绑定的网卡名称
    virtual_router_id 51      # 同一组主备必须一致
    priority 100              # 优先级,越大越可能成为MASTER
    advert_int 1              # 心跳间隔,单位秒
    authentication {
        auth_type PASS
        auth_pass MyPass123   # 主备节点密码必须相同
    }
    virtual_ipaddress {
        192.168.10.100        # 对外提供的虚拟IP
    }
}

备节点的配置只需改动两处:state改为BACKUP,priority改为90,其余保持一致。配置完成后启动服务并设置开机自启,然后用ip addr命令验证,主节点网卡上应该能看到192.168.10.100这个地址。此时可以做一个简单的切换测试:在主节点上执行systemctl stop keepalived,再到备节点上查看,虚拟IP会自动漂移过去,重新启动主节点的Keepalived后,由于优先级更高,虚拟IP又会抢占回来。

三、Nginx负载均衡与健康检查配置

负载均衡层由两台Nginx承担,它们的配置完全相同,这样无论虚拟IP漂移到哪台机器,流量转发规则都一致。假设后端有三台应用服务器,地址分别是192.168.10.21、192.168.10.22和192.168.10.23,Nginx的配置可以这样写:

upstream backend {
    server 192.168.10.21:8080 weight=1 max_fails=2 fail_timeout=10s;
    server 192.168.10.22:8080 weight=1 max_fails=2 fail_timeout=10s;
    server 192.168.10.23:8080 weight=1 max_fails=2 fail_timeout=10s;
}

server {
    listen 80;
    server_name www.ipipp.com;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_connect_timeout 3s;   # 连接后端超时时间
        proxy_read_timeout 10s;     # 读取响应超时时间
    }
}

上面配置中max_fails和fail_timeout组合实现了被动健康检查:某台后端在10秒内失败2次,就会被临时摘除10秒。这种方式配置简单,但只能发现连接层面的故障。如果后端进程活着但接口已经卡死,需要更主动的检测手段。开源社区常用的方案是给Nginx加装第三方健康检查模块,或者直接在Keepalived里配置TCP_CHECK与HTTP_GET检测:

# 在keepalived.conf中增加后端检测
virtual_server 192.168.10.100 80 {
    delay_loop 6
    lb_algo rr                # 轮询调度算法
    lb_kind DR                # 转发模式
    protocol TCP

    real_server 192.168.10.21 8080 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 2
            delay_before_retry 2
            connect_port 8080
        }
    }
}

需要注意的是,Keepalived的virtual_server功能走的是LVS四层转发,性能比Nginx七层代理高很多,适合大流量场景;而Nginx的优点是可以基于URL、Header做精细分流,两者可以按业务规模选择甚至叠加使用。

四、脑裂问题的预防与故障演练

脑裂是高可用集群最危险的故障形态:主备之间的心跳网络断了,但两台机器本身都活着,双方都认为对方挂了,于是都抢占虚拟IP,造成IP冲突、请求乱飞,数据层还可能出现双写。产生脑裂的常见原因包括交换机故障、网线松动、防火墙误拦截了VRRP报文、iptables规则丢弃112端口组播包等。

预防脑裂可以从几个方面入手。第一,心跳链路冗余,有条件的话给主备节点配置双网卡双链路,Keepalived支持配置多个vrrp_instance分别走不同网卡。第二,关闭或正确配置防火墙,确保VRRP协议的组播流量畅通,比如放行协议号112:

# 放行VRRP协议报文
firewall-cmd --permanent --add-rich-rule='rule protocol value="vrrp" accept'
firewall-cmd --reload

第三,引入第三方仲裁。可以增加一台独立的监控节点,定期通过脚本同时探测主备两台机器的状态,一旦发现双方都持有虚拟IP,就主动降级其中一台,比如直接kill掉优先级较低那台的Keepalived进程。下面是一段简单的仲裁检测脚本思路:

#!/bin/bash
# 检测两台负载均衡器是否同时持有虚拟IP
VIP=192.168.10.100
MASTER=192.168.10.11
BACKUP=192.168.10.12

# 分别通过SSH探测虚拟IP归属
CHECK1=$(ssh root@${MASTER} "ip addr | grep ${VIP} | wc -l")
CHECK2=$(ssh root@${BACKUP} "ip addr | grep ${VIP} | wc -l")

if [ "$CHECK1" -ge 1 ] && [ "$CHECK2" -ge 1 ]; then
    echo "$(date) 检测到脑裂,正在降级备节点" >> /var/log/split_brain.log
    ssh root@${BACKUP} "systemctl stop keepalived"
fi

集群搭建完成后,故障演练是必不可少的环节。建议模拟以下几类场景并逐一验证:停掉主节点Keepalived进程观察虚拟IP切换耗时;直接关闭主节点电源测试极端情况;杀掉某台后端应用进程验证流量是否自动摘除;恢复故障节点确认它能否自动回归集群。每次演练记录切换时间,如果超过10秒就要排查心跳参数和优先级配置。日常运维中还要关注/var/log/messages里的VRRP日志,出现频繁的MASTER/BACKUP状态抖动,往往意味着网络质量不佳或检测阈值设置得过于敏感,可以适当调大advert_int或降低检测频率来平衡切换速度与稳定性。

五、总结与后续优化方向

这套Keepalived加Nginx的组合方案,用纯开源软件就实现了入口层秒级故障转移和应用层的负载均衡与健康检查,硬件成本只是多几台服务器。对于绝大多数中等规模的在线业务,它已经足够可靠。如果后续业务继续增长,可以从几个方向演进:一是把Nginx替换为LVS四层转发提升吞吐量;二是数据层引入MySQL主从加MHA自动切换,或者直接上分布式数据库;三是结合Prometheus和Grafana对集群各节点的状态做可视化监控,让故障在用户感知之前就被发现和处理。高可用不是一次性的工程,而是随业务持续演进的过程,定期演练和复盘才是集群长期稳定的根本保障。

高可用集群Keepalived负载均衡修改时间:2026-09-11 15:10:50

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/20260911/54736.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。