快速结论:这是一个自托管 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 记录、表内容是否为空
解决步骤
- 方案一(已验证可用):将 ClickHouse 数据库改为 Atomic 引擎,并保持
CLICKHOUSE_CLUSTER_ENABLED=false,由 Langfuse 管理非复制表。 - 方案二(可优先尝试):如果坚持使用 Replicated 引擎,设置
CLICKHOUSE_CLUSTER_ENABLED=true,让 Langfuse 执行包含ON CLUSTER的 clustered 迁移脚本,生成ReplicatedMergeTree表。 - 注意:两种模式(clustered 与 unclustered)之间没有迁移路径,必须删除数据库后重新初始化,该决定必须在首次部署时确定。
- 若已出现 dirty 状态且 trace 数据异常,建议重新创建数据库并完整执行迁移,再验证 UI 数据一致性。
验证方法
重启 langfuse-web 容器多次,确认不再报数据库 dirty 错误;检查 ClickHouse 中 schema_migrations 表内容完整、无 dirty=1 记录;在 UI 中反复刷新 trace 列表,确认数据不再出现“消失/重现”现象。
参考来源
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


![[Feature Request]: Add MonkeyOCRv2 as a document parsing backend (working adapter included)](https://www.chat-gpts.plus/wp-content/uploads/2026/09/18671-00b219e6-768x403.jpg)