Keepalived 负载均衡

发布于:2025-09-14 ⋅ 阅读:(23) ⋅ 点赞:(0)

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_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 长连接:必须确保连接持续性
  • 在线文档/协作系统:会话中断会影响用户体验
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
        }
    }
}

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

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

# 步骤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)。


网站公告

今日签到

点亮在社区的每一天
去签到