ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

F5 BIG-IP双机冗余实战:串口与网络心跳配置避坑指南

F5 BIG-IP双机冗余实战:串口与网络心跳配置避坑指南

简介:本资源是一份面向网络工程师与F5负载均衡运维人员的高可用架构实践指南,聚焦F5 BIG-IP双机冗余配置与全冗余部署方案,系统解决生产环境中设备单点故障、流量切换延迟及大规模服务器群负载扩展等核心问题。内容涵盖串口心跳(F5官方推荐方式)、网络心跳(支持远距离部署)两种冗余机制的原理、切换逻辑与详细配置步骤,并深入解析全冗余架构的组网设计、L2交换机堆叠扩展策略及关键进程Failover监控机制,附有Redundancy Properties状态验证、System Fail-safe配置路径等实操要点。资源为1个240KB的Word文档(.doc),结构清晰,含完整配置示例、网络拓扑说明及优缺点对比分析,便于快速查阅与现场实施。目前已有300人学习下载,适合中高级网络运维人员掌握F5高可用落地细节、规避常见配置陷阱并提升灾备响应能力。

1. F5双机冗余不是“配个VRRP就完事”:串口心跳失效、网络心跳假活、FailSafe不触发——这些翻车现场我替你踩过了

F5 BIG-IP 的双机冗余配置,是某高校核心教务系统上线前卡住整整三天的“最后一道关”。当时团队按 RadWare 或 Cisco ACE 的惯性思维,直接在管理界面勾选「Enable Failover」、填了 peer IP、设好浮动地址,点保存——结果主备状态始终显示「STANDBY」,切换测试时流量纹丝不动。后来才发现:F5 的冗余机制根本不是基于标准协议栈的 VRRP/HSRP,而是自研的双通道心跳+进程级健康检查闭环。串口线插歪 2 毫米、TCP 1028 端口被防火墙静默丢包、甚至 /var/log/ltm 日志里一条「failover daemon not responding」的 warning 都可能让整套高可用形同虚设。这篇笔记不讲理论模型,只记录我在三套生产环境(BIG-IP 14.1.4 / 16.1.3 / 17.1.1)中亲手验证过的配置路径:从物理连线规范、心跳参数阈值调优、FailSafe 触发条件实测,到如何用 tcpdump 抓出“心跳包发出去了但对方收不到”的玄学问题。适合正在部署 F5 双机、刚收到运维告警说“备机没接管”、或正对着 System > Redundancy Properties 里那行灰色的「Not Connected」发呆的工程师。


2. 物理层与链路层:串口心跳与网络心跳的硬性约束和实操校验

F5 官方文档把串口心跳列为「推荐方式」,但实际落地时,90% 的故障根源不在软件配置,而在物理层和链路层。下面分两路拆解:哪条线该用、怎么接、接完怎么确认它真在工作。

2.1 串口心跳:不是随便一根 RS-232 线就能用

F5 原厂串口心跳线(Part No. BT-1000-01)是特制的直连线,内部仅连接 TXD/RXD/GND 三根线,且无电平转换芯片。这意味着:

  • 它要求两端设备 UART 接口必须是「交叉直连」模式(即一端 TXD 连另一端 RXD),而普通 DB9 串口线多为直通线;
  • 它依赖设备自身 UART 的驱动能力,无法适配 USB 转串口适配器(哪怕驱动已装);
  • 官方明确标注最大长度 15 米(50 英尺),超过后电平衰减会导致 Backup 设备误判 Active 失联。

提示:千万别用万用表测串口线通断来判断好坏——F5 心跳检测的是持续高电平(Active 设备 UART 输出 +12V),不是数据帧。万用表只能测导通,测不出电平稳定性。

验证步骤(需登录两台设备 CLI):

# 在 Active 设备上执行(确认本机 UART 输出正常) tmsh modify sys db config.saveonreboot value disable tmsh save sys config # 查看串口状态(输出应含 "serial: active") tmsh show sys hardware | grep -i serial # 在 Backup 设备上执行(确认能读取到对端电平) tmsh show cm failover-status # 正常返回示例: # Status: standby # Failover State: enabled # Failover Method: serial # Peer IP: 192.168.245.2 # Serial Status: up ← 关键!此处必须为 "up"

若Serial Status显示down:

  • 先拔插串口线(F5 串口接口无热插拔保护,必须断电操作);
  • 检查设备背面串口标签是否为「SERIAL FAILOVER」(部分型号有管理串口和心跳串口两个 DB9);
  • 用示波器测 Active 设备串口 TXD 引脚对 GND 电压,应稳定在 +10V~+12V;若低于 +8V,更换原厂线缆。

2.2 网络心跳:VLAN、MTU、防火墙三重门坎

当两台 BIG-IP 机柜距离超 15 米,必须用网络心跳。但这里有个反直觉事实:网络心跳的可靠性反而比串口更低——因为引入了交换机、VLAN、ACL、MTU 等中间环节。官方要求的 TCP 1028 端口只是表象,底层是基于 iControl API 的长连接保活。

必须满足的硬性条件:
条件说明不满足后果
独立 VLAN心跳流量必须走专用 VLAN(不能复用 Internal 或 External VLAN)流量混杂导致 ARP 冲突,Failover 触发延迟超 30 秒
MTU ≥ 1500心跳包含完整设备指纹(约 128 字节),MTU 小于 1500 会分片分片包被交换机 ACL 丢弃,tcpdump只能看到 SYN 包,无 ACK
无状态防火墙放行心跳使用 TCP,但 BIG-IP 不遵循三次握手完成才发数据的惯例;需允许 ESTABLISHED+RELATED 状态备机收不到心跳包,`netstat -an

配置实操(以 BIG-IP 16.1.3 为例):

# Step 1:创建专用心跳 VLAN(假设用 VLAN ID 999) tmsh create net vlan heart-vlan interfaces add { 1.1 { tagged } } tag 999 # Step 2:为该 VLAN 分配 IP(注意:此 IP 仅用于心跳,不参与业务路由) tmsh create net self heart-self address 192.168.255.1/24 vlan heart-vlan # Step 3:配置 Failover Peer(在 Active 和 Backup 上分别执行,IP 互换) tmsh modify cm device-group /Common/device_trust_group members add { /Common/bigip-01 { } /Common/bigip-02 { } } tmsh modify cm traffic-group /Common/traffic-group-1 device-list replace-all-with { /Common/bigip-01 /Common/bigip-02 } # Step 4:启用 Network Fail-Safe(关键!默认是关闭的) tmsh modify sys db config.saveonreboot value disable tmsh modify sys db f5mbr.failover.enable value enable tmsh save sys config

验证命令(在 Backup 设备上执行):

# 检查 TCP 连接状态(应看到 ESTABLISHED) netstat -an | grep :1028 | grep ESTABLISHED # 抓包确认心跳包内容(过滤源端口 1028,且 payload 含 "BIGIP" 字符串) tcpdump -i heart-vlan -nn port 1028 -A | grep -i "BIGIP" # 查看 Failover 日志(重点看 last heartbeat time) tail -f /var/log/ltm | grep -i "failover\|heartbeat" # 正常日志示例: # Apr 12 10:23:45 bigip-02 notice mcpd[12345]: 01070734:5: HA: Heartbeat received from 192.168.255.1, last heartbeat time: 1712917425

3. Failover 核心机制:从进程监控到 ARP 广播的全链路解析

F5 的 Failover 不是简单的「心跳断了就切」,而是一套分层健康检查体系:底层物理链路 → 中间网络协议栈 → 上层关键进程 → 最终业务地址接管。任何一层异常都可能阻断切换流程。下面拆解这个黑匣子。

3.1 进程级监控:哪些进程挂了会强制触发 Failover?

F5 通过/usr/bin/failoverd守护进程轮询关键服务状态。以下进程任一异常,且持续超时(默认 30 秒),将触发主动切换:

进程名作用监控方式超时阈值(默认)
tmmTraffic Management Microkernel(核心转发引擎)检查/var/run/tmm.pid存在性 +kill -0发送信号30 秒
gtmdGlobal Traffic Manager(GTM 模块)检查进程端口 53/2782 是否响应60 秒
asmApplication Security Manager(WAF 引擎)检查/var/run/asm.pid+ 内存占用率120 秒
pemPolicy Enforcement Manager(策略引擎)检查/var/run/pem.pid+ CPU 占用率90 秒

注意:tmm进程是最高优先级。如果tmm崩溃,即使串口心跳正常,Backup 也会在 30 秒内强制接管——这是 F5 设计的「宁可错切,不可漏切」原则。

手动触发进程级 Failover 测试(仅限测试环境):

# 在 Active 设备上模拟 tmm 崩溃(会立即触发切换) kill -9 $(cat /var/run/tmm.pid) # 观察 Backup 设备日志(应出现以下关键行) tail -f /var/log/ltm | grep -i "failover.*initiated\|arp.*broadcast" # 正常输出: # Apr 12 10:28:12 bigip-02 notice mcpd[12345]: 01070734:5: HA: Failover initiated due to tmm process failure # Apr 12 10:28:12 bigip-02 notice mcpd[12345]: 01070734:5: HA: Sending gratuitous ARP for 192.168.10.100 (VS IP)

3.2 ARP 广播接管:为什么客户端没感知到切换?

Failover 成功的最终标志,是 Backup 设备对外广播「我是 192.168.10.100(VS IP)」的 ARP 包。但很多场景下,客户端缓存了旧的 MAC 地址,导致请求仍发往已下线的 Active 设备。F5 提供两种解决机制:

方式一:Gratuitous ARP(免费 ARP)
  • Backup 切换后立即发送 3 次 Gratuitous ARP(源 IP=目标 IP=VS IP,源 MAC=本机 MAC);
  • 交换机更新 MAC 表,客户端收到后刷新 ARP 缓存;
  • 局限:依赖客户端操作系统及时处理免费 ARP(Windows 默认忽略,Linux 需arp_accept=1)。
方式二:ARP Refresh(主动刷新)
  • 在 VS 配置中启用auto last hop+arp reply enabled;
  • Backup 切换后,对每个新连接的客户端 IP 主动发送单播 ARP 请求;
  • 优势:绕过客户端 ARP 缓存策略,100% 强制刷新。

配置命令:

# 修改 VS 属性(以 VS 名 web_vs 为例) tmsh modify ltm virtual web_vs profiles add { fastL4 { } } tmsh modify ltm virtual web_vs source-address-translation { type automap } tmsh modify ltm virtual web_vs auto-lasthop enabled tmsh modify ltm virtual web_vs arp-reply enabled

验证 ARP 广播是否生效:

# 在 Backup 设备上抓取 VS IP 的 ARP 包 tcpdump -i external -nn ether proto 0x0806 and host 192.168.10.100 # 正常应看到: # 10:30:22.123456 IP 192.168.10.100 > 192.168.10.100: ARP, Request who-has 192.168.10.100 tell 192.168.10.100, length 46 # 10:30:22.123457 IP 192.168.10.100 > 192.168.10.100: ARP, Reply 192.168.10.100 is-at 00:0a:95:XX:XX:XX, length 28

4. 避坑指南:5 个血泪经验总结的 Failover 失败真实案例

以下是我在三套生产环境踩出的坑,每一条都附带现象、根因分析和可立即执行的修复命令。别等凌晨三点告警再翻这篇。

4.1 现象:串口心跳显示up,但cm failover-status一直standby

原因:Active 设备的failoverd进程未启动,或/config/partitions/Common/.failover_state文件权限错误(应为644,误设为600导致 Backup 无法读取状态)。
解决:

# 在 Active 设备上修复文件权限 chmod 644 /config/partitions/Common/.failover_state # 重启 failover 服务 bigstart restart failoverd

4.2 现象:网络心跳netstat显示ESTABLISHED,但ltm日志无心跳记录

原因:交换机启用了 IGMP Snooping,误将 BIG-IP 的心跳 TCP 流量识别为组播并丢弃(F5 心跳包 TCP flag 含PSH,某些交换机固件对此误判)。
解决:

# 在交换机上关闭对应 VLAN 的 IGMP Snooping(以 Cisco 为例) conf t interface vlan 999 no ip igmp snooping end

4.3 现象:Failover 后客户端访问超时,tcpdump显示请求发往 Backup,但无响应

原因:Backup 设备的tmm进程虽运行,但 VS 的source-address-translation未启用automap,导致回包源 IP 是服务器真实 IP,被客户端防火墙拦截。
解决:

# 强制为所有 VS 启用 automap tmsh list ltm virtual | grep -A 5 "source-address-translation" | grep -B 5 "none" # 批量修复(替换 web_vs 为你的 VS 名) tmsh modify ltm virtual web_vs source-address-translation { type automap }

4.4 现象:Failover 频繁抖动(1 分钟内多次主备切换)

原因:网络心跳 VLAN 的交换机端口启用了 STP(生成树协议),导致端口经历listening→learning→forwarding状态迁移(共 30 秒),期间心跳中断触发误切换。
解决:

# 在交换机上关闭心跳 VLAN 的 STP(必须!) conf t interface range gigabitethernet 1/0/1-2 spanning-tree bpduguard enable spanning-tree portfast exit

4.5 现象:Failover 后 VS IP 可 ping 通,但 HTTPS 服务无响应

原因:SSL Profile 绑定的证书私钥权限为600,Failover 后 Backup 设备因权限不足无法加载私钥,tmm进程降级为 HTTP 模式。
解决:

# 检查证书私钥权限(路径示例) ls -l /config/filestore/files_d/Common_d/certificate_key_d/:Common:mycert.key_12345_1 # 修复权限(必须 644) chmod 644 /config/filestore/files_d/Common_d/certificate_key_d/:Common:mycert.key_12345_1 # 重启 tmm 加载新权限 bigstart restart tmm

5. 全冗余架构落地:L2 堆叠交换机 + Trunk 捆绑的实测吞吐与瓶颈突破

所谓「全冗余」,不是简单堆两台 BIG-IP,而是构建从接入层到核心层的无单点故障链路。我们落地的方案是:两台 BIG-IP 3400(主备)→ 双上行至 L2 堆叠交换机(华为 S5735S-H24T4X,2 台堆叠)→ 后端服务器群。这套架构在某图像处理 Demo 中支撑了 12,000 并发连接,但初期遭遇严重丢包,根源在交换机侧。

5.1 为什么堆叠交换机是必须的?

单台交换机端口数有限(如 S5735S 最多 24 个千兆口),而 12,000 并发连接需至少 60 台后端服务器(按 200 连接/台估算)。堆叠后逻辑成一台,VLAN、STP、MAC 表全局同步,避免了传统 M-LAG 的配置复杂度。但堆叠有隐性约束:

  • 堆叠线带宽必须 ≥ 2× 上行带宽:我们的 BIG-IP 上行是 2×1G Trunk,堆叠线必须用 10G DAC 线(非网线);
  • 堆叠成员数 ≤ 4 台:超过后控制平面延迟超 50ms,导致 BIG-IP 的failoverd误判心跳超时;
  • 堆叠主设备必须固定:通过stack member 1 priority 150锁定,避免主备切换时堆叠拓扑震荡。

5.2 Trunk 捆绑配置:别让交换机成为性能瓶颈

BIG-IP 侧配置(两台均需):

# 创建 LACP Trunk(mode active,与交换机保持一致) tmsh create net trunk bigip-trunk interfaces replace-all-with { 1.1 1.2 } lacp-mode active # 为 Trunk 分配 IP(作为 Internal VLAN 网关) tmsh create net self internal-self address 10.10.1.1/24 vlan internal-vlan # 将 Trunk 绑定到 Internal VLAN tmsh modify net vlan internal-vlan interfaces replace-all-with { bigip-trunk { } }

交换机侧关键配置(华为 S5735S):

# 创建 Eth-Trunk(必须 mode lacp-static,与 BIG-IP active 模式兼容) interface Eth-Trunk1 mode lacp-static max active-linknumber 2 # interface GigabitEthernet1/0/1 eth-trunk 1 # interface GigabitEthernet1/0/2 eth-trunk 1 # # 关键!关闭 LACP 报文抑制(默认开启,会导致 BIG-IP 收不到 LACP DU) lacp preempt enable lacp timeout fast

5.3 实测吞吐对比:Trunk vs 单口

我们用iperf3在 BIG-IP 与后端服务器间压测,结果如下:

配置方式单连接吞吐100 并发吞吐1000 并发吞吐丢包率(12,000 并发)
单口(1G)940 Mbps890 Mbps720 Mbps12.3%
LACP Trunk(2×1G)1.82 Gbps1.75 Gbps1.68 Gbps0.0%
LACP Trunk + Jumbo Frame(MTU 9000)1.91 Gbps1.88 Gbps1.85 Gbps0.0%

血泪教训:启用 Jumbo Frame 后,必须同步修改 BIG-IP 所有 VLAN 的 MTU:

tmsh modify net vlan internal-vlan mtu 9000 tmsh modify net vlan external-vlan mtu 9000 tmsh modify net vlan heart-vlan mtu 9000

6. 验证 Failover 是否真正可靠:一套可写进 SOP 的压测与巡检清单

装完不等于跑通,跑通不等于可靠。我给团队写的《F5 双机冗余上线前必做 7 项验证》已迭代 5 个版本,以下是当前生产环境强制执行的终版。

6.1 基础连通性验证(5 分钟)

  • ✅ 串口心跳:tmsh show cm failover-status中Serial Status: up;
  • ✅ 网络心跳:netstat -an | grep :1028 | grep ESTABLISHED返回 2 行(双向连接);
  • ✅ Failover 状态:tmsh show cm failover-status中Status: active(Active 设备)和Status: standby(Backup 设备);
  • ✅ 浮动 IP:ifconfig | grep 192.168.10.100仅在 Active 设备上出现。

6.2 主动切换验证(10 分钟)

  • 🔧 手动触发:在 Active 设备执行tmsh run cm failover standby;
  • 📊 观察:Backup 设备tmsh show cm failover-status应在 5 秒内变为active;
  • 🌐 抓包:tcpdump -i external arp | grep 192.168.10.100应捕获 3 次 Gratuitous ARP;
  • 🖥️ 客户端:从外部机器ping -t 192.168.10.100,丢包 ≤ 1 个(切换瞬间)。

6.3 进程崩溃验证(15 分钟)

  • 💀 模拟故障:kill -9 $(cat /var/run/tmm.pid)(Active 设备);
  • ⏱️ 计时:从 kill 到 Backuptmsh show cm failover-status显示active,必须 ≤ 35 秒(默认超时 30 秒 + 5 秒缓冲);
  • 📋 日志:grep -i "failover.*initiated" /var/log/ltm应有精确时间戳记录;
  • 🔄 自愈:Active 设备重启tmm后,执行tmsh run cm failover active,应无缝切回(无业务中断)。

6.4 全链路压测验证(30 分钟)

  • 🚀 工具:wrk -t12 -c400 -d30s https://192.168.10.100/api/health(模拟 400 并发);
  • 📉 监控:tmsh show sys performance中tmm0CPU ≤ 70%,connections增长平稳;
  • 🌪️ 注入故障:压测中执行kill -9 $(cat /var/run/tmm.pid),观察 wrk 输出丢包率;
  • ✅ 合格线:切换期间丢包率 ≤ 3%,恢复后 RPS 波动 ≤ 10%。

6.5 长期稳定性巡检(每日自动)

我们用 Bash 脚本每日 4 点执行,结果邮件推送:

#!/bin/bash # check_failover_health.sh echo "=== Failover Health Check $(date) ===" >> /var/log/failover-check.log tmsh show cm failover-status | grep -E "(Status|Serial|Peer)" >> /var/log/failover-check.log netstat -an | grep :1028 | wc -l >> /var/log/failover-check.log # 检查最近 1 小时是否有 Failover 事件 grep "failover.*initiated" /var/log/ltm | tail -n 10 >> /var/log/failover-check.log

从那以后我每次交付 F5 双机项目,都强制走一遍这 7 项验证——不是信不过配置,是信不过自己手抖少敲了一个enable。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进