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 互不影响,各自的健康检查、调度算法和会话保持配置都可以独立设置。

bash 复制代码
global_defs {
    router_id LB_MASTER
    enable_script_security
}

# HTTP 负载均衡
virtual_server 10.20.230.32 80 {
    delay_loop 6
    lb_algo wlc
    lb_kind DR
    persistence_timeout 300   # HTTP 会话保持,时间相对较短
    protocol TCP
    
    real_server 192.168.1.10 80 {
        weight 2
        HTTP_GET {
            url {
                path /health
                status_code 200
            }
            connect_timeout 3
            retry 3
            delay_before_retry 2
        }
    }
    
    real_server 192.168.1.11 80 {
        weight 1
        HTTP_GET {
            url {
                path /health
                status_code 200
            }
            connect_timeout 3
            retry 3
            delay_before_retry 2
        }
    }
}

# HTTPS 负载均衡
virtual_server 10.20.230.32 443 {
    delay_loop 6
    lb_algo wlc              # 加权最少连接算法
    lb_kind DR
    persistence_timeout 600   # HTTPS 会话保持时间更长
    protocol TCP
    
    # 后端服务器1 - 高性能服务器
    real_server 192.168.1.10 443 {
        weight 3             # 更高的权重
        inhibit_on_failure   # 失败时禁用
        
        SSL_GET {            # HTTPS 健康检查
            url {
                path /health
                status_code 200
            }
            connect_timeout 3
            retry 3
            delay_before_retry 2
        }
    }
    
    # 后端服务器2 - 普通服务器
    real_server 192.168.1.11 443 {
        weight 1
        inhibit_on_failure
        
        SSL_GET {
            url {
                path /health
                status_code 200
            }
            connect_timeout 3
            retry 3
            delay_before_retry 2
        }
    }
}

高级配置技巧

会话保持配置

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

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

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

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

bash 复制代码
# 步骤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 6
    lb_algo wlc
    lb_kind DR
    protocol TCP
    
    real_server 192.168.1.10 0 {  # 端口0表示所有端口
        weight 2
        MISC_CHECK {
            misc_path "/usr/local/bin/check_multi_port.sh 192.168.1.10 80 443"
        }
    }
    
    real_server 192.168.1.11 0 {
        weight 1
        MISC_CHECK {
            misc_path "/usr/local/bin/check_multi_port.sh 192.168.1.11 80 443"
        }
    }
}

# 内网服务器组
virtual_server fwmark 200 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    protocol TCP
    
    real_server 192.168.1.20 443 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
        }
    }
}

# 外网服务器组
virtual_server fwmark 300 {
    delay_loop 6
    lb_algo wlc
    lb_kind DR
    protocol TCP
    
    real_server 192.168.2.10 443 {
        weight 2
        TCP_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)。

相关推荐
AC赳赳老秦20 分钟前
Shell 脚本批量生成:DeepSeek 辅助编写服务器运维自动化指令
运维·服务器·前端·vue.js·数据分析·自动化·deepseek
学Linux的语莫34 分钟前
linux的root目录缓存清理
linux·运维·服务器
oMcLin35 分钟前
如何在 SUSE Linux Enterprise Server 15 上部署并优化 K3s 集群,提升轻量级容器化应用的资源利用率?
linux·运维·服务器
Run Out Of Brain1 小时前
解决nginx代理配置下wordpress的 /wp-admin/返回 302 重定向到登录页问题
运维·nginx
Ghost Face...1 小时前
深入解析YT6801驱动模块架构
linux·运维·服务器
线束线缆组件品替网1 小时前
Amphenol LTW 防水线缆 IP67/IP68 结构解析
运维·网络·人工智能·汽车·硬件工程·材料工程
放寒假脚后跟v1 小时前
Pod 的 YAML 文件中 exitCode 字段的具体含义、不同取值代表的场景
运维·云原生·容器·kubernetes·k8s
东方佑1 小时前
使用Docker Compose一键部署OnlyOffice:完整指南与配置解析
运维·docker·容器
赵文宇(温玉)2 小时前
Docker的价值、特点、创新与关键技术
运维·docker·容器
芝麻馅汤圆儿2 小时前
cpu 大小核
linux·运维·centos