高可用和性能:基于ACK部署Dify的最佳实践

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 本文介绍了基于阿里云容器服务ACK,部署高可用、可伸缩且具备高SLA的生产可用的Dify服务的详细解决方案。

【阅读原文】戳:高可用和性能:基于ACK部署Dify的最佳实践

随着人工智能技术的不断进步,大型语言模型(LLM)如GPT系列已成为许多AI应用的核心。然而,LLM的开发、部署、维护和优化涉及一系列复杂的实践和流程,这一过程通常被称为LLMOps。为了帮助用户轻松创建和管理LLM应用,Dify应运而生,成为一个简单易用的LLMOps平台。

 

目前,Dify的官方支持包括Docker Compose和基于源码的本地部署方式,但这两种方式在高可用性和可伸缩性方面存在不足,因此不适合于生产环境。相比之下,阿里云容器服务ACK(Container Service for Kubernetes)[1]提供高性能的容器应用管理,支持企业级Kubernetes容器化应用的生命周期管理,并且符合赔付标准的服务级协议(SLA),适用于对稳定性和安全性有高要求的大规模业务环境。此外,ACK能够与丰富的云产品无缝集成,显著增强Dify的整体性能。基于阿里云ACK可以轻松部署高可用、可伸缩且具备高SLA的Dify服务,满足生产环境的需求。

 

本文将提供在ACK集群中部署、管理高可用、可伸缩且具备高SLA的Dify服务的详细解决方案。

 

 

 

 

关于Dify

 

 

 

LLMOps是一套完整的实践和流程,旨在涵盖大型语言模型的开发、部署、维护及优化。其核心目标是应对大型语言模型的复杂性,涉及从模型的诞生到实际应用的整个过程,包括数据整理、架构设计、训练、微调、测试、部署以及持续监控等多个环节。在LLMOps的实施中,我们会面临如逻辑设计、上下文增强和数据准备等各种挑战,这些都要求我们投入相当多的时间和精力。而Dify的出现,则为我们提供了一个简便易用的平台,帮助我们轻松应对这些挑战。Dify并不只是一个单一目的、小而美的开发工具,而是一个All-In-One的一站式大模型应用开发平台。

 

 

 

 

Dify能做什么?

 

 

 

创业,快速的将你的AI应用创意变成现实,无论成功和失败都需要加速。在真实世界,已经有几十个团队通过Dify构建MVP(最小可用产品)获得投资,或通过POC(概念验证)赢得了客户的订单。

 

将LLM集成至已有业务,通过引入LLM增强现有应用的能力,接入Dify的RESTful API从而实现Prompt 与业务代码的解耦,在Dify的管理界面是跟踪数据、成本和用量,持续改进应用效果。

 

作为企业级LLM基础设施,一些银行和大型互联网公司正在将Dify部署为企业内的LLM网关,加速GenAI技术在企业内的推广,并实现中心化的监管。

 

探索LLM的能力边界,即使你是一个技术爱好者,通过Dify也可以轻松的实践Prompt工程和Agent技术,在GPTs推出以前就已经有超过60,000开发者在Dify上创建了自己的第一个应用。

 

 

 

 

 

Dify On ACK架构

 

 

 

目前,Dify官方支持了两种部署方式-Docker Compose、以及基于源码的本地部署方式。但这两种部署方式都不具备高可用、可伸缩的特性,不适合生产环境下使用,更多的是用于开发和测试环境。

 

基于ACK的Dify部署相比于Docker Compose和本地部署的方式,有高可用、弹性的优点,可以让Dify组件随业务需求变化即时、平滑地进行扩容,从而有力推动业务发展。与此同时,还可以使用云产品和云服务来代替Dify的基础组件,从而获取更高的性能和SLA。

 

此外,在Dify编排LLM应用过程中,用户既可以选择直接调用LLM服务供应商的OpenAPI,也可以通过ACK部署专属的模型推理服务[2]。这种灵活性和易扩展性,使其能够满足多样化的生产场景需求。

 

 

 

 

 

基于ACK部署Dify

 

 

 

Dify应用的组件主要包括业务组件和基础组件两大类,业务组件包括:api/worker、web、sandbox。基础组件包括:db、verctor db、redis、nginx、ssrf_proxy。

 

目前,ACK控制台的应用市场已经提供ack-dify的应用安装。默认情况下基础组件会使用社区开源的redis、postgres以及weaviate。如果您对这些基础组件有更高的性能、功能和SLA要求、或者对基础组件有运维和管理的压力,可以使用我们的如下云产品:

 

云数据库Redis[3]

 

RDS PostgreSQL[4]

 

AnalyticDB PostgreSQL版[5]

 

基于ACK实现Dify高可用、弹性部署,并同时集成云产品的解决方案,可以实现Dify稳定、高性能部署。

 

 

为了实现以上部署,我们需要在ack-dify的参数配置界面完成如下的参数配置,主要包括以下方面:

 

1. 云产品配置

 

2. 高可用和弹性配置

 

3. 服务访问配置

 

 

 

 

一、云产品配置

 

 

 

本次实践教程中,会使用到云数据库Redis、RDS PostgreSQL、AnalyticDB PostgreSQL版,我们可以按照如下教程提前准备相关资源。

 

云数据库Redis[3]

 

RDS PostgreSQL[4]

 

AnalyticDB PostgreSQL版[5]

 

1.在准备好相关的云资源后,我们首先需要关闭默认的开源的组件安装,包括:redis.enabled、postgresql.enabled、weaviate.enabled 均设置为false。

 

2.配置云数据库Reids

 

###################################
# External Redis
# - these configs are only used when `externalRedis.enabled` is true
###################################
externalRedis:
  enabled: true
  host: "r-***********.redis.rds.aliyuncs.com"
  port: 6379
  username: "default"
  password: "Dify123456"
  useSSL: false

 

1. 配置RDS PostgreSQL

###################################
# External postgres
# - these configs are only used when `externalPostgres.enabled` is true
###################################
externalPostgres:
  enabled: true
  username: "postgres"
  password: "Dify123456"
  address: "pgm-*********.pg.rds.aliyuncs.com"
  port: 5432
  dbName: dify
  maxOpenConns: 20
  maxIdleConns: 5

 

2. 配置ADB

 

###################################
# External AnalyticDB
# - these configs take effect when `externalAnalyticDB.enabled` is true
###################################
externalAnalyticDB:
  enabled: true
  accessKey: "***"
  secretKey: "***"
  region: "cn-hongkong"
  instanceId: "gp-*************"
  account: "dify_user"
  accountPassword: "********"
  # 可以指定已有的namespace;或者填写一个不存在的namespace,会自动创建
  namespace: "difyhelm"
  namespacePassword: "difyhelmPassword"

 

 

 

 

二、高可用和弹性

 

 

 

多数用户基于ACK的部署应用时,都对应用有高可用和弹性伸缩的需求,来提高应用的容灾和对峰值负载的处理能力。在ACK上,只需要对应用的配置进行如下简单的配置,就可以达到以上效果。

 

1.多副本:目前dify的核心业务组件,如api、worker、web、sandbox默认配置为一个副本,通过配置如下参数,可以达到多副本的效果。

 

api.replicas: 2
...
worker.replicas: 2
...
web.replicas: 2
...
sandbox.replicas: 2

 

2.副本打散: 为了避免单节点、或者单az故障对应用整体服务不可用,我们通常需要设置副本之间的打散。示例通过配置pod之间的反亲和性,实现同组件pod尽量打散到不同节点的效果。

 

api.affinity: 
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 100
          podAffinityTerm:
            labelSelector:
              matchExpressions:
                - key: component
                  operator: In
                  values:
                    - api
            topologyKey: kubernetes.io/hostname
  
...
  worker.affinity: 
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 100
          podAffinityTerm:
            labelSelector:
              matchExpressions:
                - key: component
                  operator: In
                  values:
                    - worker
            topologyKey: kubernetes.io/hostname
  
...
  web.affinity: 
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 100
          podAffinityTerm:
            labelSelector:
              matchExpressions:
                - key: component
                  operator: In
                  values:
                    - web
            topologyKey: kubernetes.io/hostname
  
...
  sandbox.affinity: 
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 100
          podAffinityTerm:
            labelSelector:
              matchExpressions:
                - key: component
                  operator: In
                  values:
                    - sandbox
            topologyKey: kubernetes.io/hostname

 

3.弹性配置:为了应对峰值负载的压力,我们通常还会为资源消耗密集型的组件增加弹性伸缩配置。比如worker组件,在处理大量的文档知识库的过程中,容易出现cpu/mem的升高,可以通过如下配置,来实现worker的自动伸缩。

 

woker:
  ...
  autoscaling:
    enabled: true
    minReplicas: 1
    maxReplicas: 5
    metrics:
      - type: Resource
        resource:
          name: memory
          target:
            averageUtilization: 80
            type: Utilization

 

配置后,dify同一组件的多个副本均分布在不同的节点上,且woker依据内存使用量自动伸缩,部署效果如下:

 

➜  ~ kubectl get po -n dify-system -o wide
NAME                                READY   STATUS    RESTARTS   AGE     IP              NODE                        NOMINATED NODE   READINESS GATES
ack-dify-api-655bbf7468-95sfj       1/1     Running   0          6m42s   192.168.1.186   cn-hangzhou.192.168.1.164   <none>           <none>
ack-dify-api-655bbf7468-zdw7l       1/1     Running   0          6m42s   192.168.0.51    cn-hangzhou.192.168.0.40    <none>           <none>
ack-dify-proxy-5f6c546d87-blx79     1/1     Running   0          6m42s   192.168.1.178   cn-hangzhou.192.168.1.165   <none>           <none>
ack-dify-sandbox-5fd7cd8b7c-9flwh   1/1     Running   0          6m42s   192.168.1.183   cn-hangzhou.192.168.1.164   <none>           <none>
ack-dify-sandbox-5fd7cd8b7c-mhq99   1/1     Running   0          6m42s   192.168.0.53    cn-hangzhou.192.168.0.40    <none>           <none>
ack-dify-web-6fbc4d4b4b-54dkx       1/1     Running   0          6m42s   192.168.1.185   cn-hangzhou.192.168.1.164   <none>           <none>
ack-dify-web-6fbc4d4b4b-6kg8f       1/1     Running   0          6m42s   192.168.0.41    cn-hangzhou.192.168.0.40    <none>           <none>
ack-dify-worker-5dddd9877f-cq6rs    1/1     Running   0          6m42s   192.168.0.44    cn-hangzhou.192.168.0.40    <none>           <none>
ack-dify-worker-5dddd9877f-s6r6z    1/1     Running   0          6m42s   192.168.1.182   cn-hangzhou.192.168.1.164   <none>           <none>
➜  ~ kubectl get hpa -n dify-system
NAME              REFERENCE                    TARGETS           MINPODS   MAXPODS   REPLICAS   AGE
ack-dify-worker   Deployment/ack-dify-worker   memory: 17%/80%   1         5         2          6m43s

 

 

 

 

三、服务访问配置

 

 

 

ACK中,我们推荐通过配置Ingress透出Dify服务,相关操作可参照Ingress管理[6]。目前支持配置Nginx Ingree和ALB Ingress, 这里以Nginx Ingress为例。为了安全强烈建议您开启tls设置。

  •  
ingress:
  enabled: false
  # Nginx Ingress className can be set ""
  # ALB Ingress className can be set "alb"
  className: ""
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
    # nginx.ingress.kubernetes.io/backend-protocol: HTTP
    # nginx.ingress.kubernetes.io/proxy-body-size: 15m
    # nginx.ingress.kubernetes.io/ssl-redirect: "true"
  hosts:
    - host: dify-example.local
      paths:
        - path: /
          pathType: Prefix
          backend:
           service:
              name: ack-dify
              port: 80
  tls:
    - secretName: chart-example-tls
      hosts:
        - dify-example.local

 

配置成功后,即可安全便捷的访问Dify服务,进行LLM应用编排、集成LLM应用到已有业务中等等。一个便捷的示例,可以参照使用Dify快速构建AI问答助手_容器服务Kubernetes版ACK(ACK)-阿里云帮助中心[7]

 

 

 

 

 

总结

 

 

 

Dify On ACK的架构支持高可用和弹性的特性,使得其能够根据业务需求快速扩容。这种部署方式允许集成云服务,提供更高的性能和服务等级协议(SLA),极大提升了Dify的稳定性和可用性。通过ACK,用户可以借助云数据库,如云数据库Redis、RDS PostgreSQL和ADB,来取代默认的开源组件,进一步增强功能和性能。

 

此外,利用ACK的弹性配置,企业能够应对峰值负载,实现自动伸缩,提高系统的容灾能力。这使得Dify不仅适合快速启动创新项目,还能作为企业级LLM基础设施,加速GenAI技术在企业中的推广。

 

总而言之,在ACK上部署Dify不仅显著提高了可用性与性能,也简化了管理运维,为企业提供了一个稳健的AI应用开发环境。通过Dify及其在ACK上的部署,用户能够快速将AI应用落地,并持续优化其效果。

 

 

相关链接:

 

[1]阿里云容器服务ACK

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/product-overview/what-is-ack

 

[2]通过ACK部署专属的模型推理服务

https://help.aliyun.com/zh/ack/cloud-native-ai-suite/use-cases/llm-reasoning-practice/

 

[3]云数据库Redis

https://www.aliyun.com/product/redis

 

[4]RDS PostgreSQL

https://help.aliyun.com/zh/rds/apsaradb-rds-for-postgresql/what-is-apsaradb-rds-for-postgresql

 

[5]AnalyticDB PostgreSQL版

https://help.aliyun.com/zh/analyticdb/analyticdb-for-postgresql/product-overview/overview-product-overview

 

[6]Ingress管理

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/ingress-management/?spm=a2c4g.11186623.0.0.377d5820sb5LoH

 

[7]使用Dify快速构建AI问答助手_容器服务Kubernetes版ACK(ACK)-阿里云帮助中心

https://help.aliyun.com/zh/ack/cloud-native-ai-suite/use-cases/building-customized-ai-question-and-answer-assistant-based-on-dify-zero-code?spm=a2c4g.11186623.0.0.4b365423vphWha#93553c98bcf8b




我们是阿里巴巴云计算和大数据技术幕后的核心技术输出者。

欢迎关注 “阿里云基础设施”同名微信微博知乎

获取关于我们的更多信息~

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
27天前
|
Kubernetes 监控 开发者
掌握容器化:Docker与Kubernetes的最佳实践
【10月更文挑战第26天】本文深入探讨了Docker和Kubernetes的最佳实践,涵盖Dockerfile优化、数据卷管理、网络配置、Pod设计、服务发现与负载均衡、声明式更新等内容。同时介绍了容器化现有应用、自动化部署、监控与日志等开发技巧,以及Docker Compose和Helm等实用工具。旨在帮助开发者提高开发效率和系统稳定性,构建现代、高效、可扩展的应用。
|
2月前
|
Kubernetes 持续交付 Docker
利用 Docker 和 Kubernetes 实现微服务部署
【10月更文挑战第2天】利用 Docker 和 Kubernetes 实现微服务部署
|
2月前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
127 60
|
2月前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
233 62
|
12天前
|
存储 Kubernetes Devops
Kubernetes集群管理和服务部署实战
Kubernetes集群管理和服务部署实战
31 0
|
2月前
|
Kubernetes Cloud Native 流计算
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
77 3
|
2月前
|
Kubernetes Docker 微服务
微服务实践k8s&dapr开发部署实验(1)服务调用(一)
微服务实践k8s&dapr开发部署实验(1)服务调用(一)
49 2
|
2月前
|
Kubernetes 网络安全 容器
基于Ubuntu-22.04安装K8s-v1.28.2实验(一)部署K8s
基于Ubuntu-22.04安装K8s-v1.28.2实验(一)部署K8s
244 2
|
2月前
|
Kubernetes 应用服务中间件 nginx
k8s基础使用--使用k8s部署nginx服务
本文介绍了Kubernetes中核心概念Deployment、Pod与Service的基本原理及应用。Pod作为最小调度单元,用于管理容器及其共享资源;Deployment则负责控制Pod副本数量,确保其符合预期状态;Service通过标签选择器实现Pod服务的负载均衡与暴露。此外,还提供了具体操作步骤,如通过`kubectl`命令创建Deployment和Service,以及如何验证其功能。实验环境包括一台master节点和两台worker节点,均已部署k8s-1.27。
203 1
|
3月前
|
Kubernetes 应用服务中间件 nginx
Kubernetes上安装Metallb和Ingress并部署应用程序
Kubernetes上安装Metallb和Ingress并部署nginx应用程序,使用LoadBalancer类型的KubernetesService
173 7