- 后端
- 网络/通信
- 云原生
【免费下载链接】bfe
A modern layer 7 load balancer from baidu
导读
mod_tcp_keepalive是 BFE(Baidu Front End)七层负载均衡器中负责按产品(product)和 VIP 精细化控制 TCP Keep-Alive 心跳参数的模块。本文以官方文档 docs/en_us/configuration/mod_tcp_keepalive/mod_tcp_keepalive.conf.md 为核心骨架,系统讲解该模块基础配置文件mod_tcp_keepalive.conf中每个配置项的含义、类型、默认值与校验逻辑,并结合仓库源码剖析配置加载、规则数据格式、运行时生效链路与热加载机制。读完本文,你将能独立完成该模块的配置编写、规则数据组织与问题排查。
一、配置作用与文件位置
mod_tcp_keepalive.conf是mod_tcp_keepalive模块的基础配置文件,其职责只有两个:
- 指定产品规则配置文件路径(
Basic.DataPath); - 控制模块调试日志开关(
Log.OpenDebug)。
BFE 各模块配置的加载入口在模块初始化阶段统一完成。在 mod_tcp_keepalive.go 的Init()中,模块通过bfe_module.ModConfPath(cr, m.name)定位配置文件,再调用ConfLoad(confPath, cr)完成解析:
confPath := bfe_module.ModConfPath(cr, m.name) if conf, err = ConfLoad(confPath, cr); err != nil { return fmt.Errorf("%s: conf load err %s", m.name, err.Error()) } m.dataPath = conf.Basic.DataPath openDebug = conf.Log.OpenDebug模块名常量定义为ModTcpKeepAlive = "mod_tcp_keepalive",因此仓库中默认配置文件位于 conf/mod_tcp_keepalive/mod_tcp_keepalive.conf,测试样例位于 bfe_modules/mod_tcp_keepalive/testdata/mod_tcp_keepalive.conf。
二、配置项说明
官方文档定义了如下两个配置项:
| 配置项 | 类型 | 含义 | 是否必填 | 补充说明 | 生效条件 |
|---|---|---|---|---|---|
| Basic.DataPath | String | 产品规则配置文件的路径 | 是 | 留空时回退到默认值 | 类型为 FilePath |
| Log.OpenDebug | Boolean | 是否开启调试模式 | 否 | 默认值为false | - |
2.1 Basic.DataPath:规则数据文件路径
DataPath指向存放产品级 TCP Keep-Alive 规则的 JSON 数据文件(即tcp_keepalive.data)。根据 00-common.md 中 FilePath 类型的通用约定:
- 支持相对路径(相对 BFE 配置根目录解析)或绝对路径(以
/开头); - 引用的文件在运行时必须存在且可读;
- 未配置时回退到模块对应默认值。
具体默认值逻辑在 conf_load.go 的ConfModTcpKeepAliveCheck()中体现:
if cfg.Basic.DataPath == "" { log.Logger.Warn("ModTcpKeepAlive.DataPath not set, use default value") cfg.Basic.DataPath = "mod_tcp_keepalive/tcp_keepalive.data" } cfg.Basic.DataPath = bfe_util.ConfPathProc(cfg.Basic.DataPath, confRoot)即:若DataPath为空,模块会打印一条警告日志,并回退到相对配置根目录的默认路径mod_tcp_keepalive/tcp_keepalive.data,随后通过bfe_util.ConfPathProc拼接配置根目录得到最终绝对路径。仓库自带的 conf/mod_tcp_keepalive/mod_tcp_keepalive.conf 正是直接使用默认路径的形式:
[basic] DataPath = mod_tcp_keepalive/tcp_keepalive.data [log] OpenDebug = false需要注意:官方文档中的配置示例写的是../data/mod_tcp_keepalive/tcp_keepalive.data,这是相对配置目录的相对路径写法;两种写法只要解析后能定位到真实文件即可。解析过程由 gopkg.in/gcfg.v1 完成——配置采用 INI 风格格式,[Basic]与[Log]段分别对应该模块结构体 ConfModTcpKeepAlive 中Basic与Log两个匿名结构体字段。
2.2 Log.OpenDebug:调试日志开关
OpenDebug控制模块的调试日志输出,默认值为false。加载后赋值给模块包级变量openDebug(mod_tcp_keepalive.go):
var ( openDebug = false )该开关在以下场景生效:
- HandleAccept 中打印连接远端地址与 VIP;
- 产品未命中规则时打印
product not found, just pass提示; - 规则命中并设置成功后打印命中参数;
- getTcpConn 中连接类型转换失败时打印连接实际类型;
- Windows 平台下各
setsockopt占位实现(见 keepalive_windows.go)打印 "not implemented" 提示。
生产环境建议保持false,仅在排查问题时临时开启。
三、配置示例
3.1 官方文档示例
[Basic] DataPath = ../data/mod_tcp_keepalive/tcp_keepalive.data [Log] OpenDebug = false3.2 仓库测试样例(开启调试)
bfe_modules/mod_tcp_keepalive/testdata/mod_tcp_keepalive.conf 中展示了开启调试模式的写法:
[basic] DataPath = ../data/mod_tcp_keepalive/tcp_keepalive.data [log] OpenDebug = true配置解析测试覆盖于 conf_load_test.go,包括正常加载、DataPath缺失回退默认值、非法文件格式报错等场景。
四、规则数据文件:DataPath 指向的内容
理解DataPath的作用,还需要知道它所指向的tcp_keepalive.data的数据结构。仓库中的真实样例 conf/mod_tcp_keepalive/tcp_keepalive.data 内容如下:
{ "Config": { "product1": [ { "VipConf": ["180.97.93.196"], "KeepAliveParam": { "KeepIdle": 270, "KeepIntvl": 9 } } ] }, "Version": "2021-06-25 14:31:05" }更完整的多产品、多 VIP 样例见测试目录 bfe_modules/mod_tcp_keepalive/testdata/tcp_keepalive.data,其中包含Disable字段的用法:
{ "Config": { "product1": [ { "VipConf": ["10.1.1.1", "10.1.1.2"], "KeepAliveParam": { "KeepIdle": 70, "KeepIntvl": 15, "KeepCnt": 9 } }, { "VipConf": ["10.1.1.3"], "KeepAliveParam": { "Disable": true } } ], "product2": [ { "VipConf": ["10.2.1.1"], "KeepAliveParam": { "KeepIdle": 20, "KeepIntvl": 15 } } ] }, "Version": "2021-06-25 14:31:05" }KeepAliveParam四个字段的定义见 data_load.go,与 Linux 内核 TCP Keep-Alive 三参数一一对应:
| 字段 | 类型 | 含义 |
|---|---|---|
| Disable | bool | 关闭该 TCP 连接的 Keep-Alive 心跳报文发送策略 |
| KeepIdle | int | 连接空闲多久后开始发送首个心跳报文(秒) |
| KeepIntvl | int | 上一次心跳未获应答时,再次发送心跳的间隔(秒) |
| KeepCnt | int | 上一次心跳未获应答时的最大重试次数 |
数据的加载与校验流程(data_load.go):
- 打开文件并以 JSON 解码到
ProductRuleConf; ConvertConf将每个规则条目中的VipConf列表展开为"VIP → KeepAliveParam"映射,并对 VIP 做net.ParseIP归一化(IPv6 缩写形式会被统一,测试用例见 data_load_test.go);- 校验阶段检查重复 VIP、非法 IP、空产品名、以及
KeepIdle/KeepIntvl/KeepCnt非负约束(data_load.go)。
五、配置如何生效:运行时调用链
配置加载完成后,模块将HandleAccept注册为HandleAccept阶段的过滤器(mod_tcp_keepalive.go),每个新建连接到达时依次执行:
- 取会话的 VIP 与产品名;
ruleTable.Search(session.Product)在规则表 KeepAliveTable 中查找该产品对应的 VIP 规则(读写分离的sync.RWMutex保护);- 若命中当前 VIP,则将连接向下转换为
*net.TCPConn(支持通过ConnFetcher解包嵌套连接,见 mod_tcp_keepalive.go); - 调用
handleTcpKeepAlive:若Disable为真则执行SetKeepAlive(false)关闭心跳;否则通过conn.File()获取文件描述符,分别用setsockopt设置TCP_KEEPIDLE、TCP_KEEPINTVL、TCP_KEEPCNT,并恢复连接的非阻塞属性(mod_tcp_keepalive.go)。
Linux 平台的具体实现见 keepalive_linux.go:
func setIdle(fd int, secs int) error { return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, syscall.IPPROTO_TCP, syscall.TCP_KEEPIDLE, secs)) }从源码结构看,该模块提供了 Linux(真实生效)与 Windows(占位实现)两套平台适配,另有 keepalive_darwin.go 用于 macOS;实际使用时需确认目标平台内核支持对应setsockopt选项。
模块同时维护一组计数器状态(命中规则数、各参数设置成功/失败数、禁用心跳成功/失败数、连接类型转换失败数等),定义于 mod_tcp_keepalive.go,可通过监控接口查看。
六、配置热加载与监控
模块注册了两个 Web Handler(mod_tcp_keepalive.go):
- Reload:
m.reloadHandlers()注册mod_tcp_keepalive重载入口,调用loadConfData重新读取DataPath指向的数据文件并整体替换规则表(mod_tcp_keepalive.go),因此规则数据的变更无需重启 BFE;重载时也可通过查询参数path指定临时数据文件; - Monitor:注册
mod_tcp_keepalive与mod_tcp_keepalive.diff两个监控端点,分别返回累计值与增量统计。
七、配置实战建议
- 路径写法:优先使用相对配置根目录的简洁路径(如
mod_tcp_keepalive/tcp_keepalive.data),便于部署目录迁移;绝对路径适合配置文件与数据文件分离的场景。 - 默认值意识:忘记配置
DataPath时模块不会报错,而是回退默认路径并打警告日志;若默认路径下文件不存在,将在Init阶段的数据加载中报错导致模块初始化失败,因此建议显式配置并确保文件可读。 - 参数取值范围:
KeepIdle、KeepIntvl、KeepCnt必须为非负整数,负值会在数据加载校验阶段直接报错;数值含义为秒(KeepCnt为次数),可参考 Linuxtcp_keepalive_time、tcp_keepalive_intvl、tcp_keepalive_probes内核参数的语义按需设置。 - 调试排障:临时开启
OpenDebug = true可看到每个连接的产品/VIP 命中情况与参数设置结果;结合监控计数器的设置成功/失败统计可快速定位底层setsockopt失败问题。 - 关闭心跳:如需对特定 VIP 关闭 Keep-Alive 心跳(例如某些长连接协议场景),在规则中设置
"Disable": true即可,无需删除该 VIP 的规则条目。
八、相关文件速查
- 基础配置文件文档:docs/en_us/configuration/mod_tcp_keepalive/mod_tcp_keepalive.conf.md
- 通用类型说明(FilePath 等):docs/en_us/configuration/00-common.md
- 默认配置:conf/mod_tcp_keepalive/mod_tcp_keepalive.conf
- 默认规则数据:conf/mod_tcp_keepalive/tcp_keepalive.data
- 配置解析实现与校验:conf_load.go
- 规则数据加载与校验:data_load.go
- 模块主体与运行时逻辑:mod_tcp_keepalive.go
- 规则表结构:keepalive_table.go
- Linux/Windows 平台适配:keepalive_linux.go、keepalive_windows.go
- 测试用例:conf_load_test.go、data_load_test.go、keepalive_table_test.go
- 后端
- 网络/通信
- 云原生
【免费下载链接】bfe
A modern layer 7 load balancer from baidu
相关推荐
VizTracer 自定义事件指南:用 log_instant、log_var 与 log_event 精细化插桩你的 Python 程序
VizTracer 自定义事件指南:用 log_instant、log_var 与 log_event 精细化插桩你的 Python 程序 VizTracer
后端网络/通信云原生BFE mod_secure_link 基础配置详解:mod_secure_link.conf 配置项、加载原理与实战
BFE mod_secure_link 基础配置详解:mod_secure_link.conf 配置项、加载原理与实战 mod_secure_link.conf
后端网络/通信云原生Shields 自定义 Logo 退役迁移指南:内置 Logo 移除、Simple Icons 接管与 Base64 自定义方案
Shields 自定义 Logo 退役迁移指南:内置 Logo 移除、Simple Icons 接管与 Base64 自定义方案 Shields(shields
后端网络/通信云原生
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考