在本地开发AI回答采集系统时,通常使用SQLite存储数据,单机运行,没有并发和监控。当需要将系统部署到生产环境时,必须考虑多实例部署、数据库连接管理、对象存储、日志监控和成本控制等问题。本文以Python采集脚本为例,介绍如何将系统迁移到阿里云ECS、RDS PostgreSQL和OSS,实现稳定、可观测、成本可控的云上部署。
本文适合有Python基础、希望将AI应用部署到云上的开发者。前提是已开通阿里云ECS、RDS、OSS服务,并拥有模型API Key。本文不涉及高并发架构,若需大规模采集,请参考文末的扩展建议。
为什么选择ECS+RDS+OSS
本地原型使用SQLite,数据量小、无并发,但生产环境需要支持多实例写入、数据持久化和备份。选择RDS PostgreSQL是因为它支持并发、数据持久、可备份,且兼容PostgreSQL生态。采集结果存储到OSS,用于长期保存原始JSON,便于后续分析和审计。ECS上部署应用,通过环境变量配置数据库和API Key,避免硬编码。
环境和资源准备
操作系统:Ubuntu 22.04 LTS
Python版本:3.10+(具体版本未提供,请根据项目实际环境和官方兼容性要求选择)
依赖库:requests、psycopg2-binary、boto3、python-dotenv
阿里云资源:ECS实例(2核4GB)、RDS PostgreSQL实例、OSS Bucket
地域:华东1(杭州)
安全组:开放80/443端口(如需Web服务),数据库端口仅对内网开放
整体架构与数据流
flowchart LR
A[采集脚本] --> B[模型API]
B --> C[解析响应]
C --> D[RDS PostgreSQL]
C --> E[OSS Bucket]
D --> F[验证与监控]
E --> F
采集脚本调用模型API获取回答,解析后同时写入RDS和OSS。RDS存储结构化数据,OSS存储原始JSON,便于追溯。
数据库初始化
在RDS上创建数据库和表。使用psql或控制台执行以下SQL:
CREATE TABLE ai_responses (
id SERIAL PRIMARY KEY,
query TEXT NOT NULL,
response JSONB NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
正常情况下,执行后应看到CREATE TABLE提示。
采集脚本改造
将原来的SQLite存储改为RDS,使用psycopg2连接。以下为关键代码片段,需根据实际环境调整参数。
import os
import json
import psycopg2
from psycopg2.extras import Json
def save_response(query, response):
conn = psycopg2.connect(
host=os.getenv('DB_HOST'),
port=5432,
dbname=os.getenv('DB_NAME'),
user=os.getenv('DB_USER'),
password=os.getenv('DB_PASSWORD')
)
cur = conn.cursor()
cur.execute(
"INSERT INTO ai_responses (query, response) VALUES (%s, %s)",
(query, Json(response))
)
conn.commit()
cur.close()
conn.close()
注意:代码中使用了os.getenv,需在脚本开头导入os和json。此代码为示例实现,未经过测试,实际使用时请根据环境调整。
存储原始数据到OSS
使用boto3上传JSON文件到OSS。以下为关键代码片段,需替换为实际Bucket名称和密钥。
import boto3
import json
import time
def upload_to_oss(query, response):
s3 = boto3.client('s3',
endpoint_url='https://oss-cn-hangzhou.aliyuncs.com',
aws_access_key_id=os.getenv('OSS_ACCESS_KEY'),
aws_secret_access_key=os.getenv('OSS_SECRET_KEY'))
s3.put_object(Bucket='your-bucket-name',
Key=f'responses/{int(time.time())}.json',
Body=json.dumps(response))
注意:your-bucket-name需替换为实际Bucket名称。此代码为示例实现,未经过测试。
环境变量配置
在ECS上创建.env文件,并加载。示例:
DB_HOST=your-rds-host
DB_NAME=your-db-name
DB_USER=your-db-user
DB_PASSWORD=your-db-password
DASHSCOPE_API_KEY=your-api-key
OSS_ACCESS_KEY=your-oss-access-key
OSS_SECRET_KEY=your-oss-secret-key
使用python-dotenv加载:
from dotenv import load_dotenv
load_dotenv()
验证方法
运行采集脚本后,验证数据是否写入。
检查RDS记录数:
psql -h $DB_HOST -U $DB_USER -d $DB_NAME -c "SELECT count(*) FROM ai_responses;"
正常情况下,应返回大于0的数字。
检查OSS文件:登录OSS控制台,查看Bucket中是否有responses/目录下的JSON文件。
检查日志:查看应用日志,确认无错误。
监控与日志
使用云监控查看ECS CPU、内存和RDS连接数。日志通过SLS采集应用日志,可设置告警。
成本、稳定性和安全分析
成本:具体计费标准、免费额度和地域差异请以当前官方控制台及计费文档为准。测试结束后,建议释放不再使用的资源,避免持续计费。
稳定性:使用RDS自动备份,ECS开启自动重启。
安全:使用RAM最小权限,API Key存储在环境变量,不硬编码。数据库只允许内网访问,安全组限制来源IP。
踩坑与适用边界
连接池:使用psycopg2连接池避免频繁创建连接,提高性能。
超时重试:调用API时设置超时和重试,避免因网络问题导致任务失败。
限流:注意API限流,使用指数退避策略。
适用边界:本方案适用于中小规模采集,若需高并发,需引入消息队列和分布式任务。
可复用清单
环境变量管理
数据库连接池
OSS上传封装
日志记录
监控告警配置
总结:从本地到云上,核心是替换存储、配置环境、考虑并发和监控。本文提供了一套可复用的迁移路径,帮助开发者快速部署AI采集系统。