☰
CubeFS BlobStore Proxy 模块配置指南:消息转发、卷分配续租代理与缓存详解
2026/10/5 1:54:32 网站建设 项目流程
  • 存储
  • 分布式文件系统
  • 对象存储
  • 云原生

【免费下载链接】cubefs

cloud-native distributed storage

项目地址:https://gitcode.com/gh_mirrors/cu/cubefs
点击查看免费下载

导读:本文以 CubeFS 纠删码存储子系统(BlobStore)中 Proxy 模块的配置文档为主体,系统讲解其作为"Clustermgr 减压阀"的三大职责——消息转发、卷的分配与续租代理、卷/磁盘信息缓存,完整覆盖关键配置项、全部配置项语义与可运行的示例配置,并结合仓库源码(blobstore/proxy/)剖析各配置参数背后的实现机制与默认值,帮助部署与调优人员快速落地一个生产可用的 Proxy 节点。

Proxy 模块定位:为 Clustermgr 分担压力的"中间层"

在 CubeFS BlobStore 的架构中,Proxy是位于 Access 与 Clustermgr 之间的代理模块,主要承担三类职责:

  • 消息转发:将 Blob 删除消息、Shard 修复消息投递到 Kafka 对应主题,驱动后台异步任务(如垃圾回收、数据修复);
  • 卷的分配与续租代理:代替 Access 向 Clustermgr 批量申请卷(Volume)、批量续租卷,避免每个读写请求都直接打向 Clustermgr;
  • 缓存:从 v3.3.0 版本开始支持对卷(Volume)和磁盘(Disk)信息的本地缓存,进一步削减对 Clustermgr 的查询压力。

从源码看,Proxy 服务在启动时会向 Clustermgr 注册自身服务节点,随后基于心跳维持服务发现关系(见 blobstore/proxy/service.go)。其模块入口位于 blobstore/cmd/proxy/main.go,启动时通过config.Init("f", "", "proxy.conf")加载配置文件(blobstore/proxy/service.go)。

配置总体结构:公有配置 + 私有配置

Proxy 的配置文件由两部分组成:

  1. 公有配置:服务端口(bind_addr)、运行日志(log)、审计日志(auditlog)、鉴权(auth)等所有模块共有的配置项,其完整字段说明见 基础服务配置(原文档链接./base.md等价转换为仓库根目录相对路径);
  2. 私有配置:本文重点讲解的 Proxy 独有配置项,涵盖心跳、卷分配、续租、消息队列、缓存等。

配置文件整体以 JSON 格式组织,启动参数-f指定配置文件路径。

关键配置项速查

以下配置项是让 Proxy 正常工作的必填项,来源于官方配置文档:

配置项说明必需
公有配置如服务端口、运行日志以及审计日志等,参考基础服务配置章节是
host当前 host 信息,用于上报 clustermgr 作服务发现使用,例如http://服务ip:bind_port是
cluster_id集群编号是
idc所在机房编号是
retain_interval_s续租间隔周期,配合 cm 卷过期时间设定是
init_volume_num初始启动向 clustermgr 申请卷的数量,根据集群大小设定是
default_alloc_vols_num每次向 clustermgr 申请卷的个数,根据集群大小设定是
mqkafka 生产者配置是
diskv_base_path卷和磁盘信息缓存的持久化路径是

其中host、cluster_id、idc三个字段会组成clustermgr.ServiceNode注册到 Clustermgr 作服务发现(blobstore/proxy/service.go),因此它们的取值必须与集群实际规划一致。

全部配置项详解

官方文档给出了带注释的完整配置骨架,以下逐项展开说明,并补充源码中的默认值与取值范围。

{ "heartbeat_interval_s": "向 Clustermgr 心跳的间隔周期,心跳时间为 heartbeatTicks * tickInterval,默认值 3 秒", "heartbeat_ticks": "配合 heartbeat_interval_s 使用,默认值 30", "expires_ticks": "服务过期 ticks,默认值 60", "diskv_base_path": "缓存信息本地持久化路径", "diskv_temp_dir": "diskv 临时目录", "volume_capacity": "内存卷信息容量,默认为 1 M", "volume_expiration_seconds": "内存卷信息过期时间,默认为 0,表示不过期", "disk_capacity": "内存磁盘信息容量,默认为 1 M", "disk_expiration_seconds": "内存磁盘信息过期时间,默认为 0,表示不过期", "volume_route_sync_interval_seconds": "卷路由同步间隔,默认值 60 秒", "clustermgr": { "hosts": "clustermgr 的主机列表,[ `http://ip:port`,`http://ip1:port`]", "rpc": "参见 rpc LbClient 配置介绍" }, "bid_alloc_nums": "每次 access 向 proxy 申请的最大 bid 个数", "host": "当前 host 信息,用于上报 clustermgr 作服务发现使用,例如 http://服务ip:bind_port", "cluster_id": "集群编号", "idc": "所在机房编号", "retain_interval_s": "续租间隔周期,配合 cm 卷过期时间设定", "init_volume_num": "初始启动向 clustermgr 申请卷的数量,根据集群大小设定", "default_alloc_vols_num": "每次向 clustermgr 申请卷的个数,access 的分配请求可以触发", "retain_volume_batch_num": "批量续租,根据集群的大小设定,每次向 clustermgr 续租的卷数量,可缓解单次续租压力,默认 400", "retain_batch_interval_s": "批次续租的时间间隔", "metric_report_interval_s": "proxy 上报运行状态给普罗米修斯的时间周期", "mq": { "blob_delete_topic": "删除消息主题名", "shard_repair_topic": "修复消息主题名", "shard_repair_priority_topic": "高优修复的消息会投递至该主题,一般是某个 bid 在多个 chunk 有缺失的情况", "version": "kafka 的版本号,默认为 2.1.0", "msg_sender": { "kafka": "参见 kafka 生产者使用配置介绍" } } }

心跳与注册相关

heartbeat_interval_s、heartbeat_ticks、expires_ticks三个参数共同决定 Proxy 与 Clustermgr 之间的心跳与服务过期判定。源码中的默认值定义于 blobstore/proxy/service.go:

  • heartbeat_interval_s:默认3(秒);
  • heartbeat_ticks:默认30,配合前者的实际心跳周期 =heartbeatTicks * tickInterval;
  • expires_ticks:默认60,超过该 ticks 数未收到心跳则 Clustermgr 判定服务过期。

此外,checkAndFix()中还会对clustermgr客户端超时与mq.msg_sender超时做下限兜底(默认 1000ms),未显式配置时会自动补齐(blobstore/proxy/service.go)。

卷分配相关(allocator)

init_volume_num、default_alloc_vols_num、retain_volume_batch_num、retain_batch_interval_s、retain_interval_s、metric_report_interval_s属于卷分配器(allocator)的配置,对应源码中的VolConfig结构(blobstore/proxy/allocator/volumemgr.go),默认值定义于同一文件常量区(blobstore/proxy/allocator/volumemgr.go):

  • default_alloc_vols_num:默认4,指每次向 Clustermgr 申请卷的个数,Access 的分配请求不足时会触发补充申请;
  • retain_interval_s:默认40(秒),卷续租主循环周期;
  • retain_volume_batch_num:默认400,单次批量续租的卷数量,用于摊薄 Clustermgr 的续租压力;
  • retain_batch_interval_s:默认1(秒),批次续租之间的间隔;
  • metric_report_interval_s:默认60(秒),向 Prometheus 上报运行状态的时间周期。

需要注意init_volume_num在源码中的语义:启动时每个纠删码模式(codeMode)会以default_alloc_vols_num为基准发起初始申请,初始化申请到的卷中超过default_alloc_vols_num的部分会被放入备用(backup)卷池(见allocVolumeLoop中isInit && index >= DefaultAllocVolsNum的分支,blobstore/proxy/allocator/volumemgr.go),因此调大init_volume_num相当于预取更多备用卷以应对突发流量。

卷分配器内部为每个 codeMode 维护 current/backup 双卷池,并运行两个后台任务:retainTask(定期续租与清理满卷,blobstore/proxy/allocator/retain_volume_task.go)和metricReportTask。续租失败的卷会被立即废弃并从本地卷池剔除(handleRetainResult,blobstore/proxy/allocator/retain_volume_task.go)。

bid_alloc_nums对应BlobConfig(blobstore/proxy/allocator/bidmgr.go):控制 Proxy 每次向 Clustermgr 申请 bid(Blob ID)段的个数,源码默认下限为10000(defaultBidAllocNums),配置值小于该值时会被自动抬升(blobstore/proxy/allocator/bidmgr.go)。BidMgr 同样采用 current/backup 双段机制,保证 bid 段耗尽时仍能持续供号。

缓存相关(cacher,v3.3.0+)

diskv_base_path、diskv_temp_dir、volume_capacity、volume_expiration_seconds、disk_capacity、disk_expiration_seconds、volume_route_sync_interval_seconds对应缓存模块的ConfigCache(blobstore/proxy/cacher/cacher.go)。缓存采用两级结构(L1 内存 LRU + L2 磁盘 diskv),未命中时再回源 Clustermgr,数据流示意见 blobstore/proxy/cacher/cacher.go:

  • diskv_base_path:卷/磁盘缓存落盘的基路径(必填),diskv_temp_dir为其临时目录;
  • volume_capacity/disk_capacity:内存缓存的容量上限,默认1 << 20(1M 条目)级别;
  • volume_expiration_seconds/disk_expiration_seconds:内存缓存过期时间,默认0表示不过期;
  • volume_route_sync_interval_s_seconds:卷路由版本同步间隔,源码默认20秒,文档标注默认 60 秒,实际以代码为准;启动时若本地无卷路由版本号会先强制全量同步一次(blobstore/proxy/cacher/cacher.go)。

为分散回源压力,缓存过期时间还引入了随机扰动(interleaveExpiration,blobstore/proxy/cacher/cacher.go),避免大量 key 同时过期导致对 Clustermgr 的瞬时冲击。

消息队列(mq)

mq段控制 Kafka 生产者配置,对应MQConfig结构(blobstore/proxy/service.go):

  • blob_delete_topic:删除消息主题,由BlobDeleteMgr消费驱动(blobstore/proxy/mq/blob_delete.go);
  • shard_repair_topic:普通修复消息主题,由ShardRepairMgr消费驱动(blobstore/proxy/mq/shard_repair.go);
  • shard_repair_priority_topic:高优修复主题,用于某个 bid 在多个 chunk 上同时缺失的紧急修复场景;
  • version:Kafka 版本号,默认2.1.0,启动时会通过sarama.ParseKafkaVersion校验,非法版本直接报错(blobstore/proxy/service.go);
  • msg_sender:Kafka 生产者配置,如broker_list,完整字段参考 Kafka 生产者使用配置介绍。

checkAndFix还会校验三个主题名不能为空且彼此不能相同(blobstore/proxy/service.go),否则启动失败并返回ErrIllegalTopic。

示例配置:一个可直接运行的最小 Proxy

仓库自带的示例配置见 blobstore/cmd/proxy/proxy.conf,官方文档示例与其高度一致(端口、topic、日志略有差异),两者可对照参考。以下为文档中的完整示例:

{ "bind_addr": ":9600", "host": "http://127.0.0.1:9600", "idc": "z0", "cluster_id": 1, "default_alloc_vols_num" : 2, "init_volume_num": 4, "diskv_base_path": "./run/cache", "clustermgr": { "hosts": [ "http://127.0.0.1:9998", "http://127.0.0.1:9999", "http://127.0.0.1:10000" ] }, "mq": { "blob_delete_topic": "blob_delete", "shard_repair_topic": "shard_repair", "shard_repair_priority_topic": "shard_repair_prior", "version": "0.10.2.0", "msg_sender": { "broker_list": ["127.0.0.1:9092"] } }, "log": { "level": "info", "filename": "./run/logs/proxy.log" } }

对该示例的关键点说明:

  • bind_addr为监听地址,host必须与其一致并带上协议前缀,供 Clustermgr 服务发现;
  • clustermgr.hosts建议配置全部 Clustermgr 节点,配合 rpc LbClient 实现负载均衡与故障转移;
  • idc、cluster_id需与 Clustermgr 侧规划保持一致;
  • version需与部署的 Kafka 实际版本匹配,示例中为0.10.2.0;
  • 若开启审计日志,可参考 blobstore/cmd/proxy/proxy.conf 中的auditlog段追加"auditlog": {"logdir": "./run/auditlog/proxy"};
  • 三个 Kafka 主题需要提前在 Kafka 集群中创建好,否则消息投递会失败。

启动方式与路由能力一览

Proxy 以模块方式注册进 BlobStore 通用启动框架(cmd.RegisterGracefulModule,blobstore/proxy/service.go),通过-f参数指定配置文件启动:

./proxy -f proxy.conf

启动后 Proxy 对外提供如下 HTTP 路由(见NewHandler,blobstore/proxy/service.go),可作为部署后的连通性自检依据:

方法路径作用
POST/volume/alloc卷分配(含 bid 分配)
GET/volume/list?code_mode=列出当前 codeMode 的卷
POST/volume/discard废弃失效卷
POST/repairmsg发送修复消息到 Kafka
POST/deletemsg发送删除消息到 Kafka
GET/cache/volume/{vid}读取卷缓存(支持 flush/version 参数)
GET/cache/disk/{disk_id}读取磁盘缓存(支持 flush 参数)
DELETE/cache/erase/{key}清除缓存(key 为ALL时清空全部)

部署建议小结

  • 按集群规模调节卷池:init_volume_num、default_alloc_vols_num决定初始与增量卷申请节奏,小集群可沿用默认 4/2,大集群适当调大以降低 Clustermgr 分配请求频率;
  • 续租节奏与 Clustermgr 卷过期时间配合:retain_interval_s必须小于 Clustermgr 侧的卷过期时间,否则卷会在续租前被判定过期失效;retain_volume_batch_num默认 400,集群卷数量大时可适当调大并辅以retain_batch_interval_s错峰;
  • 缓存参数按访问模式调优:读多场景可调大volume_capacity/disk_capacity并延长volume_expiration_seconds/disk_expiration_seconds;diskv_base_path需落在持久化磁盘上,Proxy 重启后可复用缓存;
  • 消息主题务必预先创建:blob_delete_topic、shard_repair_topic、shard_repair_priority_topic三个主题名不能为空、不能互相重复,需与 Kafka 侧实际主题一致。

以上配置项与默认值均有官方文档与仓库源码双重依据,部署时建议以当前仓库版本(blobstore/proxy/ 目录)的实际实现为准进行核对。

  • 存储
  • 分布式文件系统
  • 对象存储
  • 云原生

【免费下载链接】cubefs

cloud-native distributed storage

项目地址:https://gitcode.com/gh_mirrors/cu/cubefs
点击查看免费下载
上一篇:OpenShift(origin) × GlusterFS 分布式存储实战:hostPath、glusterfs 插件、PV/PVC 与 Template 四种接入方式
下一篇:loadable-components与React Native集成:移动端代码分割

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询