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

更新时间:
复制 MD 格式

在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_senders和max_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(如下方代码所示),可跳过本步骤。

    # "local" is for Unix domain socket connections only
    local   all             all                                     trust
    # IPv4 local connections:
    host    all             all             0.0.0.0/0               md5
    # IPv6 local connections:
    host    all             all             ::1/128                 trust
    # Allow replication connections from localhost, by a user with the
    # replication privilege.
    local   replication     postgres                                trust
    host    replication     postgres        0.0.0.0/0               md5
  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卡片的安装。

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

    说明

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

  5. 单击安装。

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

    在 数据库名称 下拉框中选择目标数据库,确认 vector 插件显示在已安装列表中,状态为已安装。

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

说明

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

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

    通过DTS控制台进入

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

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

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

    通过DMS控制台进入

    说明

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

    1. 登录DMS数据管理服务。

    2. 在顶部菜单栏中,选择Data + AI > 数据传输(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创建(同步类型未选中库表结构同步),则需确保该表与源库中待同步的表具备相同的主键或非空唯一约束,否则可能会导致目标数据库中出现重复数据。

  • 待同步的数据库名称中间不能包含短划线(-),例如dts-testdata。

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

  • DTS不支持同步源库中的临时表、系统内部的触发器(TRIGGER)、部分函数(关于PROCEDURE与FUNCTION的C语言函数和内部函数);DTS支持同步部分自定义数据(TYPE为COMPOSITE、ENUM或RANGE),支持同步的约束为主键、外键、唯一、CHECK约束。

  • 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权限(例如,通过GRANT <待同步对象的Owner> TO <任务使用的源库账号>命令,使此账号能够以待同步对象的Owner身份执行相关操作)。

    说明

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

  • 由于源库的逻辑订阅本身存在使用限制,在同步实例运行期间,若源库待同步的单条数据在增量变更后超过256 MB,则可能会导致同步实例运行失败且无法恢复,您需要重新配置同步实例。

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

    说明

    在全量同步阶段,DTS将对源库进行查询,这将产生元数据锁,从而可能阻碍源数据库的DDL操作执行。

  • 在同步实例运行期间,若源库进行了大版本升级,将会导致同步实例运行失败并且无法恢复,您需要重新配置同步实例。

  • PostgreSQL 18有生成列(Generated Column)的表不支持同步,如果配置同步,会阻塞该表的DML操作。

其他限制

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

  • 不支持同步TimescaleDB插件表、包含跨Schema继承关系的表与包含基于表达式的唯一索引的表。

  • 通过安装插件创建的Schema不支持同步。在配置任务时,您将无法在控制台获取相关信息。

  • 如果待同步的表中包含SERIAL类型的字段,源库会自动为该字段创建一个Sequence。因此在配置源库对象时,若同步类型选中了库表结构同步,则建议您同时选中Sequence或整Schema同步,否则可能会导致同步实例运行失败。

  • 在如下三个场景中,您需要在源库待同步的表写入数据前,对其执行ALTER TABLE schema.table REPLICA IDENTITY FULL;命令,以保障该表数据同步的一致性。执行该命令期间,建议您不要有锁表操作,否则会导致表锁死。若在预检查中跳过了相关检查,DTS会在该实例初始化时自动化执行该命令。

    • 实例初次运行时。

    • 同步对象的选择粒度为Schema,且在待同步的Schema中创建了新的表或使用RENAME命令重建了待同步的表时。

    • 使用修改同步对象功能时。

    说明
    • 命令中的schema和table需要替换为待同步数据所属的Schema名和表名。

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

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

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

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

    public.dts_pg_class、public.dts_pg_attribute、public.dts_pg_type、public.dts_pg_enum、public.dts_postgres_heartbeat、public.dts_ddl_command、public.dts_args_session、public.aliyun_dts_instance。

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

  • 数据同步期间,DTS会在源库创建前缀为dts_sync_的replication slot用于复制数据。通过该replication slot,DTS可以获取源库15分钟内的增量日志。当数据同步失败或释放同步实例时,DTS会尝试主动清理该replication slot。

    说明
    • 如果您在数据同步期间修改了任务使用的源库账号密码,或者删除了源库中DTS的IP白名单等,则会导致该replication slot无法自动清理。此时,您需要在源库手动清理replication slot,以避免其持续累积占用磁盘空间导致源库不可用。

    • 如果源库发生了主备切换,则您需要登录备库进行手动清理。

    执行 SQL 语句 SELECT * FROM pg_replication_slots; 可查看源库中所有复制槽,在查询结果的 slot_name 列中查找以 dts_sync_ 为前缀且 active 为 true 的记录,即为需要清理的 DTS 复制槽。

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

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

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

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

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

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

    说明

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

  • 在同步分区表时,需将分区子表与父表同时纳入同步对象,否则可能导致该分区表的数据出现不一致情况。

    重要
    • PostgreSQL分区表的父表不直接存储数据,所有数据实际存储于分区子表中。同步任务需同时包含分区父表及其所有分区子表,否则可能会遗漏同步子表的数据,从而导致目标端与源端的数据不一致。

    • 暂不支持同步分布在不同数据库中的分区表和继承表(父子表)。请确保待迁移的分区表及其所有分区、父表及其所有子表均位于同一数据库中。

费用说明

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

增量同步支持的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不会被同步。