Keepalived LVS 虚拟服务器配置逐行解析

virtual_server 192.168.12.200 80 {          # 【虚拟服务器定义】VIP: 192.168.12.200, 端口: 80
                                          # 所有访问这个VIP:80的请求都会被负载均衡
   
    delay_loop 6                            # 【健康检查间隔】每6秒检查一次后端服务器状态
                                          # 单位秒,太短增加负载,太长故障发现慢
   
    lb_algo wlc                              # 【负载均衡算法】wlc = 加权最少连接
                                          # 最推荐的算法,兼顾权重和当前连接数
                                          # 其他选项:rr/wrr/lc
   
    lb_kind DR                                # 【负载均衡模式】DR = 直接路由
                                          # 性能最好,响应流量不经过调度器
                                          # 要求调度器和后端在同一物理网络
   
    protocol TCP                              # 【协议类型】TCP协议
                                          # 大多数应用都是TCP,少数UDP
   
    # ==============================================
    # 第一台后端服务器
    # ==============================================
    real_server 192.168.12.132 80 {          # 【真实服务器】后端服务器IP和端口
                                          # 这台服务器真正提供Web服务
       
        weight 3                              # 【权重】处理能力权重
                                          # 权重3表示这台服务器可以处理3份流量
                                          # 配合wlc算法,权重越高分配的连接越多
       
        inhibit_on_failure                     # 【故障禁用模式】故障时权重设为0
                                          # 不加此项:故障时直接从列表删除
                                          # 加上此项:保留在列表但权重为0
                                          # 便于恢复时自动加回
       
        notify_up "/etc/keepalived/real_up.sh 192.168.12.132"    # 【上线通知】服务器恢复正常时执行
                                                              # 脚本参数传入了IP,便于区分
       
        notify_down "/etc/keepalived/real_down.sh 192.168.12.132" # 【下线通知】服务器发生故障时执行
                                                                # 可以发邮件、钉钉告警
        
        # 健康检查方式(TCP_CHECK)
        TCP_CHECK {                           # TCP健康检查块
            connect_timeout 3                   # 【连接超时】尝试连接的超时时间,单位秒
                                               # 3秒内连不上就认为失败
            
            connect_port 80                      # 【检查端口】要检查的端口号
                                               # 这里检查80端口是否开放
        }                                      # TCP_CHECK是最简单的检查方式
                                               # 只检查端口通不通
    }
    
    # ==============================================
    # 第二台后端服务器
    # ==============================================
    real_server 192.168.12.133 80 {
        weight 2                              # 权重2,处理能力比第一台稍弱
       
        inhibit_on_failure                     # 同样启用故障禁用模式
       
        notify_up "/etc/keepalived/real_up.sh 192.168.12.133"    # 不同IP,脚本里可以区分
        notify_down "/etc/keepalived/real_down.sh 192.168.12.133"
        
        TCP_CHECK {
            connect_timeout 3
            connect_port 80
        }
    }
}                                            # 可以继续添加更多real_server

virtual_server 段参数详解

1. virtual_server —— 虚拟服务定义

virtual_server 192.168.12.200 80
  • 作用:定义要对哪个VIP和端口进行负载均衡
  • 格式virtual_server <VIP> <端口>
  • 示例virtual_server 192.168.12.200 80 表示对访问192.168.12.200的80端口的请求进行负载均衡
  • 说明:这是LVS配置的入口,所有后续配置都是针对这个VIP:PORT组合的

2. delay_loop —— 健康检查间隔

delay_loop 6
  • 作用:每隔6秒检查一次后端服务器是否存活
  • 单位:秒
  • 建议值:6-10秒
  • 太短:增加系统负载,可能因网络抖动误判
  • 太长:故障发现慢,影响用户体验
  • 生产常用:6秒

3. lb_algo —— 负载均衡算法

lb_algo wlc
  • 作用:指定使用哪种算法来分配请求到后端服务器
  • 常用算法
算法全称说明适用场景
rrRound Robin轮询,请求平均分配后端服务器配置相同
wrrWeighted Round Robin加权轮询后端服务器性能不同
lcLeast Connection最少连接请求处理时间差异大
wlcWeighted Least Connection加权最少连接最常用,推荐
  • wlc特点:兼顾服务器权重和当前连接数,是最智能的算法

4. lb_kind —— 负载均衡模式

lb_kind DR
  • 作用:指定LVS的工作模式
  • 可选模式
模式全称说明特点
DRDirect Routing直接路由最常用,性能最好,要求调度器和后端在同一物理网络
NATNetwork Address Translation网络地址转换调度器修改目的IP,进出都经过调度器,易成瓶颈
TUNTunneling隧道模式可跨网段,但配置复杂
  • DR模式工作原理
  1. 用户请求到调度器(VIP)
  2. 调度器只修改MAC地址,直接转发给后端
  3. 后端直接返回给用户(不经过调度器)
  4. 性能最高,因为响应流量不经过调度器

5. protocol —— 协议类型

protocol TCP
  • 作用:指定要负载均衡的协议类型
  • 选项:TCP 或 UDP
  • 大多数应用:HTTP/HTTPS、MySQL、Redis等都走TCP
  • UDP场景:DNS、NTP、视频流等

real_server 段参数详解

6. real_server —— 真实服务器定义

real_server 192.168.12.132 80
  • 作用:定义一台真正提供服务的后端服务器
  • 格式real_server <IP> <端口>
  • 说明:可以配置多个real_server,组成服务器池
  • 注意:IP和端口必须与实际服务一致

7. weight —— 权重

weight 3
  • 作用:定义这台服务器的处理能力权重
  • 范围:通常1-100,也可以更大
  • 默认值:1
  • 含义:权重越高,分配的请求越多
  • 示例
  • weight 3:处理能力是基准的3倍
  • weight 1:基准处理能力
  • 配合算法:只有使用wrr、wlc等加权算法时才有效

8. inhibit_on_failure —— 故障时禁用

inhibit_on_failure
  • 作用:当健康检查失败时的处理方式
  • 不加此项:故障时从转发列表中直接删除该服务器
  • 加上此项:故障时保留在列表中,但权重设为0
  • 优点:恢复时自动加回,配置不变,便于监控
  • 缺点:列表中始终显示故障服务器
  • 生产建议:加上,便于查看所有后端的整体状态

9. notify_up —— 上线通知脚本

notify_up "/etc/keepalived/real_up.sh 192.168.12.132"
  • 作用:服务器从故障恢复为正常时执行的脚本
  • 格式notify_up <脚本路径> [参数]
  • 触发时机:健康检查从失败变为成功时
  • 用途
  • 发送邮件通知管理员
  • 发送钉钉/企业微信告警
  • 记录恢复日志
  • 触发其他自动化操作
  • 脚本参数:可以传参,如传入IP便于区分多台服务器

10. notify_down —— 下线通知脚本

notify_down "/etc/keepalived/real_down.sh 192.168.12.132"
  • 作用:服务器从正常变为故障时执行的脚本
  • 格式notify_down <脚本路径> [参数]
  • 触发时机:健康检查从成功变为失败时
  • 用途
  • 立即通知管理员处理
  • 记录故障时间
  • 触发自愈脚本
  • 脚本参数:可以传参,如传入IP便于区分多台服务器

TCP_CHECK 段参数详解

11. TCP_CHECK —— TCP健康检查块

TCP_CHECK {
    ...
}
  • 作用:定义一个TCP健康检查方式
  • 原理:尝试建立TCP连接,能连上就认为服务正常
  • 特点:最简单、最常用的检查方式
  • 其他检查方式
  • HTTP_GET:检查HTTP响应状态码
  • SSL_GET:检查HTTPS服务
  • MISC_CHECK:自定义脚本检查

12. connect_timeout —— 连接超时

connect_timeout 3
  • 作用:尝试建立TCP连接的超时时间
  • 单位:秒
  • 含义:3秒内无法建立连接就认为检查失败
  • 建议值:2-5秒
  • 太短:可能因网络延迟误判
  • 太长:检查效率低,故障发现慢

13. connect_port —— 检查端口

connect_port 80
  • 作用:指定要检查的目标端口
  • 必须:与real_server定义的端口一致
  • 示例
  • Web服务:80或443
  • MySQL:3306
  • Redis:6379

参数速查表

参数所属层级作用常用值必填
virtual_server顶层定义VIP和端口IP:PORT
delay_loop顶层健康检查间隔6-10秒
lb_algo顶层负载均衡算法wlc/rr/wrr
lb_kind顶层转发模式DR/NAT/TUN
protocol顶层协议类型TCP/UDP
real_server二级定义后端服务器IP:PORT
weightreal_server服务器权重1-100
inhibit_on_failurereal_server故障时权重置0不加参数
notify_upreal_server上线通知脚本脚本路径
notify_downreal_server下线通知脚本脚本路径
TCP_CHECKreal_serverTCP检查方式块结构
connect_timeoutTCP_CHECK连接超时2-5秒
connect_portTCP_CHECK检查端口服务端口

一句话总结每个参数

参数一句话解释
virtual_server要负载均衡的VIP和端口
delay_loop多久检查一次后端是否活着
lb_algo用什么算法分流量
lb_kind用什么模式转发请求
protocol是TCP还是UDP服务
real_server具体哪台服务器在干活
weight这台服务器能扛多少流量
inhibit_on_failure故障时”隐身”而不是”退群”
notify_up服务器好了通知我
notify_down服务器挂了通知我
TCP_CHECK用TCP连接的方式检查
connect_timeout几秒连不上算失败
connect_port检查哪个端口

Keepalived 高级健康检查配置逐行解析


HTTP_GET 健康检查方式详解

nginx复制下载

HTTP_GET {                                # 【HTTP检查方式】通过HTTP协议检查Web服务是否正常
                                          # 比TCP_CHECK更精确,能确认HTTP响应是否正确
   
    url {                                  # 【URL检查块】可以定义多个url,都成功才算健康
        path  /index.html                   # 【检查路径】要请求的URL路径
                                            # 示例:/index.html、/health、/status
                                            # 建议用专门的健康检查页面
       
        digest  e6c271eb5f017f280cf97ec2f51b02d3  
                                            # 【内容摘要】期望返回内容的MD5值
                                            # 作用:确认返回内容是否正确,防止返回错误页面
                                            # 生成方法:curl -s /index.html | md5sum
                                            # 如果不关心内容,可以不加此项
       
        status_code   200                    # 【状态码】期望的HTTP响应状态码
                                            # 200:正常
                                            # 其他常用:301、302(重定向)
    }                                       # 可以配置多个url,全部满足才算健康
   
    connect_port 80                          # 【检查端口】要连接的端口
                                            # HTTP默认80,HTTPS默认443
   
    bindto  192.168.12.80                    # 【绑定源IP】用哪个本地IP去连接后端
                                            # 可选参数,多IP环境用于指定出口IP
                                            # 不指定则用系统默认路由
   
    connect_timeout  3                        # 【连接超时】建立TCP连接的超时时间
                                            # 单位秒,3秒连不上算失败
   
    nb_get_retry  3                           # 【重试次数】失败后重试几次
                                            # 3次都失败才认为真正故障
                                            # 防止网络抖动误判
   
    delay_before_retry  2                     # 【重试延迟】每次重试前等待的时间
                                            # 单位秒,等2秒再试下一次
                                            # 给后端一点恢复时间
}

HTTP_GET 参数详解

参数作用示例必填
path要检查的URL路径/index.html、/health
digest期望返回内容的MD532位MD5值
status_code期望的HTTP状态码200、301、302
connect_port检查的端口80、443
bindto绑定的源IP192.168.12.80
connect_timeout连接超时3秒
nb_get_retry重试次数3次
delay_before_retry重试延迟2秒

SSL_GET 健康检查方式详解

nginx复制下载

SSL_GET {                                 # 【SSL检查方式】检查HTTPS服务
                                          # 参数和HTTP_GET基本一致
                                          # 区别:会进行SSL/TLS握手
   
    url {                                  # 同HTTP_GET
        path  /index.html
        digest  e6c271eb5f017f280cf97ec2f51b02d3
        status_code   200
    }
   
    connect_port 443                        # 【检查端口】HTTPS默认443
   
    bindto  192.168.12.80                    # 同HTTP_GET
    connect_timeout  3                        # 同HTTP_GET
    nb_get_retry  3                           # 同HTTP_GET
    delay_before_retry  2                     # 同HTTP_GET
}

SSL_GET 与 HTTP_GET 的区别

特性HTTP_GETSSL_GET
协议HTTPHTTPS
默认端口80443
额外处理SSL/TLS握手
适用场景普通Web加密Web

MISC_CHECK 健康检查方式详解

MISC_CHECK {                              # 【自定义脚本检查】最灵活的方式
                                          # 可以用任何语言写检查脚本
                                          # 适合检查复杂逻辑(如数据库查询)
   
    misc_path  /usr/local/bin/script.sh    # 【脚本路径】要执行的检查脚本
                                          # 必须写绝对路径
                                          # 脚本需要有执行权限
                                          # 脚本返回0表示成功,非0表示失败
   
    misc_timeout  5                         # 【脚本超时】脚本执行的最大时间
                                          # 单位秒,超过5秒强制终止
                                          # 防止脚本卡死影响Keepalived
   
    ! misc_dynamic                          # 【动态权重】注释掉了,未启用
                                          # 【!】表示注释,和#作用相同
                                          # misc_dynamic作用:根据脚本返回值动态调整权重
                                          # 脚本可以返回1-255,作为新权重值
                                          # 去掉!才能启用
}

MISC_CHECK 参数详解

参数作用示例必填
misc_path自定义脚本路径/usr/local/bin/check.sh
misc_timeout脚本执行超时5秒
misc_dynamic动态调整权重不加参数

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注