数据传输服务DTS(Data Transmission Service)支持两个PostgreSQL数据库之间(比如RDS PostgreSQL、自建PostgreSQL)的双向数据实时同步,RDS PostgreSQL实例间的双向同步,适用于异地多活(单元化)、数据异地容灾等多种应用场景。本文以RDS PostgreSQL实例为例,介绍双向数据同步的配置步骤,其他数据源的配置流程与本案例类似。
前提条件
- 已创建源和目标RDS PostgreSQL实例,创建方式,请参见创建RDS PostgreSQL实例。
- 已设置源和目标RDS PostgreSQL实例的参数wal_level = logical。设置方式,请参见设置实例参数。
注意事项
类型 | 说明 |
---|---|
源和目标库的限制 |
|
其他限制 |
|
特殊情况 | 当源实例为RDS PostgreSQL时
同步期间,请勿修改RDS PostgreSQL的连接地址和可用区,否则会导致同步失败。 |
费用说明
同步类型 | 链路配置费用 |
---|---|
库表结构同步和全量数据同步 | 不收费。 |
增量数据同步 | 收费,详情请参见计费概述。 |
支持的双向同步架构
目前DTS仅支持两个PostgreSQL数据库之间的双向同步,暂不支持多个PostgreSQL数据库之间的双向同步。
支持的冲突检测
为保障同步数据的一致性,您需要确保同一个主键、业务主键或唯一键的记录只在双向同步的一个节点进行更新。如果同时更新则会按照您在数据同步作业中配置的冲突修复策略进行响应。
- INSERT导致的唯一性冲突
同步INSERT语句时违背了唯一性约束,例如双向同步的两个节点同时或者在极为接近的时间INSERT某个主键值相同的记录,那么同步到对端时,会因为已经存在相同主键值的记录,导致Insert同步失败。
- UPDATE更新的记录不完全匹配
- UPDATE要更新的记录在同步目标实例中不存在时,DTS会自动转化为INSERT,此时可能会出现唯一键的唯一性冲突。
- UPDATE要更新的记录出现主键或唯一键冲突。
- DELETE对应的记录不存在
DELETE要删除的记录在同步的目标实例中不存在。出现这种冲突时,不论配置何种冲突修复策略,DTS都会自动忽略DELETE操作。
- 由于数据同步两端的系统时间可能存在差异、同步存在延时等多种因素,DTS无法完全保证冲突检测机制能够完全防止数据的冲突。在使用双向同步时,您需要在业务层面配合进行相应的改造,保证同一个主键、业务主键或唯一键的记录只在双向同步的某个节点进行更新。
- 对于上述数据同步的冲突,DTS提供了修复策略,您可以在配置双向同步时选择。
支持同步的SQL操作
操作类型 | SQL操作语句 |
---|---|
DML | INSERT、UPDATE、DELETE |
DDL |
|