bug: ClickHouse schema migrations are flaky with Replicated database

这是一个自托管 Langfuse 在使用 ClickHouse Replicated 数据库引擎 + CLICKHOUSE_CLUSTER_ENABLED=false 时,迁移系统与 Replicated 引擎自动同步 DDL 行为产生冲突导致的 schema_migrations 表状态不一致问题

快速结论:这是一个自托管 Langfuse 在使用 ClickHouse Replicated 数据库引擎 + CLICKHOUSE_CLUSTER_ENABLED=false 时,迁移系统与 Replicated 引擎自动同步 DDL 行为产生冲突导致的 schema_migrations 表状态不一致问题。优先检查你的 Langfuse 集群开关(CLICKHOUSE_CLUSTER_ENABLED)与 ClickHouse 数据库引擎是否匹配。

适用环境:Langfuse 自托管版本 3.156.0,ClickHouse 26.2.4.23,ClickHouse 官方 Operator 部署,数据库使用 Replicated 引擎。

最快修复方案:暂无确认的一步修复方案。Issue 中明确验证有效的方案是改用 Atomic 引擎并保持 CLICKHOUSE_CLUSTER_ENABLED=false,或者在 Replicated 引擎下将 CLICKHOUSE_CLUSTER_ENABLED 设为 true 让 Langfuse 用 ON CLUSTER 子句管理复制。但两种模式之间没有迁移路径,必须在首次部署时选定。

注意事项:Replicated + CLICKHOUSE_CLUSTER_ENABLED=true 的方案在 Issue 中只是 Dosu 的建议,尚无实际验证案例;Dirty 状态导致的 trace 显示/消失问题可能因数据已不一致而需要重建数据库,重启容器只能暂时缓解。

问题场景

自托管 Langfuse 部署时,使用 ClickHouse 官方 Operator 创建 Replicated 引擎数据库,并设置 CLICKHOUSE_CLUSTER_ENABLED=false,期望让 ClickHouse 自己处理跨节点同步。多次重建数据库并让 langfuse-web 执行迁移后,发现 schema_migrations 表出现 dirty=1 的异常记录,甚至整个表为空,而容器日志却显示 34 次迁移全部成功。

报错原文

bug: ClickHouse schema migrations are flaky with Replicated database
Schema migrations table would have a single entry with dirty=1
Or even the whole schema_migrations table being empty
Traces appearing and disappearing from UI / trace not found

原因分析

可能原因:Langfuse 使用 golang-migrate 执行无集群(unclustered)迁移脚本,创建的是不带 ON CLUSTER 的普通 MergeTree 表。但 Replicated 数据库引擎会自动在集群各节点间同步 DDL 语句,两种行为叠加导致 race condition,最终使 schema_migrations 表内容不完整或出现 dirty 标记。Langfuse 期望的引擎类型与实际迁移结果不一致,是 trace 数据在 UI 上“消失”或“重现”的根因。

环境排查

  • 确认 Langfuse 版本:本 Issue 环境为 3.156.0
  • 确认 ClickHouse 版本:26.2.4.23
  • 检查 CLICKHOUSE_CLUSTER_ENABLED 当前值:false 或 true
  • 确认 ClickHouse 数据库引擎类型:Atomic 或 Replicated
  • 查看 schema_migrations 表当前状态:是否存在 dirty=1 记录、表内容是否为空

解决步骤

  1. 方案一(已验证可用):将 ClickHouse 数据库改为 Atomic 引擎,并保持 CLICKHOUSE_CLUSTER_ENABLED=false,由 Langfuse 管理非复制表。
  2. 方案二(可优先尝试):如果坚持使用 Replicated 引擎,设置 CLICKHOUSE_CLUSTER_ENABLED=true,让 Langfuse 执行包含 ON CLUSTER 的 clustered 迁移脚本,生成 ReplicatedMergeTree 表。
  3. 注意:两种模式(clustered 与 unclustered)之间没有迁移路径,必须删除数据库后重新初始化,该决定必须在首次部署时确定
  4. 若已出现 dirty 状态且 trace 数据异常,建议重新创建数据库并完整执行迁移,再验证 UI 数据一致性。

验证方法

重启 langfuse-web 容器多次,确认不再报数据库 dirty 错误;检查 ClickHouse 中 schema_migrations 表内容完整、无 dirty=1 记录;在 UI 中反复刷新 trace 列表,确认数据不再出现“消失/重现”现象。

参考来源

langfuse/langfuse #12589

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 21378

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注