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
- 作用:指定使用哪种算法来分配请求到后端服务器
- 常用算法:
| 算法 | 全称 | 说明 | 适用场景 |
|---|
| rr | Round Robin | 轮询,请求平均分配 | 后端服务器配置相同 |
| wrr | Weighted Round Robin | 加权轮询 | 后端服务器性能不同 |
| lc | Least Connection | 最少连接 | 请求处理时间差异大 |
| wlc | Weighted Least Connection | 加权最少连接 | 最常用,推荐 |
- wlc特点:兼顾服务器权重和当前连接数,是最智能的算法
4. lb_kind —— 负载均衡模式
lb_kind DR
| 模式 | 全称 | 说明 | 特点 |
|---|
| DR | Direct Routing | 直接路由 | 最常用,性能最好,要求调度器和后端在同一物理网络 |
| NAT | Network Address Translation | 网络地址转换 | 调度器修改目的IP,进出都经过调度器,易成瓶颈 |
| TUN | Tunneling | 隧道模式 | 可跨网段,但配置复杂 |
- 用户请求到调度器(VIP)
- 调度器只修改MAC地址,直接转发给后端
- 后端直接返回给用户(不经过调度器)
- 性能最高,因为响应流量不经过调度器
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 | 是 |
| weight | real_server | 服务器权重 | 1-100 | 否 |
| inhibit_on_failure | real_server | 故障时权重置0 | 不加参数 | 否 |
| notify_up | real_server | 上线通知脚本 | 脚本路径 | 否 |
| notify_down | real_server | 下线通知脚本 | 脚本路径 | 否 |
| TCP_CHECK | real_server | TCP检查方式 | 块结构 | 否 |
| connect_timeout | TCP_CHECK | 连接超时 | 2-5秒 | 是 |
| connect_port | TCP_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 | 期望返回内容的MD5 | 32位MD5值 | 否 |
| status_code | 期望的HTTP状态码 | 200、301、302 | 是 |
| connect_port | 检查的端口 | 80、443 | 是 |
| bindto | 绑定的源IP | 192.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_GET | SSL_GET |
|---|
| 协议 | HTTP | HTTPS |
| 默认端口 | 80 | 443 |
| 额外处理 | 无 | 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 | 动态调整权重 | 不加参数 | 否 |
发表回复