ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

BFE 核心术语详解:Product、Cluster、Sub Cluster 与 Instance 的分层模型

BFE 核心术语详解:Product、Cluster、Sub Cluster 与 Instance 的分层模型 后端网络/通信云原生【免费下载链接】bfeA modern layer 7 load balancer from baidu项目地址https://gitcode.com/gh_mirrors/bf/bfe点击查看免费下载BFEBaidu Front End是一个基于 Go 实现的七层负载均衡器。本文以官方术语文档为核心系统讲解 BFE 中四个最基础也最关键的概念——Product产品/租户、Cluster集群、Sub Cluster子集群与 Instance实例——它们共同构成了 BFE 配置模型与流量调度体系的分层骨架。读完本文你将掌握这四层概念各自的含义、彼此之间的归属关系以及它们在 BFE 源码与配置文件中对应的具体实现从而能够正确理解并编写 BFE 的路由与集群配置。Product配置的边界与租户在 BFE 的术语体系中Product 与 tenant租户等价。每个 Product 拥有自己独立的一套配置例如转发策略forwarding policies、权限permission等。从实现角度看Product 是路由表HostTable中的一级组织单位。在 bfe_route/server_data_conf.go 中ServerDataConf结构体同时持有HostTable与ClusterTable而 HostTable 内部正是按 Product 维度组织 host 规则、路由规则与 VIP 规则的映射关系。加载配置时LoadServerDataConf 会依次加载 host 规则、VIP 规则、路由规则和 cluster 配置并在check()阶段校验规则间的一致性——例如 product in route should exist in host即路由规则中出现的 Product 必须已存在于 host 规则中否则直接报错拒绝加载。这种配置按租户隔离的设计使得多个业务方可以共用同一套 BFE 实例各自管理自己的转发策略与权限互不干扰。Cluster提供相同功能的后端服务器集合Cluster 指一组提供相同功能的后端服务器backend server集合。一个 Product 下可以定义多个 Cluster每个 Cluster 通过名称cluster name在路由规则中被引用。Cluster 的配置模型在 BFE 中Cluster 的完整配置由两部分组成集群定义cluster_conf描述该 Cluster 的转发行为如后端连接超时、健康检查方式、GSLB 调度参数、客户端读写超时等集群成员表cluster_table描述该 Cluster 包含哪些子集群及其实例列表。在源码层面bfe_route/bfe_cluster/bfe_cluster.go 中的BfeCluster结构体聚合了BackendBasic后端基础配置、BackendCheck健康检查配置、GslbBasicConfGSLB 基础配置、BackendHTTPSHTTPS 回源配置以及客户端超时、缓冲区、刷新间隔等运行参数。BasicInit方法将这些配置项逐一转化为 BfeCluster 的运行时字段。一个完整的 Cluster 配置示例以仓库中的 conf/server_data_conf/cluster_conf.data 为例一个 HTTP 回源集群的典型配置如下{ Version: init version, Config: { cluster_example: { BackendConf: { TimeoutConnSrv: 2000, TimeoutResponseHeader: 50000, MaxIdleConnsPerHost: 0, RetryLevel: 0 }, CheckConf: { Schem: http, Uri: /healthcheck, Host: example.org, StatusCode: 200, FailNum: 10, CheckInterval: 1000 }, GslbBasic: { CrossRetry: 0, RetryMax: 2, HashConf: { HashStrategy: 0, HashHeader: Cookie:UID, SessionSticky: false } }, ClusterBasic: { TimeoutReadClient: 30000, TimeoutWriteClient: 60000, TimeoutReadClientAgain: 30000, ReqWriteBufferSize: 512, ReqFlushInterval: 0, ResFlushInterval: -1, CancelOnClientClose: false } } } }其中核心字段的作用如下配置块字段含义BackendConfTimeoutConnSrv与后端建立连接的超时时间毫秒BackendConfTimeoutResponseHeader等待后端响应头超时毫秒BackendConfRetryLevel重试级别0 表示仅重试连接失败见 bfe_cluster.go 中的默认值RetryConnectCheckConfSchem/Uri/Host健康检查的协议、探测路径与 Host 头CheckConfStatusCode/FailNum/CheckInterval期望状态码、连续失败多少次判定下线、检查间隔毫秒GslbBasicCrossRetry/RetryMax跨子集群重试次数 / 子集群内最大重试次数GslbBasicHashConf会话保持哈希策略如按Cookie:UID哈希ClusterBasicTimeoutReadClient/TimeoutWriteClient读取/写回客户端请求的超时毫秒同一份文件还给出了https_cluster_example回源走 HTTPS含HTTPSConf中的证书与 CA 列表、h2c_cluster_exampleHTTP/2 明文回源、fcgi_cluster_exampleFastCGI 回源可携带FCGIConf.EnvVars以及ai_cluster_example带AIConf的 AI 网关集群等示例展示了 Cluster 在协议维度上的扩展能力。Sub Cluster按 IDC 划分的子集群一个 Cluster 在概念上可以由多个 Sub Cluster 组成。通常同一 IDC数据中心内的后端服务器会被定义为一个 Sub Cluster。也就是说Cluster 是逻辑功能组Sub Cluster 是物理位置组——这一层抽象正是 BFE 实现跨 IDC 流量调度GSLB的基础。源码中的 SubCluster 结构bfe_balance/bal_gslb/sub_cluster.go 中的SubCluster结构体包含Name子集群名称sType子集群类型TypeGslbNormal普通子集群或TypeGslbBlackhole黑洞子集群backends一个bal_slb.BalanceRR负载均衡器负责在子集群内部做加权轮询WRRweight子集群间的权重。值得注意的实现细节newSubCluster根据名称是否为GSLB_BLACKHOLE来自动判定子集群类型sub_cluster.go。黑洞子集群不承载真实流量在 gslb.data 中权重通常设为 0用于在特殊情况下吸走流量以快速摘除后端。两级负载均衡子集群间 子集群内从 bfe_balance/bal_gslb/bal_gslb.go 的BalanceGslb结构体可以看到完整的调度状态subClusters维护子集群列表totalWeight为所有权重大于 0 的子集群权重之和retryMax/crossRetry控制重试次数hashConf保存会话保持配置。调度时 BFE 首先在子集群之间按权重选择目标子集群再调用该子集群内部的BalanceRR选择具体后端当子集群内重试失败后还可以跨子集群重试crossRetry这也就是GslbBasic中RetryMax与CrossRetry两个参数的运行语义。gslb.data子集群权重的真实样例仓库中的 conf/cluster_conf/gslb.data 展示了子集群权重的配置方式{ Clusters: { cluster_example: { GSLB_BLACKHOLE: 0, example.bfe.bj: 100 } }, Hostname: , Ts: 0 }这里example.bfe.bj权重为 100GSLB_BLACKHOLE权重为 0。若一个集群横跨北京、上海两个 IDC即可分别定义example.bfe.bj与example.bfe.sh两个子集群并赋予不同权重实现按比例的跨机房流量分配。Instance子集群内的后端服务器实例Instance 即后端服务器实例一个 Sub Cluster 包含多个 Instance每个 Instance 由 IP 地址和端口唯一标识。cluster_table.data实例列表的真实样例仓库中的 conf/cluster_conf/cluster_table.data 展示了实例的三级 JSON 嵌套结构其层级恰好与 Cluster → Sub Cluster → Instance 一一对应{ Config: { cluster_example: { example.bfe.bj: [ { Addr: 127.0.0.1, Name: example_hostname, Port: 8181, Weight: 10 } ] } }, Version: init version }最内层数组的每个元素即一个 Instance包含四个字段AddrIP 地址、Name实例名、Port端口与Weight负载均衡权重。配置加载与校验bfe_config/bfe_cluster_conf/cluster_table_conf/cluster_table_load.go 定义了与 JSON 对应的BackendConf结构体其AddrInfo()方法将实例标识拼接为ip:port形式。BackendConfCheck强制要求Name、Addr、Port、Weight四个字段全部存在而SubClusterBackend.Check()还会额外要求至少存在一个Weight 0的可用后端否则报 no avail backend 错误从加载期就杜绝了子集群内全是零权重实例的配置事故。另外加载完成后 BFE 会对实例列表执行Sort()按 Addr 与 Port 排序或Shuffle()随机打乱从实现上保证同一份成员表在不同 BFE 实例上能够以稳定、可预期的方式参与负载均衡。四层模型在请求处理链路中的串联结合源码可以完整还原这四层概念在运行时如何被串联使用。在 bfe_route/server_data_conf.go 中HostTableLookup(hostname)根据请求的 hostname 找到对应的Product在 Product 内部路由规则basic/advanced route把请求映射到目标Cluster的 cluster nameClusterTableLookup(clusterName)返回该 Cluster 对应的BfeCluster运行时对象调度时由BalanceGslb在Sub Cluster间按权重选子集群再由子集群内的BalanceRR在Instance间选具体后端。同时LoadServerDataConf的check()阶段server_data_conf.go会校验路由规则中的 Product 必须存在于 host 规则路由规则引用的 cluster name 必须存在于 cluster_conf等依赖关系确保这四层配置在加载期就是自洽的。小结Product租户配置隔离的边界拥有独立的转发策略与权限Cluster提供相同功能的后端集合一个 Product 下可定义多个 ClusterSub ClusterCluster 的物理分组通常按 IDC 划分是 GSLB 跨机房调度的基本单元Instance子集群内的后端服务器由 IP:Port 唯一标识是负载均衡的最小粒度。这四个术语层层嵌套、逐级收敛构成了 BFE 从业务租户到单台后端机器的完整寻址链路。理解它们之后再去阅读 BFE 的路由规则配置host 规则、路由规则、集群配置cluster_conf与成员表cluster_table就会顺畅得多。赞分享后端网络/通信云原生【免费下载链接】bfeA modern layer 7 load balancer from baidu项目地址https://gitcode.com/gh_mirrors/bf/bfe点击查看免费下载相关推荐Nacos Naming 资源模型详解Service、Cluster、Instance 的标识、字段与校验规则Nacos Naming 资源模型详解Service、Cluster、Instance 的标识、字段与校验规则 本文基于 Nacos 官方的 Naming 资后端微服务配置中心服务注册发现云原生终极指南Cluster API核心概念详解——Machine、MachineDeployment与MachineSet终极指南Cluster API核心概念详解——Machine、MachineDeployment与MachineSet Cluster API是Kuberneelasticsearch-head核心API详解Cluster服务与Preferences管理elasticsearch head核心API详解Cluster服务与Preferences管理 引言Elasticsearch集群管理的痛点与解决方案 在数据可视化数据库客户端运维观测上一篇Bili2text智能视频内容提取让知识管理更高效下一篇FlexiViT小模型在边缘设备上的部署轻量化视觉AI解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

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