PostgreSQL vector数据同步到RDS for PostgreSQL
场景描述
在电商推荐、内容搜索、大模型知识库问答及多模态检索等业务中,语义检索发挥着关键作用。其基础是向量数据:嵌入模型将文本、图像等数据转化为高维向量,再通过计算向量间的相似度来衡量语义。通过安装vector插件,PostgreSQL可支持vector、halfvec、sparsevec等向量类型与ivfflat、hnsw等向量索引,使企业能够在一套数据库中统一管理业务数据与向量数据、直接开展向量检索,无需另建专用向量数据库。
数据复制服务(DRS)支持将本地IDC自建、ECS自建及云上PostgreSQL中的向量数据同步至华为云RDS for PostgreSQL,使企业可获得托管高可用、与云上AI应用低时延协同、跨区域就近访问及异地容灾等收益。
本实践通过数据复制服务DRS,将本地 IDC自建PostgreSQL中的向量数据迁移至华为云RDS for PostgreSQL;借助全量+增量同步,实现源库与目标库向量数据的长期实时同步,支撑业务平滑割接。若源库为其他云PostgreSQL或华为云RDS for PostgreSQL,整体操作类似,详细差异请参考“其他源库场景差异”。
迁移原理
本实践使用全量+增量同步,原理如下:
- 全量同步前,DRS启动增量数据抽取(默认使用源库test_decoding逻辑解码获取实时增量数据),确保全量期间的增量数据完整抽取到DRS实例。
- 全量同步阶段,DRS迁移表结构(含向量列类型与维度)与数据至目标库,向量索引随表结构一并迁移。
- 全量完成后自动进入增量同步,从全量抽取位点开始回放并持续同步,将源库向量数据的INSERT/UPDATE/DELETE实时同步至目标库,保持源库与目标库数据持续一致。
- 增量同步阶段时延趋于 0(数据追平)后,可启动数据对比任务校验源库与目标库的一致性。
- 数据对比一致后,即可启动业务割接(建议在业务低峰期进行)。
DRS将vector类型作为常规PostgreSQL数据类型处理,任务无需为vector做额外配置;目标库预先安装vector插件即可接收向量数据。同步对象选择表级同步时,DRS不会在目标库自动安装vector,需由您在同步前手动安装(见“源库与目标库准备”)。
服务列表
- 虚拟私有云 VPC
- 云数据库 RDS for PostgreSQL
- 数据复制服务 DRS
- 数据管理服务 DAS
前提条件
- 拥有华为云实名认证账号,账户余额大于等于0元。
- 已知源库的IP地址、端口、账号和密码。
- 源库已配置逻辑复制:wal_level=logical、test_decoding 逻辑解码插件可用、账号具备REPLICATION权限。
规划与选型建议
迁移前完成以下规划。各项给出推荐与选择依据,您可按实际业务调整。
| 规划项 | 推荐 | 说明 |
|---|---|---|
| VPC与Region | 与目标RDS、DRS实例同Region同VPC | 同VPC内通信时延最低;跨Region需打通对等连接。 |
| 源库账号 | 具备REPLICATION与表SELECT等权限 | 最小权限见“源库与目标库准备”。 |
| 目标库版本 | 不低于源库版本且不低于PostgreSQL 12 | 华为云 RDS for PostgreSQL支持vector的最低版本为PostgreSQL 12。 |
| RDS实例类型 | 生产环境推荐主备 | 主备提供高可用与故障切换;单机仅适用于非生产验证。 |
| RDS规格 | 按数据量与并发选择 | 数据量大或含大字段(如 bytea/text)的表建议选择较高规格,避免同步时的内存压力。 |
| RDS存储 | 按源库数据量预估并预留余量 | 全量初始化并发写入会使目标表空间略大于源;另需预留增量WAL空间。 |
| RDS端口 | 5432(默认,可修改) | 修改后需在安全组与DRS连接配置中一并更新。 |
| 网络类型 | 按源库位置选择 | 源库在华为云同VPC选VPC网络;IDC或跨云选公网网络(源库须绑EIP)或VPN/专线网络。三种均支持,公网会产生数据传输费用。 |
| DRS同步实例规格 | 按数据量与同步时效选择 | 规格类型对应不同性能上限,数据量大或要求低时延建议选择较高规格。 详见实时同步链路规格说明。 |
| DRS同步模式 | 全量+增量 | 先全量迁移存量数据,再持续增量同步,保持源库与目标库长期一致;本实践选用全量+增量。 |
操作流程
主要任务流程如下:
- 创建VPC。
- 创建安全组。
- 创建RDS for PostgreSQL实例。
- 源库与目标库准备。
- 创建DRS同步任务。
- 同步后数据校验。
创建 VPC
创建VPC,为RDS实例与DRS同步实例准备网络资源。
- 登录华为云控制台,单击管理控制台左上角选择区域。
- 单击左侧服务列表图标,选择“网络 > 虚拟私有云 VPC”。
- 单击“创建虚拟私有云”,配置基本信息:区域、可用区、VPC名称、VPC网段(如 192.168.0.0/16)、子网名称、子网网段(如 192.168.0.0/24),单击“立即创建”。 图2 创建虚拟私有云
- 返回 VPC 列表,当 VPC 状态为“可用”时,表示创建完成。
创建安全组
创建安全组,为RDS实例配置访问控制规则,放通DRS与业务访问。
- 登录华为云控制台,选择区域。
- 服务列表选择“网络 > 虚拟私有云 VPC”。
- 选择“访问控制 > 安全组”,单击“创建安全组”,填写安全组名称等信息,单击“确定”。
- 返回安全组列表,单击安全组名称,选择“入方向规则”,单击“添加规则”,配置入方向规则放通DRS访问(协议TCP、端口5432、源地址填DRS实例IP或所在子网网段)。 图3 配置安全组入方向规则
创建RDS for PostgreSQL实例
- 登录华为云控制台,选择区域。
- 服务列表选择“数据库 > 云数据库 RDS”。
- 单击“购买数据库实例”。
- 配置实例基本信息:引擎选PostgreSQL;版本选不低于源库版本且不低于PostgreSQL12(需支持vector);实例类型选择主备;选择规格、存储类型与容量、可用区;选择上文创建的VPC与安全组;配置数据库端口(默认5432,可修改)与管理员账号密码;参数模板可选默认或自定义。 图4 购买RDS for PostgreSQL实例
- 单击“立即购买”,确认信息并提交。
- 返回实例列表,当实例状态为“正常”时,表示创建完成。实例内网地址与端口在“实例管理 → 实例 → 连接管理 → 连接信息”查看,供DRS填写目标库信息。
实例购买与各项配置详见购买RDS for PostgreSQL实例。
源库与目标库准备
- 源库配置逻辑复制
- 修改源库postgresql.conf,确认以下参数,修改后重启PostgreSQL。
wal_level = logical max_replication_slots = 10 # 须大于当前已用复制槽数,请按实际调整 max_wal_senders = 10 # 须大于或等于 max_replication_slots
- 修改pg_hba.conf,在所有配置前增加一行,放通DRS以 replication方式连接(认证方式按源库password_encryption参数值选择scram-sha-256或md5)。
host replication <账号名> <DRS实例IP>/32 md5
DRS实例IP在创建同步任务(见“创建DRS同步任务”)时由DRS分配。建议先创建同步任务至“同步实例”步骤获取DRS实例IP,回填此处后以UPERUSER执行select pg_reload_conf(); 重新加载(或重启PostgreSQL),再返回任务继续配置源库连接测试。
- 确认test_decoding逻辑解码可用(创建临时复制槽验证,未报“无法访问test_decoding”的错误即表示支持,验证后删除):
SELECT * FROM pg_create_logical_replication_slot('temp_decoding_slot', 'test_decoding', true); SELECT * FROM pg_drop_replication_slot('temp_decoding_slot'); - 对无主键的待同步表设置replica identity:
ALTER TABLE <schema>.<表名> REPLICA IDENTITY FULL;
- 修改源库postgresql.conf,确认以下参数,修改后重启PostgreSQL。
- 源库账号与权限
创建或指定具备REPLICATION权限的账号,并授予同步所需权限。
CREATE USER <账号名> WITH LOGIN REPLICATION PASSWORD '<密码>'; GRANT CONNECT ON DATABASE <库名> TO <账号名>; GRANT USAGE ON SCHEMA <schema> TO <账号名>; GRANT SELECT ON ALL TABLES IN SCHEMA <schema> TO <账号名>;
请示例命令中 <账号名>、<密码>、<库名>、<schema> 替换为您的实际值。
- 源库对象检查
- 待同步表建议有主键或非空唯一约束;若无主键,须按上方步骤4设置replica identity=full以支持增量UPDATE/DELETE。
- 向量列的维度(typmod,如vector(3))正确。
- 向量索引的opclass完整(如vector_cosine_ops、halfvec_l2_ops)。
- 若表有依赖序列且目标库无同名序列,须将序列一并纳入同步对象。
以下示例演示含向量类型与向量索引的表创建,供您参考,请按实际表结构调整:
CREATE TABLE vec_test ( id int PRIMARY KEY, v vector(3), hv halfvec(4), sv sparsevec(5) ); CREATE INDEX idx_vec_l2 ON vec_test USING ivfflat (v vector_l2_ops) WITH (lists = 100); CREATE INDEX idx_vec_cos ON vec_test USING hnsw (v vector_cosine_ops);
- 目标库安装vector插件
目标库须安装vector插件,是向量同步成功的前提。可通过如下SQL查询目标库支持的vector插件版本列表(结果为空表示不支持)。
SELECT v.name, v.version, (v.version = e.default_version) AS is_default FROM pg_available_extension_versions v JOIN pg_available_extensions e ON v.name = e.name WHERE v.name = 'vector';
支持vector插件的内核版本请详见:支持的插件列表。
华为云RDS for PostgreSQL已预置vector,可通过控制台安装:目标实例“概览”→ 左侧“插件管理”→ 选择目标库 → 在vector插件上单击“安装”,安装后可在“已安装插件”页查看与管理。
- 表级同步:DRS不涉及插件对象,需由您在同步前手动安装vector。
- 库级同步:DRS将自动在目标库安装数据库默认版本的vector插件。
图5 目标库安装 vector 插件(表级同步控制台安装示例)
创建 DRS 同步任务
- 登录华为云控制台,选择区域。
- 服务列表选择“数据库 > 数据复制服务 DRS”。
- 左侧导航栏选择“实时同步管理”,单击“创建同步任务”。
- 配置同步实例信息:选择区域、项目,填写任务名称;数据流动方向选“入云”,源数据库引擎选PostgreSQL,目标数据库引擎选PostgreSQL;网络类型选择公网网络;目标数据库实例选上一步创建的RDS实例;同步实例子网选有可用IP的子网;IP类型选IPv4(或IPv4&IPv6双栈);同步模式选全量+增量;访问公网策略选择EIP,指定公网IP选择可用的公网IP;其余选项保持默认。单击“开始创建”。 图6 配置同步实例信息
- 配置源库及目标库信息:填写源库IP、端口、账号、密码;填写目标库账号和密码。单击“测试连接”测试连通性。连通后单击“下一步”,阅读提示后单击“同意,并继续”。 图7 配置源库及目标库信息
- 设置同步后单击“下一步”。
- 增量冲突策略:选“覆盖”,保证源库与目标库最终一致。
- DML同步:INSERT/UPDATE/DELETE默认全勾。
- 流速模式:默认不限速,可按需限速(仅全量阶段生效)。
- 对象同步范围:如需同步增量DDL,勾选“增量DDL同步”(需在源库预建事件触发器或rds_hwdrs_ddl插件,详见:通过创建表、事件触发器和函数实现PostgreSQL增量DDL同步)。
同步对象可选择库级同步或者表级同步。如果需要迁移单个数据库中的所有对象,选择库级同步,并将需要同步的数据库移至已选对象。如果仅需要同步指定的表,则选择表级同步,并在源库对象中选择待同步的向量表及依赖序列(如果有),移至已选对象。库级同步和表级同步支持的对象范围请参考支持的同步对象范围本文选择库级同步。
图8 设置同步
- 预检查:DRS自动校验源库、目标库的权限、版本、参数、对象、网络。未通过项根据提示修复后单击“重新校验”,直到通过率为100%。全部通过后单击“下一步”。
- 任务确认:设置同步任务启动时间(立即启动或稍后启动,建议业务低峰期)、任务异常通知、SMN主题、时延阈值、任务异常自动结束时间等;检查所有配置项,单击“启动任务”,阅读并勾选“我已阅读启动前须知”,单击“启动任务”。 图9 任务确认与启动
- 任务创建后,返回任务列表查看任务状态。
同步后数据校验
当任务状态变为“增量同步”,说明全量同步已完成。此时可登录目标库查看迁移结果。
- 等待任务状态变为“增量同步”。
- 单击任务名称进入任务详情页。
- 在“同步对比 > 对象级对比”中单击“开始对比”,对比结束后查看表和索引的迁移结果。 图10 对象对比
- 在“同步对比 > 数据级对比”创建内容对比任务查看数据迁移结果。数据对比建议在源库业务低峰期进行;由于同步存在时延,数据持续写入时对比可能出现少量不一致而失去参考意义,请先在任务详情页确认“增量时延”趋于 0 后再启动对比。创建数据对比任务时,“对比类型”选择“内容对比”,“对比方式”选择“动态对比”,动态对比可在存量数据对比完成后,持续对比后续源库新增、修改和删除的数据。对比启动后,可在查看对比报表中查看最新对比结果。 图11 创建内容对比
图12 查看对比报表
- 结束任务:业务完全迁移至目标库后,单击任务“操作”列的“结束”,阅读提示后单击“是”结束任务。结束前请保持源库与目标库网络连通,并关注同步日志上报的状态;选择正常结束(勿勾选强制结束)。 图13 结束任务
注意事项
同步前请关注以下事项:
- 启动任务前请确保源库未启动长事务,长事务会阻塞逻辑复制槽创建,导致任务启动失败。
- 同步期间请勿修改源库与目标库的端口、连接账号密码或权限,请勿在目标库直接写入数据;如启用增量DDL同步,源库执行的DDL须确保在目标库兼容,否则可能导致任务失败或数据不一致。
- 库级同步时,若源库新增无主键表,请先将其replica identity设为full再写入数据,否则可能导致数据不一致或任务失败。
- 表级同步时,若目标表已存在,其主键、向量列类型与维度须与源表一致;目标表可比源表多列,但多列须允许空或有默认值,否则可能导致同步失败。
- PostgreSQL→PostgreSQL同步默认允许级联拓扑,不允许回环拓扑(不支持实例A同步到B、再由B同步回A的循环),多实例级联须避免环路。
完整说明详见注意事项。
计费说明
DRS计费规则要点如下:
- 计费模式:包年/包月与按需计费,规格类型对应不同性能上限,详见实时同步链路规格说明。
- 公网网络类型的任务产生数据传输费用(弹性公网 IP),标准见弹性公网IP价格计算器。
- 异常状态的任务仍会计费,建议设置任务异常自动结束时间,避免产生不必要的费用。
- 更多计费规则详见计费概述。
其他源库场景差异
以下两种场景与本地IDC自建PostgreSQL的差异集中在网络接入与配置方式:托管形态不开放postgresql.conf、pg_hba.conf的直接编辑,须按所在云的托管方式放开访问与参数;若为其他云 ECS自建,则与本地IDC自建一致。
- 源库为其他云 PostgreSQL
- 网络接入:跨云接入华为云,可选公网网络或VPN/专线网络。公网网络时源库须绑定弹性公网IP(EIP),DRS经公网访问源库;VPN/专线网络时源库不走公网,需先打通源库所在网络与华为云VPC的内网通道(通过VPN、专线、云连接或VPC对等连接等),DRS经该内网通道访问源库内网地址。
- 源库信息:DRS源库信息页填写源库IP(或域名)、端口、账号与密码。
- 逻辑复制参数:以源云的参数组或参数管理页设置wal_level=logical(对应自建库postgresql.conf)。
- 访问放通:以源云的IP白名单或安全组放通DRS访问的IP与端口(对应自建库pg_hba.conf放通replication)。
- 账号复制权限:以控制台或对应角色授予账号REPLICATION权限。
- test_decoding:PostgreSQL原生插件之一,一般企业级PostgreSQL(含其他云托管实例)均支持;它是增量同步的逻辑解码插件,源库须确认其已启用。
- 源库为华为云 RDS for PostgreSQL
- 网络接入与源库信息:DRS源库信息页“数据库类型”选“RDS实例”(而非ECS自建库),选择源库实例,填账号密码(无VPC/子网/IP/端口/SSL,RDS通过项目内网自动连通)。
- 逻辑复制参数:在RDS控制台“实例管理 → 实例 → 参数修改”页设置wal_level=logical(按“是否需要重启”提示,静态参数需重启)。
- 访问放通:源实例“连接管理 → 安全组规则 → 添加入方向规则”放通DRS(端口5432)。
- 账号复制权限:控制台创建账号时勾选REPLICATION,或由root成员执行select control_user_privilege('replication', '<账号>');。
- test_decoding:PostgreSQL原生逻辑解码插件,华为云 RDS for PostgreSQL通常已支持;DRS要求源库已安装test_decoding,请在同步前确认其可用。