同步PostgreSQL数据库中vector类型的数据

在AI领域的大语言模型LLM(Large Language Model)应用中,检索增强生成RAG(Retrieval-augmented Generation)技术通过检索外部的辅助知识库,能够显著提升模型输出的准确性和时效性,解决了LLM知识更新慢、容易产生幻觉(回答不准确)的问题。与传统的关键词检索相比,向量检索具备语义层面的相似性检索能力,支持非结构化数据和多模态数据检索。PostgreSQL的pgvector插件,能够在保持PostgreSQL原有结构化数据管理能力的基础上,支持向量检索功能。DTS的数据同步能力,能够将写入到PostgreSQL数据库的向量数据快速地更新至不同地域的其他数据库中,帮助您在数据密集型场景中实现异地容灾、低延迟查询、实时决策、多区域数据分析等。

前提条件

方案概览

  1. 创建数据库实例

    创建目标RDS PostgreSQL实例。

  2. 创建账号

    在目标RDS PostgreSQL实例中,创建用于数据同步的账号。

  3. 创建数据库

    在目标RDS PostgreSQL实例中,创建用于接收数据的数据库。

  4. 安装插件

    在目标RDS PostgreSQL实例中,为目标数据库安装pgvector插件,以支持写入vector类型的数据。

  5. 创建数据同步实例

    使用DTS进行数据同步操作。

准备工作

说明

如下所示为Linux系统的操作步骤。

  1. 登录自建PostgreSQL所属的服务器。

  2. 执行如下命令,查询数据库已使用复制槽数量。

    select count(1) from pg_replication_slots;
  3. 修改配置文件postgresql.conf,将配置文件中的wal_level设置为logical,并确保max_wal_sendersmax_replication_slots的参数值,均大于数据库复制槽已使用数与需要以该自建PostgreSQL为源创建的DTS实例数的总和。

    # - Settings -
    
    wal_level = logical			# minimal, replica, or logical
    					# (change requires restart)
    
    ......
    
    # - Sending Server(s) -
    
    # Set these on the master and on any standby that will send replication data.
    
    max_wal_senders = 10		# max number of walsender processes
    				# (change requires restart)
    #wal_keep_segments = 0		# in logfile segments, 16MB each; 0 disables
    #wal_sender_timeout = 60s	# in milliseconds; 0 disables
    
    max_replication_slots = 10	# max number of replication slots
    				# (change requires restart)
    说明

    配置文件修改完成后,您需要重启自建PostgreSQL使参数生效。

  4. 将DTS的IP地址加入至自建PostgreSQL的配置文件pg_hba.conf中。您只需添加目标数据库所在区域对应的DTS IP地址段,详情请参见添加DTS服务器的IP地址段

    说明
    • 配置文件修改完成后,您需要执行SELECTpg_reload_conf();命令或重启自建PostgreSQL使参数生效。

    • 关于该配置文件的设置请参见pg_hba.conf文件。如果您已将信任地址配置为0.0.0.0/0(如下图所示),可跳过本步骤。

    IP

  5. 根据待同步对象所属的数据库和Schema信息,在目标RDS PostgreSQL中创建相应数据库和Schema(Schema名称须一致),详情请参见创建数据库Schema管理

步骤一:创建数据库实例

  1. 进入RDS实例购买页面

  2. 选择实例的配置参数。

    引擎选择为14、15或16版本的PostgreSQL,其他参数请根据实际情况选择。更多信息,请参见创建RDS PostgreSQL实例

  3. 确认订单信息、购买量和购买时长(仅包年包月实例),勾选服务协议,单击去支付,并完成支付。控制台将提示支付成功开通成功

    说明

    对于包年包月实例,建议选中启用自动续费,避免因忘记续费而导致业务中断。

    按月购买,自动续费周期为1个月;按年购买,自动续费周期为1年,具体以订单时间为准。自动续费可随时取消。更多详情,请参见续费管理/资源续订使用介绍自动续费

  4. 查看实例。

    进入实例列表,在上方选择实例所在地域,根据创建时间找到刚刚创建的实例。

    说明

    实例创建需要约1~10分钟。请刷新页面查看。

  5. 查看目标RDS PostgreSQL实例的内核小版本。

    1. 实例创建成功后,单击目标实例的ID。

    2. 在目标实例的基本信息页面的配置信息区域,查看小版本信息

    3. 确保目标实例的内核小版本为20230430或以上。

      说明

      若目标RDS PostgreSQL实例的内核小版本不满足要求,请进行升级操作。更多信息,请参见升级内核小版本

步骤二:创建账号

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。

  2. 在左侧导航栏中选择账号管理

  3. 单击创建账号

  4. 设置账号参数。

    填入数据库账号、将账号类型选择为高权限账号、设置账号密码(新密码确认密码)。更多信息,请参见创建账号

  5. 单击确定

步骤三:创建数据库

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。

  2. 在左侧导航栏单击数据库管理

  3. 单击创建数据库

  4. 设置数据库参数。

    填入数据库(DB)名称,将授权账号选择为步骤二:创建账号创建的账号,其他参数请根据实际情况选择。更多信息,请参见创建数据库

  5. 单击创建

步骤四:安装插件

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。

  2. 在左侧导航栏单击插件管理

  3. 插件市场页签单击AIGC,并单击vector卡片的安装

    image

  4. 在弹出的对话框,选择数据库名称数据库账户

    说明

    数据库名称需选择步骤三:创建数据库创建的数据库,数据库账户需选择步骤二:创建账号创建的账号。

  5. 单击安装

    您可以在插件管理 > 管理插件 > 已安装插件页面,查看插件的安装情况。

    image

步骤五:创建数据同步实例

说明

本操作以简易配置为例,为您进行介绍创建数据同步实例的方法。更多信息,请参见自建PostgreSQL同步至RDS PostgreSQL

  1. 进入目标地域的同步任务列表页面(二选一)。

    通过DTS控制台进入

    1. 登录数据传输服务DTS控制台

    2. 在左侧导航栏,单击数据同步

    3. 在页面左上角,选择同步实例所属地域。

    通过DMS控制台进入

    说明

    实际操作可能会因DMS的模式和布局不同,而有所差异。更多信息,请参见极简模式控制台自定义DMS界面布局与样式

    1. 登录DMS数据管理服务

    2. 在顶部菜单栏中,选择集成与开发 > 数据传输(DTS) > 数据同步

    3. 同步任务右侧,选择同步实例所属地域。

  2. 单击创建任务,进入任务配置页面。

  3. 可选:在页面右上角,单击试用新版配置页

    说明
    • 若您已进入新版配置页(页面右上角的按钮为返回旧版配置页),则无需执行此操作。

    • 新版配置页和旧版配置页部分参数有差异,建议使用新版配置页。

  4. 配置源库及目标库信息。

    类别

    配置

    说明

    源库信息

    数据库类型

    选择PostgreSQL

    接入方式

    请根据源库的部署位置进行选择,本示例选择专线/VPN网关/智能网关

    说明

    源库为自建数据库时,您需要执行相应的准备工作。更多信息,请参见准备工作概览

    实例地区

    选择自建PostgreSQL数据库所属专有网络VPC的地域。

    是否跨阿里云账号

    本示例使用当前阿里云账号下的数据库实例,需选择不跨账号

    已和源端数据库联通的VPC

    选择与自建PostgreSQL数据库所属的专有网络VPC。

    域名或IP地址

    填入自建PostgreSQL数据库的服务器IP地址。

    端口

    填入自建PostgreSQL数据库提供服务的端口,默认为3433

    数据库名称

    填入自建PostgreSQL数据库中待同步对象所属数据库的名称。

    数据库账号

    填入自建PostgreSQL数据库中具备superuser权限的账号。

    数据库密码

    填入该数据库账号对应的密码。

    连接方式

    请根据实际情况选择,本示例保持默认的非加密连接

    目标库信息

    数据库类型

    选择PostgreSQL

    接入方式

    选择云实例

    实例地区

    选择步骤一:创建数据库实例创建的RDS PostgreSQL实例所属的地域。

    实例ID

    选择步骤一:创建数据库实例创建的RDS PostgreSQL实例的ID。

    数据库名称

    填入步骤三:创建数据库创建的数据库。

    数据库账号

    填入步骤二:创建账号创建的账号。

    数据库密码

    填入该数据库账号对应的密码。

    连接方式

    请根据实际情况选择,本示例保持默认的非加密连接

  5. 配置完成后,在页面下方单击测试连接以进行下一步

    说明
    • 请确保DTS服务的IP地址段能够被自动或手动添加至源库和目标库的安全设置中,以允许DTS服务器的访问。更多信息,请参见添加DTS服务器的IP地址段

    • 若源库或目标库为自建数据库(接入方式不是云实例),则还需要在弹出的DTS服务器访问授权对话框单击测试连接

  6. 配置任务对象。

    1. 对象配置页面,配置待同步的对象。

      配置

      说明

      同步类型

      默认已选中增量同步,本示例同时选中库表结构同步全量同步

      同步拓扑

      本示例为单向同步,需选择单向同步

      目标已存在表的处理模式

      保持默认的预检查并报错拦截

      源库对象

      源库对象框中,选中待同步的对象,然后单击向右将其移动至已选择对象框。

      重要

      若待同步的表有依赖的序列(Sequence),且目标Schema中没有同名的Sequence,您还需要在源库对象框中选中该Sequence。

      已选择对象

      本示例无需额外配置,保持默认即可。

    2. 单击下一步高级配置,进行高级参数配置。

      本示例无需进行修改,保持默认的配置。

    3. 单击下一步数据校验,进行数据校验任务配置。

      本示例不使用数据校验功能,保持默认的配置。

  7. 单击页面下方的下一步保存任务并预检查

  8. 预检查通过率显示为100%时,单击下一步购买

  9. 购买实例。

    1. 购买页面,选择数据同步实例的计费方式、链路规格,详细说明请参见下表。

      本示例无需进行修改,保持默认的配置。

    2. 勾选《数据传输(按量付费)服务条款》

    3. 单击购买并启动,并在弹出的确认对话框,单击确定

      您可在数据同步界面查看具体任务进度。

附录

注意事项

类型

说明

源库限制

  • 待同步的表需具备主键或唯一约束,且字段具有唯一性,否则可能会导致目标数据库中出现重复数据。

    说明

    若接收数据的目标表不是通过DTS创建(同步类型未选中库表结构同步),则需确保该表与源库中待同步的表具备相同的主键或非空唯一约束,否则可能会导致目标数据库中出现重复数据。

  • 若同步对象为表级别,且需进行编辑(如表列名映射),单次同步任务的表数量超过5000时,建议您拆分待同步的表,分批配置多个任务,或者配置整库的同步任务,否则任务提交后可能会显示请求报错。

  • WAL日志:

    • 需开启,即设置wal_level参数的值为logical

    • 如为增量同步任务,DTS要求源数据库的WAL日志保存24小时以上,如为全量同步和增量同步任务,DTS要求源数据库的WAL日志至少保留7天以上(您可在全量同步完成后将WAL日志保存时间设置为24小时以上),否则DTS可能因无法获取WAL日志而导致任务失败,极端情况下甚至可能会导致数据不一致或丢失。由于您所设置的WAL日志保存时间低于DTS要求的时间进而导致的问题,不在DTS的SLA保障范围内。

  • 如自建PostgreSQL进行主备切换,会导致同步失败。

  • 需要确保max_wal_senders和max_replication_slots的参数值,均大于当前数据库复制槽已使用数与需要以该自建PostgreSQL为源创建的DTS实例数的总和。

  • 若源库有长事务,且实例包含增量同步任务,则可能会导致源库长事务提交前的预写日志WAL(Write-Ahead Logging)无法清理而堆积,从而造成源库磁盘空间不足。

  • 当源实例为Google Cloud Platform Cloud SQL for PostgreSQL时,源库的数据库账号需填入具有cloudsqlsuperuser权限的账号。在选择同步对象时需选择此账号有权限管理的对象,或者给此账号添加目标对象的Owner权限。

    说明

    具有cloudsqlsuperuser权限的账号,无法管理Owner为其他cloudsqlsuperuser权限账号的数据。

  • 在库表结构同步和全量同步阶段,请勿执行库或表结构变更的DDL操作,否则会导致数据同步任务失败。

其他限制

  • 单个数据同步任务只能同步一个数据库,如需同步多个数据库,您需要为每个数据库配置数据同步任务。

  • 同步期间,如果同步对象的选择粒度为Schema,在待同步的Schema中创建了新的表或使用RENAME命令重建了待同步的表,您需要在对该表写入数据前执行ALTER TABLE schema.table REPLICA IDENTITY FULL;命令,以保障该表数据同步的一致性。执行该命令期间,建议您不要有锁表操作,否则会导致表锁死。

    说明
    • 将上述命令中的schematable替换成真实的Schema名和表名。

    • 建议您在业务低峰期进行操作。

  • DTS的校验对象为数据内容,暂不支持Sequence等元数据的校验,您需要自行校验。

  • 由于业务切换到目标端后,新写入的Sequence不会按照源库的Sequence最大值作为初始值去递增,您需要在业务切换前,更新目标库的Sequence值。更多信息,请参见更新目标库的Sequence值

  • DTS会在源库中创建以下临时表,用于获取增量数据的DDL、增量表的结构、心跳信息等。在同步期间,请勿删除源库中的临时表,否则会导致DTS任务异常。临时表会在DTS实例释放后自动删除。

    public.dts_pg_classpublic.dts_pg_attributepublic.dts_pg_typepublic.dts_pg_enumpublic.dts_postgres_heartbeatpublic.dts_ddl_commandpublic.dts_args_session

  • 为保障同步延迟时间展示的准确性,DTS会在源库中新增一个名为dts_postgres_heartbeat的心跳表。

  • 同步期间,DTS会在源库中创建前缀为dts_sync_的replication slot用于复制数据。通过该replication slot,DTS可以获取源库15分钟内的增量日志。

    说明

    当释放同步任务或同步失败时,DTS会主动清理该replication slot;如果自建PostgreSQL发生了主备切换,则需要您登录备库来手动清理。

    Amazon slot查询信息

  • 执行数据同步前需评估源库和目标库的性能,同时建议业务低峰期执行数据同步。否则全量数据初始化时将占用源库和目标库一定的读写资源,可能会导致数据库的负载上升。

  • 全量初始化会并发执行INSERT操作,导致目标数据库的表产生碎片,因此全量初始化完成后目标实例的表空间比源实例的表空间大。

  • 对于表级别的数据同步,如果除DTS以外的数据没有写入目标库,您可以使用数据管理DMS(Data Management)来执行在线DDL变更,请参见不锁表结构变更

  • 在DTS同步期间,不允许有除DTS外的数据写入目标库,否则会导致源库与目标库数据不一致。例如,有除DTS外的数据写入目标库时,使用DMS执行在线DDL变更,可能引起目标库数据丢失。

  • 若为全量同步或增量同步任务,且源数据库中要同步的表包含外键、触发器、事件触发器,如果目标库账号为高权限账号或者super权限账号,全量或增量同步时DTS会以Session级别暂时将session_replication_role的参数值设置为replica;如果目标库账号没有该权限,您需要手动将目标数据库中session_replication_role的参数值设置为replica。在此期间(全量同步或增量同步过程中session_replication_role的参数值为replica),若源库存在级联更新、删除操作,则可能会导致数据不一致。在DTS同步任务释放后,您可以将session_replication_role的参数值改回origin。

  • 若实例运行失败,DTS技术支持人员将在8小时内尝试恢复该实例。在恢复失败实例的过程中,可能会对该实例进行重启、调整参数等操作。

    说明

    在调整参数时,仅会修改实例的参数,不会对数据库中的参数进行修改。可能修改的参数,包括但不限于修改实例参数中的参数。

费用说明

同步类型链路配置费用
库表结构同步和全量数据同步不收费。
增量数据同步收费,详情请参见计费概述

增量同步支持的SQL操作

操作类型

SQL操作语句

DML

INSERT、UPDATE、DELETE

DDL

  • 仅2020年10月01日后创建的数据同步任务,支持同步DDL操作。

    重要
  • 源自建PostgreSQL数据库账号为高权限账号,且小版本大于或等于20210228时,同步任务支持如下DDL:

    • CREATE TABLE、DROP TABLE

    • ALTER TABLE(包括RENAME TABLE、ADD COLUMN、ADD COLUMN DEFAULT、ALTER COLUMN TYPE、DROP COLUMN、ADD CONSTRAINT、ADD CONSTRAINT CHECK、ALTER COLUMN DROP DEFAULT)

    • TRUNCATE TABLE(源库PostgreSQL为PostgreSQL 11及以上版本)

    • CREATE INDEX ON TABLE

    重要
    • 不支持同步DDL中包含的附加信息,如CASCADE或RESTRICT等。

    • 不支持同步使用SET session_replication_role = replica命令的会话中的DDL。

    • 不支持同步通过调用FUNCTION等方式执行的DDL。

    • 若源库单次提交的多条SQL中同时包含DML和DDL,则该DDL不会被同步。

    • 若源库单次提交的多条SQL中包含非同步对象的DDL,则该DDL不会被同步。