Keepalived 负载均衡


Keepalived 负载均衡

Keepalived 可以与 LVS(Linux Virtual Server)结合,提供强大的四层负载均衡功能。它通过 IPVS(IP Virtual Server)内核模块实现高性能的负载分发。

核心组件

  • Virtual Server:虚拟服务器,对外提供服务的 VIP
  • Real Server:真实服务器,实际处理请求的后端服务器
  • IPVS:Linux 内核中的负载均衡模块
  • 健康检查:监控后端服务器状态

工作模式

模式说明特点适用场景
DR(Direct Routing)直接路由性能最高,要求在同一网段大流量场景
NAT(Network Address Translation)网络地址转换配置简单,性能较低小规模应用
TUN(IP Tunneling)IP 隧道可跨网段,性能中等跨机房部署

完整的环境配置

这两个服务在 Keepalived 中通过分别定义不同的 virtual_server 来区分。
由于 IPVS 是基于 <虚拟IP,端口,协议> 三元组建立映射的,因此 80 和 443 互不影响,各自的健康检查、调度算法和会话保持配置都可以独立设置。

global_defs {router_id LB_MASTERenable_script_security
}# HTTP 负载均衡
virtual_server 10.20.230.32 80 {delay_loop 6lb_algo wlclb_kind DRpersistence_timeout 300   # HTTP 会话保持,时间相对较短protocol TCPreal_server 192.168.1.10 80 {weight 2HTTP_GET {url {path /healthstatus_code 200}connect_timeout 3retry 3delay_before_retry 2}}real_server 192.168.1.11 80 {weight 1HTTP_GET {url {path /healthstatus_code 200}connect_timeout 3retry 3delay_before_retry 2}}
}# HTTPS 负载均衡
virtual_server 10.20.230.32 443 {delay_loop 6lb_algo wlc              # 加权最少连接算法lb_kind DRpersistence_timeout 600   # HTTPS 会话保持时间更长protocol TCP# 后端服务器1 - 高性能服务器real_server 192.168.1.10 443 {weight 3             # 更高的权重inhibit_on_failure   # 失败时禁用SSL_GET {            # HTTPS 健康检查url {path /healthstatus_code 200}connect_timeout 3retry 3delay_before_retry 2}}# 后端服务器2 - 普通服务器real_server 192.168.1.11 443 {weight 1inhibit_on_failureSSL_GET {url {path /healthstatus_code 200}connect_timeout 3retry 3delay_before_retry 2}}
}

高级配置技巧

会话保持配置

会话保持(Session Persistence)适用于需要 长时间维持客户端和同一后端服务器交互 的业务场景:

  • 流媒体(视频点播/直播):避免反复切换服务器导致播放卡顿
  • WebSocket 长连接:必须确保连接持续性
  • 在线文档/协作系统:会话中断会影响用户体验
virtual_server 192.168.1.100 80 {delay_loop 6lb_algo wlclb_kind DRprotocol TCPpersistence_timeout 1800   # 30分钟会话保持# 基于客户端 IP 的会话保持persistence_granularity 255.255.255.0  # 按 C 类网段real_server 192.168.1.10 80 {weight 1TCP_CHECK {connect_timeout 3}}
}

基于防火墙标记的负载均衡

这种方式提供了更灵活的流量控制能力:

# 步骤1:设置防火墙标记
# 标记 HTTP 和 HTTPS 流量
iptables -t mangle -A PREROUTING -d 10.20.230.32 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 100# 标记来自内网的流量
iptables -t mangle -A PREROUTING -s 192.168.0.0/16 -d 10.20.230.32 -p tcp --dport 443 -j MARK --set-mark 200# 标记来自外网的流量
iptables -t mangle -A PREROUTING ! -s 192.168.0.0/16 -d 10.20.230.32 -p tcp --dport 443 -j MARK --set-mark 300# 步骤2:Keepalived 配置
# 多端口服务
virtual_server fwmark 100 {delay_loop 6lb_algo wlclb_kind DRprotocol TCPreal_server 192.168.1.10 0 {  # 端口0表示所有端口weight 2MISC_CHECK {misc_path "/usr/local/bin/check_multi_port.sh 192.168.1.10 80 443"}}real_server 192.168.1.11 0 {weight 1MISC_CHECK {misc_path "/usr/local/bin/check_multi_port.sh 192.168.1.11 80 443"}}
}# 内网服务器组
virtual_server fwmark 200 {delay_loop 6lb_algo rrlb_kind DRprotocol TCPreal_server 192.168.1.20 443 {weight 1TCP_CHECK {connect_timeout 3}}
}# 外网服务器组
virtual_server fwmark 300 {delay_loop 6lb_algo wlclb_kind DRprotocol TCPreal_server 192.168.2.10 443 {weight 2TCP_CHECK {connect_timeout 3}}
}

什么是四层负载均衡

四层负载均衡是指在 OSI 模型第四层(传输层) 工作的负载均衡方式。第四层包含 TCP/UDP 协议,所以四层负载均衡的调度依据主要是:

  • IP 地址(源 IP/目的 IP)
  • 端口号(源端口/目的端口)
  • TCP/UDP 会话信息

在这种模式下,负载均衡器并不关心 HTTP、HTTPS、MQTT 等应用层协议的具体内容,而是根据 五元组 (源 IP, 源端口, 目的 IP, 目的端口, 传输协议) 来分发流量。


四层负载均衡的工作原理

假设有一台四层负载均衡器(LB),前面接收用户请求,后面挂着多台真实服务器(Real Server):

  1. 客户端发起连接:客户端向负载均衡器的 VIP(虚拟 IP)发起 TCP/UDP 请求。
  2. 负载均衡器选择后端:LB 根据四层信息(IP+端口+协议),使用一定的调度算法(如轮询 Round Robin、最少连接 Least Connection、一致性哈希等)选中一个真实服务器。
  3. 转发数据:LB 会把客户端的请求报文转发给选中的后端服务器。
    • 可能是 NAT 模式:对请求包头的目的 IP 和端口进行修改,再转发。
    • 可能是 DSR(直接路由模式):只修改二层 MAC,不修改 IP。
    • 可能是 TProxy(透明模式):保持源 IP 不变,直发后端。
  4. 返回给客户端
    • 如果是 NAT,返回流量需要经由 LB,由 LB 改写后返回客户端。
    • 如果是 DSR,后端服务器直接把结果返回给客户端(高性能,但需要配置 VIP)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/99093.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/99093.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

拷打DeepSeek实现自动生成差分电荷计算文件和后处理

差分电荷&#xff08;charge density difference&#xff09;是材料模拟中分析电子结构变化的直观工具。 它把成键后的真实电荷密度减去成键前各碎片叠加的电荷密度&#xff0c;得到一张“电子迁移地图” 于是可以一眼看出化学键形成时电子从哪里来到哪里去&#xff0c;表面吸…

AI问答-Nuxt4:什么时候发布的,有哪些特性,和Nuxt3相比 有哪些优势 / Nuxt4 / Nuxt-v4

Nuxt 4于2025年7月至8月期间正式发布&#xff0c;作为Nuxt框架的重大版本更新&#xff0c;其核心聚焦于稳定性提升、开发者体验优化及性能增强&#xff0c;与Nuxt 3相比&#xff0c;优势体现在项目结构、数据获取、类型系统、开发工具链等多个层面。一、Nuxt 4 发布时间线测试阶…

isinstance()和insubclass()

​​isinstance() 和 issubclass() 的功能与用法​​​​1. isinstance(obj, classinfo)​​​​功能​​&#xff1a;检查对象 obj 是否是 classinfo 类&#xff08;或其子类&#xff09;的实例。 ​​返回值​​&#xff1a;True 或 False。 ​​用法​​&#xff1a;class A…

判断QMetaObject::invokeMethod()里的函数是否调用成功

今天&#xff0c;在Qt编程&#xff0c;碰到一个需要使用invokeMethod方式来获取函数是否执行成功的情况。     invokeMethod()即可以同步调用&#xff0c;也可以异步调用。若调用者、被调用者&#xff0c;都在同一个线程&#xff0c;则是同步调用&#xff1b;若调用者、被调用…

【linux】特殊权限

us对文件&#xff1a;用户执行该文件时&#xff0c;会以文件所有者的权限运行chmod us filename # 符号模式 chmod 4755 filename # 数字模式&#xff08;4表示SetUID&#xff09;典型应用&#xff1a;/usr/bin/passwd&#xff08;允许普通用户修改自己的密码&#xff0c;…

OpenCV:指纹识别

目录 一、核心算法 1&#xff1a;SIFT 特征提取&#xff08;尺度不变特征变换&#xff09; 1.1 算法原理&#xff08;4 步核心流程&#xff09; 1.2 重点代码实现与参数解析 1.3 关键输出解读 二、核心算法 2&#xff1a;FLANN 特征匹配&#xff08;快速最近邻搜索&#x…

快速排序:高效的分治排序算法

快速排序因其平均时间复杂度$O(n\log n)$而成为广泛应用的高效排序算法。其核心是分治法: 选择基准 (Pivot):从待排序序列中选取一个元素(如第一个元素$arr[0]$)。 分区 (Partition):将序列重新排列,所有小于基准的元素置于其前,大于或等于的置于其后。基准元素最终位于…

网络编程之UDP广播与粘包问题

一&#xff0c;广播简介从上述讲的例⼦中&#xff0c;不管是TCP协议还是UDP协议&#xff0c;都是”单播”, 就是”点对点”的进⾏通信&#xff0c;如果要对网络里面的所有主机进⾏通信&#xff0c;实现”点对多”的通信&#xff0c;我们可以使用UDP中的⼴播通信。 理论上可以像…

教育领域大模型生成题目安全研究报告

教育领域大模型生成题目安全研究报告 一、研究背景与意义 随着大语言模型&#xff08;LLM&#xff09;在教育领域的深度应用&#xff0c;自动生成题目已成为提升教学效率、实现个性化教学的关键技术手段&#xff0c;广泛应用于课堂练习、作业布置、考试命题等场景。然而&…

Android安卓项目调试之Gradle 与 Gradle Wrapper的概念以及常用gradle命令深度详解-优雅草卓伊凡

Android安卓项目调试之Gradle 与 Gradle Wrapper的概念以及常用gradle命令深度详解-优雅草卓伊凡好的&#xff0c;我们来详细梳理一下 Android 开发中 Gradle 的常用配置和调试命令。这对于每一位 Android 开发者来说都是必须掌握的核心技能。第一部分&#xff1a;Gradle 与 Gr…

Maven入门_简介、安装与配置

ZZHow(ZZhow1024) 参考课程&#xff1a; 【尚硅谷新版Maven教程】 [https://www.bilibili.com/video/BV1JN411G7gX] 一、Maven简介 02_依赖管理工具 解决 jar 包的规模问题解决 jar 包的来源问题解决 jar 包的导入问题解决 jar 包之间的依赖 03_构建工具 我们没有注意过…

Spark(1):不依赖Hadoop搭建Spark环境

不依赖Hadoop搭建Spark环境0 概述1 单机安装Spark1.1 下载Spark预编译包1.2 解压和设置1.3 配置环境变量1.4 验证安装2 Spark运行模式2.1 Local模式&#xff08;本地模式&#xff09;2.1.1 Spark Shell2.1.1.1 Python版的Shell2.1.1.2 Scala版的Shell2.1.2 提交独立的Spark应用…

【ThreeJs】【自带依赖】Three.js 自带依赖指南

&#x1f6e0;️ Three.js 辅助库生态手册 定位&#xff1a;覆盖 90% 开发场景的工具选型实操指南&#xff0c;区分「入门必备」和「进阶扩展」。 适用人群&#xff1a;Three.js 新手&#xff08;≥ r132 版本&#xff09;、需要规范开发流程的团队。 1. 控制器&#xff08;Co…

Mac电脑上如何打印出字体图标

背景 我今天打开了一个之前开发的APP&#xff0c;看到项目中用到了字体图标&#xff0c;发现有个“面条”图标用错了&#xff0c;想着修改一下吧。然后用输入法打出”面条“&#xff0c;在输入法的弹窗中就一直往下找&#xff0c;发现并没有出现图标。 想着打出”面条图标“也没…

当AI遇上数据库:Text2Sql.Net如何让“说人话查数据“成为现实

一句话概括&#xff1a;还在为写复杂SQL而头疼&#xff1f;Text2Sql.Net让你用自然语言就能查数据库&#xff0c;堪称程序员的"数据库翻译官"&#xff01; &#x1f3af; 引言&#xff1a;从"SQL地狱"到"自然语言天堂" 想象一下这样的场景&…

整体设计 之 绪 思维导图引擎 之 引 认知系统 之8 之 序 认知元架构 之4 统筹:范畴/分类/目录/条目 之2 (豆包助手 之6)

问题Q68、我们现在仅仅分析了 认知演进 的 “进”的问题&#xff0c;通过层次结构 和 统筹 的同构约束 给出了 不同对象及其对应的操作和约束。 --这句话 你能完全理解吗&#xff08;这意味着 完整的程序细节设计&#xff09;。 还没有分析的还有 “演” 以及组合词 “演进” -…

开始 ComfyUI 的 AI 绘图之旅-Qwen-Image-Edit(十二)

文章标题一、Qwen-Image-Edit1.ComfyOrg Qwen-Image-Edit 直播回放2.Qwen-Image-Edit ComfyUI 原生工作流示例2.1 工作流文件2.2 模型下载3.3 按步骤完成工作流一、Qwen-Image-Edit Qwen-Image-Edit 是 Qwen-Image 的图像编辑版本&#xff0c;基于20B模型进一步训练&#xff0c…

机械制造专属ERP:降本增效与数字转型的关键

转型升级压力下&#xff0c;ERP系统是机械企业破局的得力助手。本文深入解析ERP的核心功能、选型要点与实施价值&#xff0c;助您精准选型&#xff0c;赋能智能制造&#xff0c;全面提升竞争力。在数字化浪潮席卷之下&#xff0c;机械制造企业正面临提质、增效、降本的关键转型…

npm / yarn / pnpm 包管理器对比与最佳实践(含国内镜像源配置与缓存优化)

这篇不是“谁更快”的玄学讨论,而是把团队能落地的做法一次说清:如何选型、如何统一版本、如何把镜像与缓存配好、如何在 CI 和 Monorepo 下稳住“可重复构建”。 一、结论先说在前 单仓库 / 以稳定为先:直接用 npm(配合 npm ci) 足够,维护成本低,生态一等一,Node 16.1…

Python项目全面打包指南:从EXE到绿色软件包

📦 Python项目全面打包指南:从EXE到绿色软件包 文章目录 📦 Python项目全面打包指南:从EXE到绿色软件包 1 打包基础概念与工具选型 1.1 核心打包概念 1.2 工具对比与选型 2 项目环境准备与依赖管理 2.1 创建和管理虚拟环境 2.2 依赖管理最佳实践 2.3 依赖导出与规范文件处…