Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

高可用部署架构:生产运营参考设计

随着 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 环境
帕特罗尼 + PostgreSQLOSS、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+ Sentinel10-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 S3AWS 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 HAPostgreSQL 复制与 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 服务器副本235+
工人复制品235+
PostgreSQLdb.r6g.largedb.r6g.xlargedb.r6g.2xlarge
Redis缓存.r6g.large缓存.r6g.xlargecache.r6g.xlarge(集群)
矢量数据库3 个 4vCPU/16GB3 个 8vCPU/32GB5 个 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 美元
S310 美元50 美元200 美元
矢量数据库(EC2)500 美元1,200 美元3,000 美元
ALB+WAF100 美元200 美元400 美元
总计1,900 美元$4,950$11,600+

*不包括LLM API使用费。实际成本将根据使用模式的不同而有很大差异。

监控/可观察性

监控堆栈配置

工具监控
基础设施普罗米修斯 + GrafanaCPU、内存、磁盘、网络
库伯内特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 CrashLoopBackOff5分钟内重启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跨区
RedisRDB 快照每 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、网络层冗余、监控/警报系统、灾难对策等。 日本金融机构和制造业要求与现有的灾难恢复标准和审计要求保持一致,因此我们建议您明确您的非功能性需求,并根据您自己的环境调整本文中的参考架构。就成本和风险平衡而言,从中等规模的配置开始生产并随着使用量的增加逐渐扩展是最现实的方法。


参考资料