平台元数据库配置

配置/切换平台元数据库连接串、初始化数据库表、Postgres 适配、定时备份时读这篇

04-运维管理 / 数据库
元数据库metadata dbMySQLPostgreSQLpgMYSQL_SERVICEPOSTGRESQL_SERVICEKINGBASE_SERVICESQLALCHEMY_DATABASE_URI连接串pymysqlpsycopg2migrationsversionsversions-postgresalembic

平台元数据库配置

平台用一个关系型数据库存储所有元数据(项目、任务流、模型、数据集、用户权限等)。元数据库类型由后端 Pod 的环境变量决定,默认数据库名为 kubeflow

连接串与选型优先级

后端在 config.py 中按以下优先级解析连接串到 SQLALCHEMY_DATABASE_URIinstall/docker/config.py:476-488):

MYSQL_SERVICE  →  POSTGRESQL_SERVICE  →  KINGBASE_SERVICE  →  DM_SERVICE

即:配了 MYSQL_SERVICE 就用 MySQL;否则看 POSTGRESQL_SERVICE,再否则 KINGBASE_SERVICE(人大金仓),最后 DM_SERVICE(达梦)。这些环境变量配置在 infra 命名空间下 kubeflow-dashboard 的 Deployment 上(线上由 deploy-config configmap 注入,见 配置文件管理.md)。

用 PostgreSQL(或人大金仓)时,不要再配置 MYSQL_SERVICE,否则会优先走 MySQL。


一、MySQL

环境变量:

MYSQL_SERVICE = mysql+pymysql://$user:$password@$host:$port/kubeflow?charset=utf8mb4

其中 $user/$password/$host/$port 为 MySQL 的用户名、密码、ip、端口。

线上 kustomize 默认值(install/kubernetes/cube/overlays/kustomization.yml:20): mysql+pymysql://root:admin@mysql-service.infra:3306/kubeflow?charset=utf8mb4

MySQL 的数据库表迁移文件在 myapp/migrations/versions(默认即 MySQL 版本;仓库另存了一份 myapp/migrations/versions-mysql 作为来源)。


二、PostgreSQL

环境变量:

POSTGRESQL_SERVICE = postgresql+psycopg2://$user:$password@$host:$port/kubeflow

测试/内网连接串示例:

postgresql+psycopg2://postgres:postgres@postgresql.kubeflow:5432/kubeflow

迁移目录会自动切换(无需手动改)

PostgreSQL 的迁移文件在 myapp/migrations/versions-postgres当检测到配置了 POSTGRESQL_SERVICE(或 KINGBASE_SERVICE)时,config.py 会自动删除 versions 目录并把 versions-postgres 拷贝过去(install/docker/config.py:480-482):

shutil.rmtree('/home/myapp/myapp/migrations/versions', ignore_errors=True)
shutil.copytree('/home/myapp/myapp/migrations/versions-postgres', '/home/myapp/myapp/migrations/versions')

⚠️ 与旧文档差异:早期文档要求「手动把 versions-postgres 改名为 versions、并自行备份原 MySQL 结构」。当前版本已由 config.py 在启动时自动完成该切换,不需要手动改目录。这是一次性覆盖 versions 目录的操作,源在 versions-postgres,无需也不应手动备份运行目录里的 versions。依据 install/docker/config.py:478-482

Postgres 不支持 sa.Text(length=65536)

PostgreSQL 无法识别 sa.Text(length=65536) 这类带长度的 Text,需改为 sa.Text()。也就是说,用作 Postgres 元数据库时,迁移/模型里不能出现 sa.Text(length=65536) 这种列类型。

人大金仓 KingBase(PostgreSQL 兼容)

人大金仓(KingBase)兼容 PostgreSQL 协议,平台把它当作 PG 使用:

  • 连接串配 KINGBASE_SERVICE格式与 PG 相同(驱动仍是 postgresql+psycopg2),端口默认 54321

    KINGBASE_SERVICE = postgresql+psycopg2://$user:$password@$host:54321/kubeflow
    
  • 选型优先级上 KINGBASE_SERVICEPOSTGRESQL_SERVICE 之后(见本文开头);配了它就和 PG 一样自动切到 versions-postgres 迁移目录、走 Alembic 建表,上面 PG 的 sa.Text(length=...) 限制同样适用。

  • 平台对 KingBase 有一段兼容补丁myapp/__init__.py:8-17 会在任何 SQLAlchemy 连接建立前执行, 按 KingbaseES Vxx Rxx 版本号做适配,因此 KINGBASE_SERVICE 必须在启动时就配好。

  • schema 初始化与 PG 一致(myapp/create_db.pyinstall/docker/README.md:230 对 postgres/kingbase/达梦做了兼容)。


三、数据库初始化(建表)

容器启动脚本 entrypoint.sh 负责初始化(install/docker/entrypoint.sh:21-32):

export FLASK_APP=myapp:app
python myapp/create_db.py        # 建库 / db.create_all() 兜底
# 非达梦时执行 Alembic 迁移(MySQL/PostgreSQL 走这里)
if [ -z "$DM_SERVICE" ]; then
  myapp db upgrade               # 按 versions 目录把表结构同步到数据库
fi
myapp fab create-admin ...       # 创建 admin 用户/角色/权限
myapp init                       # 初始化默认角色、权限、自定义 menu

达梦(DM_SERVICE)不走 Alembic 迁移,靠 create_db.py 里的 db.create_all() 建表,并在 config.py 中清空 versions 目录(install/docker/config.py:484-488)。达梦的部署与迁移另见 达梦数据库部署与迁移.md


四、数据库定时备份

通过 crontab 定时备份数据库数据目录(按月清理旧备份、按天打快照):

# 添加到 crontab
mkdir -p /data/back/
rm -rf /data/back/mysql-$(date +%Y%m)*
cp -r /data/k8s/infra/mysql /data/back/mysql-$(date +%Y%m%d)

该示例针对 MySQL 数据目录 /data/k8s/infra/mysql(hostpath 部署)。PostgreSQL/达梦请按其数据目录与官方备份工具(如 pg_dump)调整。


相关

具体连接行为以源码 install/docker/config.pyinstall/docker/entrypoint.sh 为准。

最后更新 2026-06-30完整文档以官方仓库为准:GitHub Wiki