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)。

相关推荐
会飞的土拨鼠呀3 小时前
Debian 操作系统全面介绍
运维·debian
wanhengidc3 小时前
服务器内存不足会造成哪些影响?
运维·服务器·网络·游戏·智能手机
广州腾科助你拿下华为认证4 小时前
华为HICE云计算的含金量高吗?
运维·服务器·hcie证书
学c语言的枫子5 小时前
Linux文件IO——系统IO
linux·运维·服务器
格林威5 小时前
短波红外相机在机器视觉检测方向的应用
运维·人工智能·深度学习·数码相机·计算机视觉·视觉检测
tjjingpan5 小时前
mosdns缓存dns服务器配置记录
运维·服务器·缓存
深圳衡益科技5 小时前
温湿度传感器如何守护工业制造?
运维·服务器
知北游天6 小时前
Linux网络:初识网络
linux·运维·网络
染指11106 小时前
13.渗透-.Linux基础命令(五)-用户管理(修改用户密码)
linux·运维·服务器·linux命令