高可用部署架构:生产运营参考设计
随着 Dify 从 PoC 转向生产,高可用性 (HA) 成为一项要求,而不是一种选择。本文系统阐述了企业生产环境所需的高可用部署架构,包括应用层多副本配置、数据库HA、Redis Sentinel、对象存储、矢量DB集群、监控系统、灾难对策等。
整体架构概览
graph TB
subgraph LB["ロードバランサー層"]
ALB["ALB / NLB / Nginx Ingress"]
WAF["WAF"]
end
subgraph APP["アプリケーション層(Kubernetes)"]
API1["API Server<br/>Replica x3"]
WEB1["Web Server<br/>Replica x2"]
WORKER1["Worker<br/>Replica x3"]
SANDBOX1["Sandbox<br/>Replica x2"]
end
subgraph DATA["データ層"]
subgraph PG["PostgreSQL HA"]
PG_P["Primary"]
PG_S1["Standby 1"]
PG_S2["Standby 2"]
end
subgraph RD["Redis HA"]
RD_M["Master"]
RD_R1["Replica 1"]
RD_R2["Replica 2"]
RD_S["Sentinel x3"]
end
S3_["S3 / MinIO<br/>(オブジェクトストレージ)"]
subgraph VDB["ベクトルDB HA"]
VDB1["Node 1"]
VDB2["Node 2"]
VDB3["Node 3"]
end
end
subgraph MON["監視・可観測性"]
PROM["Prometheus"]
GRAF["Grafana"]
ALERT["AlertManager"]
LOG["Loki / EFK"]
end
ALB --> API1
ALB --> WEB1
API1 --> PG_P
API1 --> RD_M
API1 --> S3_
API1 --> VDB1
WORKER1 --> PG_P
WORKER1 --> RD_M
WORKER1 --> S3_
WORKER1 --> VDB1
PROM --> APP
PROM --> DATA
修改组件配置和 HA 要求
每个组件的角色和可用性要求
| 组件 | 角色 | 无状态/有状态 | 建议的副本数量 | 停电影响 |
|---|---|---|---|---|
| API服务器 | REST API 处理、应用程序执行 | 无国籍 | 3+ | 所有 API 停止响应 |
| 网络服务器 | 前端交付 | 无国籍 | 2+ | 用户界面无法访问 |
| 工人 | 异步任务处理(Embedding等) | 无国籍 | 3+ | 停止后台处理 |
| 沙盒 | 代码执行环境 | 无国籍 | 2+ | 代码节点无法执行 |
| PostgreSQL | 元数据、用户和应用程序设置 | 有状态 | 主用 + 备用 x2 | 完整功能下 |
| Redis | 会话、缓存、队列 | 有状态 | 主 + 副本 x2 | 响应延迟、任务队列停顿 |
| 对象存储 | 文件和文档存储 | 有状态 | 托管推荐 | 没有文件访问权限 |
| 矢量数据库 | 嵌入索引 | 有状态 | 3 节点集群 | 知识库不可搜索 |
应用层HA设计
Kubernetes 部署配置
API Server部署设计要点:
- 副本:3或更多,RollingUpdate策略(maxUnavailable:1,maxSurge:1)
- podAntiAffinity:使用
topology.kubernetes.io/zone作为密钥的 AZ 分布式放置 - 资源:请求(CPU:1,内存:2Gi)/限制(CPU:2,内存:4Gi)
- 健康检查:使用readinessProbe(30秒后启动,每10秒一次)、livenessProbe(60秒后启动,每30秒一次)监控
/health端点
扩展策略
| 组件 | 缩放方法 | 触发条件 | 上限指南 |
|---|---|---|---|
| API服务器 | HPA(CPU/内存) | CPU 超过 70% | 10 个复制品 |
| 网络服务器 | HPA(CPU) | CPU 超过 60% | 5 个复制品 |
| 工人 | HPA(队列长度) | 等待任务100+ | 10 个副本 |
| 沙盒 | HPA(CPU) | CPU 超过 70% | 5 个复制品 |
Pod 中断预算
在PodDisruptionBudget中设置minAvailable: 2,即使在维护或节点故障期间也能维持最小数量的副本。
数据层HA设计
PostgreSQL 高可用性
PostgreSQL 是存储 Dify 所有元数据的最重要组件。
| 配置模式 | 特点 | 推荐环境 |
|---|---|---|
| AWS RDS 多可用区 | 托管、自动故障转移 | AWS 环境 |
| 极光 PostgreSQL | 高可用性、只读副本 | 大规模 AWS 环境 |
| 云 SQL 高可用 | 区域管理 | GCP 环境 |
| 帕特罗尼 + PostgreSQL | OSS、Kubernetes 原生 | 本地/多云 |
推荐配置(适用于AWS):
graph LR
subgraph AZ1["AZ-a"]
PGP["PostgreSQL Primary<br/>db.r6g.xlarge"]
end
subgraph AZ2["AZ-c"]
PGS["PostgreSQL Standby<br/>db.r6g.xlarge"]
end
PGP -->|"同期レプリケーション"| PGS
PGP -->|"自動バックアップ"| S3B["S3<br/>バックアップ"]
设计要点:
- 自动故障转移 RTO:60-120 秒(对于 RDS 多可用区)
- 备份保留期限:最短7天,建议35天
- 时间点恢复:5 分钟间隔
- 连接池:建议引入PgBouncer(管理API Server连接数)
Redis 高可用性
Redis 用于会话管理、缓存和任务队列 (Celery)。
| 配置模式 | 特点 | 故障转移时间 |
|---|---|---|
| Redis哨兵 | 自动故障转移,3+ Sentinel | 10-30 秒 |
| Redis集群 | 分片+副本 | 10-30 秒 |
| AWS ElastiCache(集群模式) | 托管、多可用区 | 秒 - 30 秒 |
Redis Sentinel配置示例:
graph TB
subgraph Sentinels["Sentinel クラスタ"]
S1["Sentinel 1"]
S2["Sentinel 2"]
S3["Sentinel 3"]
end
subgraph RedisNodes["Redis ノード"]
RM["Master<br/>r6g.large"]
RR1["Replica 1<br/>r6g.large"]
RR2["Replica 2<br/>r6g.large"]
end
S1 ---|監視| RM
S2 ---|監視| RM
S3 ---|監視| RM
RM -->|レプリケーション| RR1
RM -->|レプリケーション| RR2
设计要点:
- 法定人数至少由 3 个哨兵(奇数)组成
- 最大内存策略:推荐
allkeys-lru - 内存大小:活动会话数 x 平均会话大小 + 缓存 + 任务队列
对象存储
| 配置模式 | 耐用性 | 可用性 | 推荐环境 |
|---|---|---|---|
| AWS S3 | AWS S3 99.999999999% | 99.99% | AWS环境(标配推荐) |
| 地面站 | 99.999999999% | 99.95%+ | GCP 环境 |
| Azure Blob 存储 | 99.999999999% | 99.9%+ | Azure 环境 |
| MinIO(分布式模式) | 依赖配置 | 依赖配置 | 本地 |
托管对象存储本质上具有高可用性,因此您只需要注意应用程序端的连接设置(重试、超时)即可。
矢量数据库高可用性
| 矢量数据库 | 高可用性配置 | 复制 | 推荐节点数 |
|---|---|---|---|
| Weaviate | 多节点集群 | 自动复制 | 3+ |
| Qdrant | 分布式模式 | 基于 Raft 的共识 | 3+ |
| Milvus | 分布式架构 | 段复制 | 3+ |
| pgvector | 取决于 PostgreSQL HA | PostgreSQL 复制 | 与 PostgreSQL 同居 |
网络层设计
入口/负载均衡器配置
graph TB
INTERNET["インターネット / 社内ネットワーク"] --> WAF2["WAF<br/>(AWS WAF / ModSecurity)"]
WAF2 --> ALB2["Application Load Balancer<br/>(Multi-AZ)"]
ALB2 --> ING["Kubernetes Ingress Controller<br/>(Nginx / ALB Ingress)"]
ING --> SVC_API["Service: dify-api"]
ING --> SVC_WEB["Service: dify-web"]
SVC_API --> POD_API1["API Pod 1"]
SVC_API --> POD_API2["API Pod 2"]
SVC_API --> POD_API3["API Pod 3"]
设计要点:
- TLS 终止由 ALB / Ingress Controller 执行
- WebSocket 支持(用于流响应):扩展 Ingress Controller 超时设置
- 速率限制:在WAF或Ingress级别设置
- IP白名单:仅限内网访问(企业标准)
尺码指南
按规模推荐配置
| 组件 | 小型(约 50 个用户) | 中(50-500 个用户) | 大型(500+ 用户) |
|---|---|---|---|
| Kubernetes 工作节点 | 3 x m6i.大 | 5 x m6i.x大 | 8+ x m6i.2x大 |
| API 服务器副本 | 2 | 3 | 5+ |
| 工人复制品 | 2 | 3 | 5+ |
| PostgreSQL | db.r6g.large | db.r6g.xlarge | db.r6g.2xlarge |
| Redis | 缓存.r6g.large | 缓存.r6g.xlarge | cache.r6g.xlarge(集群) |
| 矢量数据库 | 3 个 4vCPU/16GB | 3 个 8vCPU/32GB | 5 个 8vCPU/64GB |
| 对象存储 | S3标准 | S3标准 | S3 标准 + CloudFront |
预计每月费用(AWS,东京区域)
| 组件 | 小 | 中等 | 大 |
|---|---|---|---|
| Kubernetes(EKS + EC2) | 800 美元 | 2,500 美元 | 6,000 美元以上 |
| PostgreSQL (RDS) | 300 美元 | 600 美元 | 1,200 美元 |
| Redis(ElastiCache) | 200 美元 | 400 美元 | 800 美元 |
| S3 | 10 美元 | 50 美元 | 200 美元 |
| 矢量数据库(EC2) | 500 美元 | 1,200 美元 | 3,000 美元 |
| ALB+WAF | 100 美元 | 200 美元 | 400 美元 |
| 总计 | 1,900 美元 | $4,950 | $11,600+ |
*不包括LLM API使用费。实际成本将根据使用模式的不同而有很大差异。
监控/可观察性
监控堆栈配置
| 层 | 工具 | 监控 |
|---|---|---|
| 基础设施 | 普罗米修斯 + Grafana | CPU、内存、磁盘、网络 |
| 库伯内特 | kube 状态指标 | Pod、部署、节点状态 |
| 应用 | 普罗米修斯(自定义指标) | API 延迟、错误率、队列长度 |
| 数据库 | CloudWatch / pg_stat | 查询性能、连接数、复制延迟 |
| 日志 | Loki / EFK 堆栈 | 应用日志、错误日志、审核日志 |
| 追踪 | Jaeger/X 射线 | 请求追踪、瓶颈识别 |
重要警报设置
| 警报名称 | 状况 | 严重性 | 回应 |
|---|---|---|---|
| API响应延迟 | P95 > 10秒持续5分钟 | 警告 | 考虑横向扩展 |
| API 错误率增加 | 5xx > 1% 持续 3 分钟 | 关键 | 立即调查 |
| PostgreSQL 复制延迟 | > 30 秒 | 关键 | 数据库团队通知 |
| Redis内存使用率 | > 85% | 警告 | 内存扩展或缓存TTL回顾 |
| 工作队列保留 | 等待任务> 500 | 警告 | 工作人员横向扩展 |
| 矢量数据库延迟 | P95 > 1 秒 | 警告 | 索引优化 |
| Pod CrashLoopBackOff | 5分钟内重启3次 | 关键 | 检查日志,调查根本原因 |
| 磁盘使用情况 | > 80% | 警告 | 产能扩张 |
灾难响应(DR)设计
RPO/RTO 设计指南和 DR 配置模式
根据行业具体的RPO/RTO需求选择容灾配置。金融行业要求RPO<1分钟/RTO<15分钟,并要求热备或更高。在制造业中,RPO/RTO 都在 1 小时内,而对于零售和内部工具,4-24 小时是一般准则。
| 图案 | 恢复点目标 | RTO | 成本 | 配置 |
|---|---|---|---|---|
| 备份与恢复 | 几个小时 | 几个小时 | 低 | 定期备份→S3→恢复到其他区域 |
| 指示灯 | 几分钟 | 30分钟-1小时 | 中等 | 始终将数据库副本保留在灾难恢复区域 |
| 温暖待机 | 分钟 | 15 分钟 | 中高 | DR 区域中减少的配置始终可用 |
| 主动-主动 | 零 | 零 | 高 | 两个区域同时运行,基于DNS的路由 |
备份策略
| 目标 | 备份方法 | 频率 | 保留期限 | 储存地点 |
|---|---|---|---|---|
| PostgreSQL | 自动快照+WAL | 每日+连续 | 35 天 | S3跨区 |
| Redis | RDB 快照 | 每 6 小时 | 7 天 | S3 |
| 对象存储 | S3跨区域复制 | 实时 | 无限期 | 异域S3 |
| 矢量数据库 | 快照 | 每日 | 14 天 | S3 |
| Kubernetes 配置 | GitOps(ArgoCD / Flux) | 每次提交 | Git 历史 | Git 存储库 |
灾难恢复培训
灾害对策仅靠设计是不够的;定期培训至关重要。我们建议您每月执行一次备份恢复测试和混沌工程(Pod/节点故障模拟),每季度执行一次 DB/Redis 故障转移测试,每六个月执行一次灾难恢复区域切换的端到端测试。
部署管道
建议使用基于 GitOps (ArgoCD/Flux) 的部署流程。 Git Push → CI 管道(测试 + 镜像构建)→ 容器注册表 → ArgoCD 差异检测 → 暂存自动部署 → 批准 → 生产 在滚动更新流程中,N-1 个副本始终通过设置 maxUnavailable: 1 / maxSurge: 1 来继续处理请求。如果出现问题,可以立即使用kubectl rollout undo进行回滚。
总结
Dify的高可用部署架构并不止于应用层的多重复制。需要对各层进行系统设计,包括PostgreSQL、Redis、对象存储、矢量DB数据层HA、网络层冗余、监控/警报系统、灾难对策等。 日本金融机构和制造业要求与现有的灾难恢复标准和审计要求保持一致,因此我们建议您明确您的非功能性需求,并根据您自己的环境调整本文中的参考架构。就成本和风险平衡而言,从中等规模的配置开始生产并随着使用量的增加逐渐扩展是最现实的方法。
参考资料
- Dify 企业资源清单:公式ドキュメント
- Dify Kubernetes 部署:公式ドキュメント
- ACK最佳实践:Alibaba Cloud Blog