跳到主要内容
版本:Next 🚧

存储架构

本文档描述 TFRS Operator 管理的数据存储方案,包括各中间件的部署模式、存储配置优先级和隔离模型。

存储配置优先级

TFRS Operator 使用三级优先级链解析存储配置:

组件级配置 > 租户级配置 > 系统默认
优先级配置来源示例
1 - 组件级spec.postgresql.storagespec.redis.storage单独为 PostgreSQL 指定 100Gicbs-ssd StorageClass
2 - 租户级spec.storage租户统一的默认 StorageClass 和大小
3 - 系统默认代码硬编码10Gi,使用集群默认 StorageClass

在 TFRTenant 中配置示例:

apiVersion: infra.tfrobot.io/v1
kind: TFRTenant
spec:
# 租户级默认(优先级 2)
storage:
storageClass: "cbs-ssd"
size: "50Gi"
# 组件级覆盖(优先级 1)
postgresql:
storage:
storageClass: "cbs-ssd-enhanced"
size: "200Gi"
redis:
storage:
size: "20Gi" # 使用租户级 storageClass: cbs-ssd

PostgreSQL

部署方式

通过 CloudNativePG (CNPG) 管理,TFRTenant 为每个租户创建独立的 CNPG Cluster:

配置项
Cluster 名称{namespace}-pg
镜像ghcr.io/cloudnative-pg/postgresql:16-minimal-bookworm
凭据 Secret{namespace}-pg-credentials
默认存储10Gi(可通过优先级链覆盖)

凭据管理

  • username:用户指定(不能是 postgres,CNPG 保留)
  • password:用户指定或 Operator 自动生成
PostgreSQL 隔离级别警告

TFRS Operator 仅提供数据库级别(Database-level)隔离,不管理 Schema 级别隔离。

每个 TFRTenant 获得一个独立的 CNPG Cluster(独立 Pod 和 PVC),实现了数据库实例级隔离。但在同一个数据库内,多个 TFRServer 共享同一数据库时的 Schema 隔离需要应用层自行管理。

职责负责方自动化程度
Database 创建Operator(自动)全自动
Schema 创建Python 应用(db-init 脚本)半自动(由 TFRServer Job 触发)
Schema 命名与隔离运维方(通过 TFS_ROBOT__DB_SCHEMA 配置)手动配置
Schema 冲突检测无校验机制

风险:如果两个 TFRServer 配置了相同的 TFS_ROBOT__DB_SCHEMA,它们将共享同一 Schema,可能导致数据冲突。运维人员需要自行确保 Schema 名称唯一性。

Redis

部署方式

以 Kubernetes Deployment + PVC 方式部署,非 Operator 管理:

配置项
镜像redis/redis-stack-server:7.2.0-v17
PVC 名称redis-data
端口6379
UIRedisInsight (redislabs/redisinsight:latest,端口 5540)
默认存储10Gi(可通过优先级链覆盖)

Redis 采用单实例部署模式,每个租户一个 Deployment。不使用 Redis Sentinel 或 Cluster 模式。

RabbitMQ

部署方式

通过 RabbitMQ Cluster Operator 和 Messaging Topology Operator 管理:

TFRCluster 安装的 Operator:

  • rabbitmq-cluster-operator:管理 RabbitMQ 集群生命周期
  • rabbitmq-messaging-topology-operator:管理 Vhost、User、Permission 等拓扑资源

TFRTenant 创建的实例:

资源类型说明
RabbitmqCluster租户级 RabbitMQ 实例
Vhost虚拟主机隔离
User应用访问凭据
PermissionVhost 级访问权限

每个租户拥有独立的 RabbitMQ 集群实例,通过 Vhost 提供额外的逻辑隔离层。

MinIO

部署方式

通过 MinIO Operator 管理,TFRTenant 为每个租户创建 MinIO Tenant CR:

配置项
镜像minio/minio:RELEASE.2025-07-23T15-54-02Z
默认凭据minioadmin / minioadmin
TLS默认关闭(依赖 Istio mTLS 加密服务间通信)
副本数可配置(默认 1)
端口9000 (API)
默认存储10Gi(可通过优先级链覆盖)

每个 Robot 的独立凭据

TFRServer 通过 MinIO Init Job 为每个机器人实例创建独立的 Bucket 和访问凭据,实现对象存储的逻辑隔离。

共享缓存(SharedCache)

用于在多个 TFRServer 实例和 TFRSUtils 之间共享图片提取缓存。

配置

在 TFRTenant 中启用:

spec:
sharedCache:
enabled: true
pvcName: "image-extracted-dir" # 默认值
storageClass: "cfs" # 必须支持 ReadWriteMany
size: "100Gi"
cacheDir: "~/.tfrobot/documents/extracted" # 默认值

要求

要求说明
AccessModeReadWriteMany (RWX)
StorageClass必须支持 RWX(如 NFS、CephFS、腾讯云 CFS)
挂载路径通过 cacheDir 配置

环境变量自动注入

启用 SharedCache 后,Operator 自动注入以下环境变量到 TFRServer Pod:

变量名值来源说明
TFC_IMAGE__SHARED_CACHEsharedCache.cacheDir共享缓存根目录
TFS_ROBOT__DOC_EXTRACTED_IMAGES_DIRVolumeMount.MountPath图片提取目录(优先级最高,覆盖 ConfigMap)

其他存储组件

组件部署方式存储类型说明
TimescaleDBCNPG + 扩展PVC时序数据,独立于主 PostgreSQL
JaegerHelm ChartPVC分布式追踪数据
GrafanaHelm ChartPVC仪表盘配置和数据

TimescaleDB 使用独立的 CNPG Cluster,凭据与主 PostgreSQL 分离。用户名同样不能为 postgres

隔离模型总结

组件隔离级别隔离方式管理方
PostgreSQL实例级每租户独立 CNPG Cluster(Pod + PVC)Operator
PostgreSQL Schema应用级TFS_ROBOT__DB_SCHEMA 环境变量运维(手动)
Redis实例级每租户独立 Deployment + PVCOperator
RabbitMQ实例级 + 逻辑独立 Cluster + Vhost 隔离Operator
MinIO实例级 + 逻辑独立 Tenant + per-robot Bucket/凭据Operator
SharedCache租户级租户命名空间内 RWX PVCOperator
网络命名空间级mTLS + AuthorizationPolicyOperator

存储架构总览

graph TB
subgraph TFRTenant[租户命名空间]
subgraph databases[数据库层]
PG[(PostgreSQL<br/>CNPG Cluster)]
TSDB[(TimescaleDB<br/>CNPG + Extension)]
RD[(Redis<br/>Deployment)]
end

subgraph messaging[消息层]
RQ[(RabbitMQ<br/>Cluster Operator)]
end

subgraph storage[对象存储层]
MN[(MinIO<br/>MinIO Tenant)]
SC[(SharedCache<br/>RWX PVC)]
end

subgraph monitoring[监控层]
JG[(Jaeger)]
GF[(Grafana)]
end

subgraph servers[TFRServer 实例]
S1[tf-robot-1]
S2[tf-robot-2]
end

S1 --> PG
S1 --> RD
S1 --> RQ
S1 --> MN
S1 --> SC
S2 --> PG
S2 --> RD
S2 --> RQ
S2 --> MN
S2 --> SC
end

subgraph resolution[存储配置优先级]
C1[组件级配置] -->|覆盖| C2[租户级配置]
C2 -->|覆盖| C3[系统默认 10Gi]
end