当需要在数据库中执行AI、机器学习或大规模数据分析任务时,传统方法通常要求将数据迁移至外部计算集群。这一过程不仅增加了系统架构的复杂性,还带来了额外的数据传输成本和延迟。PolarDB PostgreSQL版集成了Ray应用(即PolarDB Ray),使您能够直接在数据库内部利用Python生态和Ray分布式计算框架执行这些复杂任务,从而显著提升数据处理和人工智能推理的效率,并有效降低成本。
功能简介
Ray是一个开源的分布式计算框架,专为大规模AI和Python应用而设计。PolarDB通过内置Ray应用,将这个强大的计算能力与数据库深度融合。这意味着您可以直接在数据库中编写和执行Python代码,利用Pandas、NumPy、Scikit-learn、PyTorch等丰富的AI/ML库来处理存储在数据库中的数据。无论是进行模型训练、数据预处理,还是执行复杂的向量计算,都可以在数据库内一站式完成,无需在数据库和外部计算环境之间来回移动数据。
优势
Serverless架构:提供永不缩容的稳态节点,以支撑常态业务。同时,敏态节点能够根据实时流量自动进行伸缩,兼顾稳定性与成本效益。
高可用:Ray Head节点支持高可用容灾能力,确保集群的稳定运行。
安全可靠:
通过安全容器提供运行时隔离,保障代码执行环境的安全。
支持多租户隔离,防止租户间信息泄露。
Ray Dashboard和Ray Job提交均支持用户名/密码及JWT鉴权,防止未授权访问。
一体化元数据管理:与PolarDB集群处于同一专有网络VPC下,基于PolarDB Ray处理的元数据可直接存储在PolarDB集群中,无需额外网络配置即可实现数据交互。
统一资源池:提供统一的CPU资源池,并支持GPU Worker,为不同类型的计算任务提供灵活的资源支持。
存储服务:支持挂载PolarDB文件系统(Polar File System,简称PolarFS)2.0高性能版存储,可通过文件接口直接读写数据。
开源定制:PolarDB Ray作为开源Ray的下游,与开源Ray生态实现无缝兼容。同时,为开发者提供定制化的优化与增强服务。
适用范围
您的集群形态需为:集中式PolarDB PostgreSQL版集群,暂不支持PolarDB PostgreSQL分布式版集群。
费用说明
组件费用:Ray应用分别收取其Head节点和每个Worker节点的费用,费用根据您选择的组件规格(CPU和内存)和购买时长计算。
存储费用:Ray应用所产生的数据和文件不额外计费,但Ray Job向PolarDB PostgreSQL版集群或PolarFS存储写入的数据将收取相应的存储空间费用。
流量与带宽:不收取费用。
快速体验
1. (可选)创建PolarDB PostgreSQL版集群
若您没有符合适用范围的集群,或现有的集群因业务原因不便进行更改,您可在PolarDB控制台上另行创建一个集群以体验Ray应用。
2. 创建Ray应用
登录PolarDB控制台,在集群详情页中,单击左侧导航栏中的,并单击新建AI应用。

在应用购买页面中,请根据您的需求选择适合的配置:
配置项
说明
付费类型
包年包月:预付费模式。在创建应用时,您需选择固定规格的资源,并预先支付应用的费用。购买周期越长,所享受的折扣也越大。该模式一般适用于业务需求长期稳定的场景。
按量付费:后付费模式。在创建应用时,您需选择固定规格的资源,但无需提前支付应用的费用。该模式根据您实际使用的时长进行计费,一般适用于业务需求灵活的场景。
引擎
固定为PolarDB。
地域
选择应用所在的地理位置。
说明应用购买完成后,不支持更改地域。
应用需与PolarDB PostgreSQL版集群位于同一地域。因此,请选择与PolarDB PostgreSQL版集群相同的地域。
建议将应用与需要连接的ECS创建在同一地域,否则它们将无法通过内网(私网)实现互通,只能通过外网(公网)进行通信,这将无法充分发挥最佳性能。
架构
固定为AI应用。
源PolarDB集群
选择需要创建应用的PolarDB集群。
AI应用
AI应用类型。您需要选择Ray。
组件集
一个Ray应用可以包含一个Head组件和多个Worker组件,这些组件构成应用的组件集。
Head组件:托管的Ray Head节点。
CPU Worker组件:托管的Ray Worker节点。
说明Head组件的最小数量和最大数量只能为1。
CPU Worker组件的最小数量可设为0,最小数量即为Ray稳态Worker节点的数量。最大数量与最小数量之间的差值决定了Ray应用在Serverless形态下的Worker节点的最大数量。
GPU Worker组件目前处于邀测阶段,如需申请试用,请提交工单联系我们为您开启该功能。
AI应用名
您可以填写自定义的应用名称。
说明不能以http://或者https://开头,且长度2~256个字符。
存储类型
固定为PolarFS。
Polarfs实例ID/名称
选择您PolarDB PostgreSQL版集群中创建的PolarFS实例。
说明PolarFS目前处于邀测阶段,如需申请试用,请提交工单联系我们为您开启该功能。
仅支持高性能版PolarFS实例。
网络类型
固定为专有网络。
VPC网络
自动填写为源PolarDB集群的专有网络,无需手动填写。
可用区和交换机
配置VPC网络的交换机,建议选择与PolarDB PostgreSQL版集群的主可用区相同的交换机,以发挥最佳网络性能。
如果已有的交换机无法满足您的要求,您可以自行创建交换机。
安全组
配置应用的安全组。
购买数量
选择需要购买的应用数量。
说明仅付费类型为包年包月时,支持配置。
购买时长
选择应用的购买时长。
说明仅付费类型为包年包月时,支持配置。
自动续费
配置是否开启自动续费。为避免因忘记续费而导致业务中断,建议您开启自动续费。
说明仅付费类型为包年包月时,支持配置。
购买成功后,请返回集群的AI应用页面,即可查看新创建的应用。
说明系统需要3~5分钟创建应用,请耐心等待。
3. 连接Ray应用
配置应用白名单:在AI应用列表页面,单击您的应用ID进入应用详情页,并在白名单页签,新增IP白名单分组、选择安全组或配置已有白名单分组。
说明应用白名单与集群白名单相互独立,需进行单独配置。
如果您的ECS实例需要访问应用,可在ECS实例详情页面查看ECS实例的IP地址,并将其填写至IP白名单中。
如果您的ECS实例与应用位于同一VPC内,您可以填写ECS的私网IP地址或其所在VPC网段。
如果您的ECS实例与应用不在同一VPC内,您可填写ECS的公网IP地址,或添加ECS所在的安全组。
如果您本地的服务器、电脑或其他云服务器需要访问应用,请将其公网IP地址添加到IP白名单中。

获取连接地址:在AI应用列表页面,单击您的应用ID进入应用详情页,在拓扑图页签中查看公网地址或私网地址。
说明公网地址需单独申请,请单击申请按钮以进行申请。
公网地址仅提供IP地址和端口,不提供域名。如您有相关需求,可自行绑定域名。

获取应用配置信息:在AI应用列表页面,单击您的应用ID进入应用详情页,在配置页签中查看相关配置信息。

4. 开发应用
您可以通过公网直接访问应用,在AI应用列表页面中单击开发应用,以跳转至Ray Dashboard的公网地址。或者直接在浏览器地址栏中输入应用的公网IP地址和端口,以访问Ray Dashboard。

5. 通过SDK提交Ray Job
您可以使用Ray SDK以编程方式提交Ray Job。
准备环境
说明请先在您的本地环境中安装Python 3环境。
安装Ray SDK:
pip install ray准备代码文件
您需要在您的工作目录下,新建两个Ray应用脚本。一个用于业务处理,一个用于提交Job。工作目录结构示例如下:- working-dir/ - script.py # 您的Ray业务逻辑脚本 - ray_job_submit.py # 用于提交作业的脚本脚本示例如下:
script.pyimport ray import time @ray.remote def retrieve_task(item, db): time.sleep(item / 10.) return item, db[item] if __name__ == "__main__": database = [ "Learning", "Ray", "Flexible", "Distributed", "Python", "for", "Machine", "Learning" ] ray.init() db_object_ref = ray.put(database) retrieve_refs = [ retrieve_task.remote(item, db_object_ref) for item in [0, 2, 4, 6] ] result = [print(data) for data in ray.get(retrieve_refs)]ray_job_submit.pyimport os import json import base64 import hmac import hashlib import requests from datetime import timezone, timedelta, datetime from requests.auth import HTTPBasicAuth from ray.job_submission import JobSubmissionClient # 您的 Ray Dashboard 地址 address = os.getenv("RAY_DASHBOARD_ADDRESS") # 您可以直接使用 `secret.jwt.anonKey` 进行认证 token = os.getenv("RAY_ANON_TOKEN") # 您也可以使用 `secret.jwt.secret` 生成 JWT secret = os.getenv("RAY_JWT_SECRET") header = {"alg": "HS256", "typ": "JWT"} now = datetime.now(tz=timezone.utc) payload = { "sub": "anon", "iat": int(now.timestamp()), "exp": int((now + timedelta(hours=12)).timestamp()), "iss": "ray-dashboard", "aud": "ray-dashboard-client" } header_encoded = base64.urlsafe_b64encode( json.dumps(header, separators=(',', ':')).encode()).decode('utf-8').rstrip('=') payload_encoded = base64.urlsafe_b64encode( json.dumps(payload, separators=(',', ':')).encode()).decode('utf-8').rstrip('=') message = f"{header_encoded}.{payload_encoded}" signature = hmac.new(secret.encode(), message.encode(), hashlib.sha256).digest() signature_encoded = base64.urlsafe_b64encode(signature).decode('utf-8').rstrip( '=') token = f"{message}.{signature_encoded}" # 您也可以通过POST /api/auth/token 获取 JWT 进行认证,您需要提供用户名和密码 username = os.getenv('RAY_USERNAME') password = os.getenv('RAY_PASSWORD') response = requests.post(f'{address}/api/auth/token', auth=HTTPBasicAuth(username, password), timeout=5) if response.status_code == 200: token_data = response.json() token = token_data['access_token'] else: print(f"❌ Failed to get JWT: {response.status_code}") client = JobSubmissionClient(address, headers={"Authorization": f"Bearer {token}"}) job_id = client.submit_job( # Entrypoint shell command to execute entrypoint="python script.py", # Path to the local directory that contains the script.py file runtime_env={"working_dir": "./"}) print(job_id)配置并运行
在Ray应用配置页面查看以下信息,并将其设置为环境变量或在
submit_job.py脚本中进行替换变量
对应配置项
示例值
RAY_DASHBOARD_ADDRESSRay应用的连接地址,根据您的实际环境选择公网或私网。
http://123.xxx.xxx.xxx:8265RAY_ANON_TOKENsecret.jwt.anonKeyeyJhbGciOi...RAY_JWT_SECRETsecret.jwt.secrettNhVxysSRD...RAY_USERNAMEsecret.dashboard.usernameadminRAY_PASSWORDsecret.dashboard.passwordUTLof$rMVM...在您的工作目录下,执行提交脚本:
python ray_job_submit.py执行成功后,您可以登录Ray Dashboard,在Jobs页面查看已提交作业的运行状态。
