多副本、高可用与并发故障排查
本指南针对在多副本环境(如 Kubernetes、Docker Swarm)部署 Open WebUI,或通过 多个 worker(UVICORN_WORKERS > 1)提升并发时常见的问题进行说明。
如果你是第一次搭建 扩缩容部署,请先阅读 扩展 Open WebUI 获取完整步骤。
核心要求检查清单
在排查具体错误前,请先确保你的部署满足多副本场景下的这些硬性要求。缺少其中任意一项,都可能导致不稳定、登录循环或数据丢失。
- 共享密钥: 所有副本上的
WEBUI_SECRET_KEY必须完全一致。 - 外部数据库: 你必须使用外部 PostgreSQL(见
DATABASE_URL)。SQLite 不支持 多实例部署。 - WebSocket 使用 Redis: 必须启用
ENABLE_WEBSOCKET_SUPPORT=True与WEBSOCKET_MANAGER=redis,并配置有效的WEBSOCKET_REDIS_URL。 - 共享存储: 持久卷(最好是 RWX / ReadWriteMany,或确保所有副本都映射到同一份
data/底层存储)对 RAG(上传/向量)和生成图像都非常关键。 - 外部向量数据库(必需): 默认 ChromaDB 使用本地 SQLite 支持的
PersistentClient,不适合多 worker 或多副本部署。SQLite 连接不具 备 fork-safe 特性,多进程并发写入会导致 worker 立即崩溃。你必须通过VECTOR_DB使用专用外部 Vector DB(如 PGVector、MariaDB Vector、Milvus、Qdrant),或将 ChromaDB 作为独立 HTTP 服务运行。 - 数据库会话共享(可选): 对资源充足的 PostgreSQL 部署,可考虑启用
DATABASE_ENABLE_SESSION_SHARING=True以提高高并发性能。 - 线程池上限: 将
THREAD_POOL_SIZE=2000(或更高)。阻塞操作的默认并发上限只有 40;在多用户规模下会很快被耗尽,导致应用看起来卡住,但 CPU/内存却一切正常。这只是一个上限值,而不是线程/CPU 数量——设置得高并不会带来争用风险。永远不要降低它。 - 节流在线状态写入: 设置
DATABASE_USER_ACTIVE_STATUS_UPDATE_INTERVAL=300(300–500 秒)。未设置(默认)时,每个用户的last_active_at都会几乎在每个请求上被写入——这是大量细小的UPDATE/COMMIT事务,在规模部署时会饱和连接池,并且没有任何功能性收益。