当前位置: 首页 > news >正文

Nginx 实战系列(十)—— LVS+Keepalived 高可用集群技术详解

文章目录

  • 前言
  • 一、Keepalived 概述
    • 1.1 Keepalived 简介
      • 1.1.1 核心功能
      • 1.1.2 Keepalived工作原理
    • 1.2 VRRP 协议基础
      • 1.2.1 VRRP工作机制
  • 二、Keepalived 体系架构与模块功能
    • 2.1 核心模块组成
    • 2.2 工作流程
    • 2.3 状态管理机制
  • 三、Keepalived 脑裂问题及解决方案
    • 3.1 脑裂现象
    • 3.2 脑裂原因
    • 3.3 应对策略
  • 四、LVS+Keepalived 集群部署实践
    • 4.1 环境准备
    • 4.2 负载调度器配置(主备相同)
      • 4.2.1 基础环境配置
      • 4.2.2 Keepalived 配置
      • 4.2.3 配置虚拟 IP
      • 4.2.4 启动服务
      • 4.2.5 调整内核参数
    • 4.3 节点服务器配置
      • 4.3.1 Web 服务器基础配置
      • 4.3.2 配置 Loopback 接口
      • 4.3.3 调整 ARP 参数
    • 4.4 测试验证
  • 总结

前言

在现代网络服务架构中,高可用性(High Availability, HA)是保障业务连续性的关键要素。Keepalived 是一个基于 VRRP 协议实现的 LVS 服务高可用方案,能够有效解决静态路由中出现的单点故障问题,确保服务在个别节点发生故障时仍能持续运行。

本文将从理论到实践,全面介绍 LVS+Keepalived 集群的架构、工作原理及部署方法。

一、Keepalived 概述

1.1 Keepalived 简介

Keepalived 是一个基于VRRP协议的高可用解决方案(单点故障),可以监控集群系统当中每个服务器节点的一个状态,实现故障切换和负载均衡。

1.1.1 核心功能

  • LVS集群管理:通过配置文件直接管理LVS集群节点

  • 健康检查(Health Check):通过不同的方式(TCP、ICMP、http等)检查后端服务器运行状态,如果发现故障,就从集群中移除。

  • 故障自动切换(Failover)
    :通过VRRP协议,在主备服务器之间维护心跳,主服务器故障时,备用服务器接管VIP并提供服务。

  • IPVS:通过IPVS模块来实现负载均衡,将请求分发到不同的后端服务器。

  • VIP接管:虚拟IP地址在主备节点间自动迁移。

1.1.2 Keepalived工作原理

  1. 基于VRRP协议:Keepalived采用VRRP(虚拟路由冗余协议)实现高可用性。多台服务器组成一个集群组,其中主服务器(Master)负责对外提供虚拟IP(VIP)并定期发送心跳包。当备服务器(Backup)无法检测到主服务器心跳时,会根据优先级自动选举新的主服务器接管VIP,确保服务持续可用。

  2. 基于TCP/IP协议:Keepalived支持多层健康检测机制,包括IP层(Ping检测)、TCP层(端口连通性检测)以及应用层(自定义脚本检测),全面保障服务的正常运行和高可用性。

  3. 选举策略:Keepalived通过优先级和权重机制实现主备切换,支持手动配置或脚本动态调整。当主节点故障或新节点加入时,系统会自动触发选举流程,重新分配虚拟IP,实现服务的无缝接管。

1.2 VRRP 协议基础

VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)的主要目的是解决静态路由单点故障问题,确保网络在部分节点故障时仍能不间断运行。

在一个 LVS 服务集群中,通常包含主服务器(MASTER)和备份服务器(BACKUP),它们通过虚拟 IP(VIP)对外提供服务。
主服务器会定期向备份服务器发送 VRRP 通告信息,若备份服务器无法收到通告信息,则会接管虚拟 IP,继续提供服务。

  • MASTER 节点发送心跳(通告)给 BACKUP 节点。
  • BACKUP 节点收不到心跳时,接管 VIP。
  • MASTER 恢复时,可抢回 VIP(抢占模式)或不抢回(非抢占模式)。
  • 默认多播地址:224.0.0.18
  • 优先级决定 MASTER 节点(数值越大优先)。

官方地址:http://www.keepalived.org

1.2.1 VRRP工作机制

VRRP的工作机制可以概括为选举、监控和切换三个过程,如下图所示:

(此处应插入您提供的图片)

  1. 选举机制 (Election)
    VRRP组内的路由器在初始化时,会根据各自的优先级进行选举。优先级最高的路由器将成为主路由器,负责接管虚拟IP地址并进行数据转发;其他路由器则成为备份路由器,进入等待状态。

  2. 心跳检测 (Heartbeat Detection)
    主路由器会周期性地向备份路由器发送VRRP通告报文(一种心跳信号),宣告自己工作正常。备份路由器通过监听到这些报文来判断主路由器的状态。

  3. 故障切换 (Failover)

    • 备份路由器在预定时间内收不到主路由器的心跳报文时,它会判定主路由器已出现故障(“主异常”)。
    • 此时,备份路由器会将自己的状态提升为主路由器,并接管虚拟IP地址。
    • 这个过程被称为 “VIP漂移” 。网络中的主机感知不到任何变化,其默认网关地址(VIP)始终保持不变,但实际处理数据的物理设备已经无缝切换,从而保证了业务的连续性。即所谓的“主不行了,有备做主”。

二、Keepalived 体系架构与模块功能

2.1 核心模块组成

  • Core模块:Keepalived核心,负责主进程管理和配置加载

  • VRRP模块:实现VRRP协议,处理主备状态切换

  • Check模块:负责健康检查,支持多种检查方式,支持TCP/HTTP/脚本检查

2.2 工作流程

1、通过配置文件定义LVS节点和参数
2、定期对后端节点进行健康检查
3、自动从转发队列中移除故障节点
4、节点恢复后自动重新加入服务队列
5、实现主备节点间的故障转移和自动切换

2.3 状态管理机制

  • 初始状态:MASTER节点持有资源,BACKUP节点处于热备状态

  • 故障状态:MASTER故障时,BACKUP自动接管所有服务

  • 恢复状态:MASTER恢复后,根据配置决定是否重新接管服务

三、Keepalived 脑裂问题及解决方案

3.1 脑裂现象

脑裂就是当网络出现问题或者配置错误时,多个服务器都认为自己是主服务器,导致虚拟IP(VIP)冲突,进而服务器终端或者不稳定。

3.2 脑裂原因

  1. 心跳线故障(断线或老化)
    高可用服务器之间的心跳线链路出现故障(如线路断裂或老化),导致通信异常。

  2. 网卡或驱动故障
    网卡硬件损坏、驱动异常或IP配置冲突(尤其在网卡直连场景)引发通信问题。

  3. 心跳网络设备故障
    心跳链路中的网络设备(如网卡、交换机)出现故障导致通信中断。

  4. 仲裁服务器异常
    仲裁服务器发生故障,影响集群决策机制。

  5. 防火墙拦截VRRP流量
    服务器防火墙(如iptables)配置不当,阻断了VRRP心跳消息传输。

  6. VRRP配置不一致
    同一VRRP实例的virtual_router_id参数在两端配置不匹配,可能引发裂脑问题。

  7. VRRP实例配置冲突
    VRRP实例名称不一致或优先级相同导致的配置冲突问题。

3.3 应对策略

  • 双心跳线冗余
    采用双心跳线设计(如HA双线路),通过冗余配置显著降低"脑裂"现象的发生概率。

  • 磁盘锁机制(共享资源锁定)
    主服务节点通过锁定共享磁盘来确保资源独占性。当发生"脑裂"时,备用节点将无法获取共享资源。
    该机制存在一个显著缺陷:若主节点异常崩溃导致无法主动释放锁,备用节点将长期无法接管服务。为此,现代HA系统引入了智能锁机制——仅在检测到所有心跳线中断时才会激活磁盘锁,常态下保持解锁状态。

  • 仲裁机制(Ping参考IP)
    配置参考IP(如网关IP)作为仲裁节点。当心跳完全中断时,双方节点会尝试ping通参考IP:

    • 无法连通的一方判定自身网络故障,主动放弃服务竞争
    • 能连通的一方接管服务
      为彻底释放资源,建议无法连通参考IP的节点执行自我重启。
  • 脚本监控报警
    部署监控脚本实时检测系统状态,异常时触发告警机制。

四、LVS+Keepalived 集群部署实践

4.1 环境准备

角色IP 地址软件组件虚拟 IP (VIP)
主 DR 服务器192.168.10.110ipvsadm, keepalived192.168.10.180
备 DR 服务器192.168.10.119ipvsadm, keepalived192.168.10.180
Web 服务器 1192.168.10.120nginx192.168.10.180 (lo:0)
Web 服务器 2192.168.10.123nginx192.168.10.180 (lo:0)
客户端192.168.10.2--

4.2 负载调度器配置(主备相同)

4.2.1 基础环境配置

systemctl stop firewalld.service
setenforce 0
yum -y install ipvsadm keepalived
modprobe ip_vs
cat /proc/net/ip_vs  # 检查模块

在这里插入图片描述
在这里插入图片描述

4.2.2 Keepalived 配置

  • 文件: /etc/keepalived/keepalived.conf

主备服务器均需进行以下配置:

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

在这里插入图片描述

配置文件内容如下:

global_defs {smtp_server 127.0.0.1router_id LVS_01   # 备服务器改为 LVS_02# vrrp_strict
}vrrp_instance VI_1 {state MASTER        # 备服务器改为 BACKUPinterface ens33virtual_router_id 10priority 100        # 备服务器改为 90advert_int 1authentication {auth_type PASSauth_pass abc123}virtual_ipaddress {192.168.10.180}
}virtual_server 192.168.10.180 80 {delay_loop 6lb_algo rrlb_kind DRpersistence_timeout 50protocol TCPreal_server 192.168.10.120 80 {weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}real_server 192.168.10.123 80 {weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}
}

4.2.3 配置虚拟 IP

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

在这里插入图片描述

4.2.4 启动服务

systemctl start keepalived
ip addr show  # 查看虚拟 IP 是否生效
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -ln   # 查看 IPVS 规则

在这里插入图片描述

4.2.5 调整内核参数

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

在这里插入图片描述

4.3 节点服务器配置

4.3.1 Web 服务器基础配置

systemctl stop firewalld
setenforce 0
yum -y install nginx
systemctl start nginx
  • Web1 (192.168.10.120):
echo "<h1>this is 192.168.10.120 web01</h1>" > /usr/local/nginx/html//index.html
  • Web2 (192.168.10.123):
echo "<h1>this is 192.168.10.123 web02</h1>" > /usr/local/nginx/html//index.html

4.3.2 配置 Loopback 接口

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
ifconfig lo:0
route add -host 192.168.10.180 dev lo:0

在这里插入图片描述
在这里插入图片描述

4.3.3 调整 ARP 参数

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

在这里插入图片描述

4.4 测试验证

1、客户端访问 VIP,轮询显示不同节点页面内容:

http://192.168.10.180/

在这里插入图片描述

在这里插入图片描述
2、停掉 MASTER Keepalived:

在这里插入图片描述

# 在主DR上执行
systemctl stop keepalived

在这里插入图片描述

3、观察 BACKUP 节点接管 VIP 是否成功。
在这里插入图片描述

4、再启动 MASTER,观察 VIP 是否回归(抢占或非抢占模式)。
在这里插入图片描述

总结

LVS+Keepalived 集群架构为企业提供了高性能、高可用的负载均衡解决方案。通过本文的理论讲解和实践部署,我们可以了解到:

  1. Keepalived 基于 VRRP 协议实现高可用性,能够有效解决单点故障问题
  2. LVS 提供负载均衡功能,结合 Keepalived 可实现故障自动切换
  3. 合理配置健康检查机制可以确保后端服务的可靠性
  4. 脑裂问题是高可用系统中需要特别注意和防范的现象
  5. 通过实战部署,我们掌握了 LVS+Keepalived 集群的搭建和配置方法

这种架构不仅适用于 Web 服务,还可以为数据库、应用服务器等多种服务提供高可用保障,是企业级应用架构中不可或缺的重要组成部分。


注意:实际部署时应根据网络环境和业务需求调整配置参数,并进行充分测试以确保系统的稳定性和可靠性。


文章转载自:

http://9Dt0wo0T.sypzg.cn
http://fO5sMnkG.sypzg.cn
http://cwLcqFtW.sypzg.cn
http://WWU4TCxW.sypzg.cn
http://dEe16Uda.sypzg.cn
http://trA1rMYZ.sypzg.cn
http://C7NPcGWC.sypzg.cn
http://zrU5dNRR.sypzg.cn
http://zqCsqhnn.sypzg.cn
http://IaOjUxyy.sypzg.cn
http://uk4Yq72S.sypzg.cn
http://tlA4KjfC.sypzg.cn
http://QeDMs6kK.sypzg.cn
http://aipnNxTK.sypzg.cn
http://SePvZSTw.sypzg.cn
http://pyTYkv3c.sypzg.cn
http://lqUrDxxI.sypzg.cn
http://B7wGy6Oh.sypzg.cn
http://k6mXhIf2.sypzg.cn
http://x3zdUIlo.sypzg.cn
http://gswectp2.sypzg.cn
http://vdtSn2ic.sypzg.cn
http://PXKbtgoD.sypzg.cn
http://ZCguhnIo.sypzg.cn
http://PVXYW6VO.sypzg.cn
http://FAV9s5Ml.sypzg.cn
http://GyLqldic.sypzg.cn
http://4xYyi0fU.sypzg.cn
http://ZvkC6tul.sypzg.cn
http://tPejvbuP.sypzg.cn
http://www.dtcms.com/a/377946.html

相关文章:

  • C++ 前缀积 高频笔试考点 实用技巧 力扣 238.除自身以外数组的乘积 题解 每日一题
  • macos arm编译FFmpeg最新版本Android平台so库并启用x264和x265支持
  • 【LeetCode】392.判断子序列
  • StreamCap(直播录制) v1.0.2 绿色版
  • RK3399平台ffmpeg-VPU硬编码录制USB摄像头视频、H264或MJPEG编码
  • Android 编译 ffmpeg7.1.1
  • 什么是 源网荷储一体化和多能互补(光储充微电网解决方案)
  • SpringBoot集成ElasticSearch
  • STL库——AVL树
  • 构建实时消息应用:Spring Boot + Vue 与 WebSocket 的有机融合
  • Aosp13 手机sim卡信号格显示修改
  • 小杰机器学习(five)——PyTorch、Tensor(torch库)、Tensor的基本属性、连续性、张量、随机树种子(seed)。
  • ARM 架构的异常模型(Exception Model)
  • 深度学习——基于 PyTorch 的 CBOW 模型实现自然语言处理
  • Spring Cloud Alibaba快速入门03-OpenFeign进阶用法
  • 【PyTorch】多对象分割
  • npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚
  • NodeJS 8 ,从 0 到 1:npm 包发布与更新全流程指南( 含多场景适配与踩坑总结 )
  • Debian 系统上安装与配置 MediaMTX
  • 【PyTorch训练】准确率计算(代码片段拆解)
  • 【Linux】线程池——详细讲解
  • Linux epoll 机制的核心控制函数——`epoll_ctl`
  • 粒子群优化(PSO)算法详解:从鸟群行为到强大优化工具
  • 从两分钟到毫秒级:一次真实看板接口性能优化实战(已上线)
  • Java入门级教程17——利用Java SPI机制制作验证码、利用Java RMI机制实现分布式登录验证系统
  • 【Redis】常用数据结构之List篇:从常用命令到典型使用场景
  • 掌握单元测试的利器:JUnit 注解从入门到精通
  • 【Vue2手录05】响应式原理与双向绑定 v-model
  • spring项目部署后为什么会生成 logback-spring.xml文件
  • Java 日期字符串万能解析工具类(支持多种日期格式智能转换)