当前位置: 首页 > ops >正文

Keepalived 监听服务切换与运维指南

文章目录

  • Keepalived 监听服务切换与运维指南
    • 一、监听服务切换方式
      • 1.1 HTTP_GET/SSL_GET
        • 状态码检测配置
        • 内容摘要检测配置
      • 1.2 TCP_CHECK
      • 1.3 MISC_CHECK
        • 脚本示例(HTTP服务检查)
        • 配置引用
      • 1.4 检查方式对比
    • 二、监听脚本示例
      • 2.1 HTTP/HTTPS服务检查
      • 2.2 TCP端口检查
      • 2.3 UDP端口检查
      • 2.4 进程状态检查
      • 2.5 状态切换通知脚本
    • 三、常用运维命令
      • 3.1 服务管理
      • 3.2 配置检查
      • 3.3 状态查看
      • 3.4 故障排查
    • 四、注意事项

Keepalived 监听服务切换与运维指南

一、监听服务切换方式

Keepalived 提供多种健康检查机制实现服务状态监测与自动切换,以下是常用方式及配置示例:

1.1 HTTP_GET/SSL_GET

基于 HTTP/HTTPS 协议的应用层检查,支持状态码验证和内容摘要校验。

状态码检测配置
real_server 192.168.1.100 80 {weight 1HTTP_GET {url {path /health.htmlstatus_code 200  # 期望返回状态码}connect_timeout 3    # 连接超时时间nb_get_retry 3       # 重试次数delay_before_retry 2 # 重试间隔}
}
内容摘要检测配置

使用 genhash 工具生成页面摘要:

genhash -s 192.168.1.100 -p 80 -u /index.html
# 输出示例:MD5SUM = b7bd8391367e4cf9e4e85263ce313ae8

配置文件引用:

real_server 192.168.1.100 80 {weight 1HTTP_GET {url {path /index.htmldigest b7bd8391367e4cf9e4e85263ce313ae8  # 生成的摘要值}connect_timeout 3nb_get_retry 3delay_before_retry 2}
}

1.2 TCP_CHECK

基于 TCP 协议的端口存活检查,适用于非 HTTP 服务(如数据库、SSH)。

real_server 192.168.1.101 3306 {weight 2inhibit_on_failure  # 故障时权重设为0TCP_CHECK {connect_port 3306      # 检查端口connect_timeout 5      # 超时时间nb_get_retry 3         # 重试次数delay_before_retry 3   # 重试间隔}
}

1.3 MISC_CHECK

自定义脚本检查,支持复杂业务逻辑判断(如多端口联动、日志关键字检测)。

脚本示例(HTTP服务检查)
#!/bin/bash
# /etc/keepalived/check_http.sh
CHECK_URL=$1
if curl -I -s "$CHECK_URL" | grep -q "200 OK"; thenexit 0  # 成功
elseexit 1  # 失败
fi
配置引用
real_server 192.168.1.102 80 {weight 1MISC_CHECK {misc_path "/etc/keepalived/check_http.sh http://192.168.1.102/index.html"misc_timeout 5  # 脚本超时时间# misc_dynamic  # 动态调整权重(可选)}
}

1.4 检查方式对比

方式优点缺点适用场景
HTTP_GET支持应用层健康度检测配置复杂Web服务
TCP_CHECK轻量、通用无法检测应用内部状态数据库、SSH等TCP服务
MISC_CHECK支持任意复杂逻辑需要维护脚本自定义业务逻辑

二、监听脚本示例

2.1 HTTP/HTTPS服务检查

#!/bin/bash
# 检查URL返回状态码
check_http() {local url=$1if curl -s -o /dev/null -w "%{http_code}" "$url" | grep -q "200"; thenexit 0elseexit 1fi
}
check_http "http://192.168.1.100/health"

2.2 TCP端口检查

#!/bin/bash
# 检查TCP端口连通性
check_tcp() {local host=$1local port=$2if nc -z -w 2 "$host" "$port"; thenexit 0elseexit 1fi
}
check_tcp "192.168.1.101" 3306

2.3 UDP端口检查

#!/bin/bash
# 检查UDP端口(需安装nc)
check_udp() {local host=$1local port=$2if nc -u -z -w 1 "$host" "$port" 2>/dev/null | grep -q "open"; thenexit 0elseexit 1fi
}
check_udp "192.168.1.102" 53

2.4 进程状态检查

#!/bin/bash
# 检查进程是否存活
check_process() {local proc_name=$1if pgrep -x "$proc_name" >/dev/null; thenexit 0elseexit 1fi
}
check_process "nginx"

2.5 状态切换通知脚本

#!/bin/bash
# /etc/keepalived/notify.sh
contact="admin@example.com"
notify() {local subject="$(hostname) 切换为 $1 状态"local body="$(date +'%F %T'): VIP 漂移,$(hostname) 成为 $1 节点"echo "$body" | mail -s "$subject" "$contact"
}case $1 inmaster) notify master ;;backup) notify backup ;;fault) notify fault ;;*) echo "Usage: $0 {master|backup|fault}" ;;
esac

配置引用

vrrp_instance VI_1 {# ... 其他配置 ...notify_master "/etc/keepalived/notify.sh master"notify_backup "/etc/keepalived/notify.sh backup"notify_fault "/etc/keepalived/notify.sh fault"
}

三、常用运维命令

3.1 服务管理

# 启动
systemctl start keepalived
# 停止
systemctl stop keepalived
# 重启
systemctl restart keepalived
# 开机自启
systemctl enable keepalived

3.2 配置检查

# 验证配置文件语法
keepalived -t -f /etc/keepalived/keepalived.conf
# 指定配置文件启动
keepalived -f /etc/keepalived/custom.conf

3.3 状态查看

# 查看服务状态
systemctl status keepalived
# 查看VRRP实例状态
ip addr show | grep "inet.*secondary"  # 查看VIP绑定
# 查看LVS规则
ipvsadm -Ln
# 查看日志
journalctl -u keepalived -f

3.4 故障排查

# 抓包分析VRRP报文
tcpdump -i eth0 vrrp -nn -vv
# 查看健康检查日志
grep "healthcheck" /var/log/keepalived.log
# 手动触发故障转移
systemctl stop keepalived  # 在主节点执行

四、注意事项

  1. 脚本权限:自定义脚本需设置执行权限 chmod +x /path/to/script.sh
  2. 防火墙配置:允许VRRP协议(多播地址224.0.0.18,协议号112)
  3. 非抢占模式:配置 nopreempt 避免主节点恢复后抢占VIP
  4. 日志配置:在 /etc/sysconfig/keepalived 中设置 KEEPALIVED_OPTIONS="-D -S 6" 输出详细日志
  5. SELinux:临时关闭 setenforce 0,或配置策略允许脚本执行
http://www.xdnf.cn/news/15746.html

相关文章:

  • 基于LSTM的时间序列到时间序列的回归模拟
  • AspectJ 表达式中常见符号说明
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现动物分类(C#源码,UI界面版)
  • 张 关于大语言模型(LLM)置信度研究的经典与前沿论文 :温度缩放;语义熵;自一致性;事实与反思;检索增强;黑盒引导;
  • 微服务学习(六)之分布式事务
  • 商业秘密的法律属性与保护路径探析
  • LeetCode 322. 零钱兑换 LeetCode 279.完全平方数 LeetCode 139.单词拆分 多重背包基础 56. 携带矿石资源
  • 【Docker基础】深入解析Docker-compose核心配置:Services服务配置详解
  • 【学习记录】智能客服小桃(进度更新ing)
  • Elastic Search 8.x 分片和常见性能优化
  • UniApp 自定义导航栏:解决安全区域适配问题的完整实践
  • 当OT遇见IT:Apache IoTDB如何用“时序空间一体化“破解工业物联网数据孤岛困局
  • 【黄山派-SF32LB52】—硬件原理图学习笔记
  • NLP中情感分析与观念分析、价值判断、意图识别的区别与联系,以及四者在实际应用中的协同
  • 疯狂星期四文案网第12天运营日报
  • 最少标记点问题:贪心算法解析
  • RabbitMQ面试精讲 Day 3:Exchange类型与路由策略详解
  • Astro:前端性能革命!从原生 HTML 到 Astro + React 的升级指南
  • Java机考题:815. 公交路线 图论BFS
  • 消息队列与信号量:System V 进程间通信的基础
  • P1816 忠诚 题解
  • Flutter基础(前端教程①④-data.map和assignAll和fromJson和toList)
  • 使用C#对象将WinRiver项目文件进行复杂的XML序列化和反序列化实例详解
  • 多模态交互视角下生成式人工智能在中小学探究式学习中的认知支架效能研究
  • 立创EDA中双层PCB叠层分析
  • 锂电池生产过程图解
  • 【OD机试】停车场收费
  • 暑假训练七
  • 【52】MFC入门到精通——(CComboBox)下拉框选项顺序与初始化不一致,默认显示项也不一致
  • Three.js与AIGC的化学反应:AI生成3D模型在实时渲染中的优化方案