本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
您可以通过调用DTS的相关接口,为Redis企业版实例配置单向或双向数据同步。本文介绍相关注意事项及示例代码。
前提条件
源和目标实例为Tair(企业版)实例(5.0版本)。
单向同步时,不支持源实例为容量存储型;双向同步时,不支持源和目标实例为容量存储型。
源云数据库Tair(兼容Redis)为企业版(持久内存型)时,需要用户开启appendonly参数。
架构类型不限制,即支持集群版、标准版和读写分离版。
注意事项
双向数据同步时,正向数据同步作业会执行 全量数据初始化 和 增量数据同步 ,反向数据同步作业仅执行增量数据同步。
警告为保障数据一致性,双向数据同步作业运行期间,请勿在两端数据库同时对同一个key执行修改或写入操作。
DTS在执行全量数据初始化时将占用源库和目标库一定的资源,可能会导致数据库服务器负载上升。如果数据库业务量较大或服务器规格较低,可能会加重数据库压力,甚至导致数据库服务不可用。建议您在执行数据迁移前谨慎评估,在业务低峰期执行数据同步。
请勿在源实例中执行
FLUSHDB
和FLUSHALL
命令,否则将导致源和目标的数据不一致。若目标数据库内存不足,触发数据逐出时,由于云数据库 Tair(兼容 Redis)的默认数据逐出策略(maxmemory-policy)为volatile-lru,会导致目标库与源库数据不一致的情况,但不会影响任务的正常运行。
为避免该情况发生,建议将目标库的数据逐出策略设置为noeviction,当目标库内存不足时,数据会写入失败,同时任务也会失败,但目标库不会因为数据逐出而丢失数据。
说明关于数据逐出策略详情,请参见Redis数据逐出策略介绍。
如果源库中的某些Key使用了过期(expire)策略,由于可能存在Key已过期但未被及时删除的情况,所以在目标库中查看到的Key数量(例如通过info命令查看)会比源库的Key数量少。
说明源和目标库中,未设置过期策略或未过期的Key数量是一致的。
如果目标Redis实例没有开通直连访问,DTS将采用代理转发模式将数据写入目标实例。
说明关于直连访问的开通方法,请参见开通直连访问。
同步期间,如源Redis实例发生扩缩容(如增加或者减少分片)、规格变配(如扩大内存),则您需重新配置任务。且为保障数据一致性,在重新配置任务前,建议先清空已同步至目标Redis的数据。
同步期间,如源Redis实例的连接地址变化(如迁移可用区、经典网络切换专有网络),则您需要重新配置任务。
源库单机版Redis同步到目标库集群版Redis的操作限制:由于集群cluster只允许单个命令操作单个slot,若在源库执行多Key操作时,Key不在同一个slot或涉及多个slot,则会出现以下报错:
CROSSSLOT Keys in request don't hash to the same slot
建议在DTS同步过程中仅执行单Key操作,以免导致链路中断。
若目标实例的架构类型为集群版且某一个分片达到了内存上限,或目标实例的存储空间不足时,DTS任务会因内存溢出(Out of Memory)而失败。
若源或目标实例已开启透明数据加密TDE功能,则暂不支持通过DTS同步数据。
若源实例为自建Redis,则Slave和Master之间的复制超时时间参数repl-timeout建议使用
config set repl-timeout 600
命令设置为600秒。若源数据库数据量比较大,可以适当增大repl-timeout参数的值。双向同步实例包含正向和反向同步任务,在配置或重置双向同步实例时,若其中一个任务的目标对象是另一个任务待同步的对象:
仅允许其中一个任务同步全量和增量数据,另一个任务仅支持同步增量数据。
当前任务的源数据仅支持同步到当前任务的目标端,同步过来的数据不会作为另一个任务的源数据继续同步。
费用说明
同步类型 | 链路配置费用 |
库表结构同步和全量数据同步 | 不收费。 |
增量数据同步 | 收费,详情请参见计费概述。 |
功能限制
不支持级联单向同步,相关介绍请参见数据同步拓扑介绍。
支持的同步命令
APPEND
BITOP、BLPOP、BRPOP、BRPOPLPUSH
DECR、DECRBY、DEL
EVAL、EVALSHA、EXEC、EXPIRE、EXPIREAT
GEOADD、GETSET
HDEL、HINCRBY、HINCRBYFLOAT、HMSET、HSET、HSETNX
INCR、INCRBY、INCRBYFLOAT
LINSERT、LPOP、LPUSH、LPUSHX、LREM、LSET、LTRIM
MOVE、MSET、MSETNX、MULTI
PERSIST、PEXPIRE、PEXPIREAT、PFADD、PFMERGE、PSETEX
RENAME、RENAMENX、RPOP、RPOPLPUSH、RPUSH、RPUSHX
SADD、SDIFFSTORE、SELECT、SET、SETBIT、SETEX、SETNX、SETRANGE、SINTERSTORE、SMOVE、SPOP、SREM、SUNIONSTORE
UNLINK、ZADD、ZINCRBY、ZINTERSTORE、ZREM、ZREMRANGEBYLEX、ZUNIONSTORE、ZREMRANGEBYRANK、ZREMRANGEBYSCORE
SWAPDB(当源或目标实例的架构为集群版时不支持)
不支持同步PUBLISH命令。
对于通过EVAL或者EVALSHA调用Lua脚本,在增量数据同步时,由于目标端在执行脚本时不会明确返回执行结果,DTS无法确保该类型脚本能够执行成功。
对于List,由于DTS在调用sync或psync进行重传时,不会对目标端已有的数据进行清空,可能导致出现重复数据。
准备工作
为避免主账号泄露AccessKey带来的安全风险,建议您创建RAM用户,授予RAM用户访问DTS资源的权限,再使用RAM用户的AccessKey来调用SDK。详情请参见账号访问控制。
创建数据同步作业
登录OpenAPI门户。
在输入参数中根据实际情况填写参数。
参数
说明
传入值
SourceRegion
源数据库实例所属地域的ID。
请根据实际情况填写。
DestRegion
目标数据库实例所属地域的ID。
Topology
同步拓扑,取值为:
oneway(默认):单向同步。
bidirectional:双向同步。
SynchronizationJobClass
数据同步实例的规格,取值为:micro、small、medium、large。
PayType
付费类型,取值为:
PrePaid:预付费。
PostPaid(默认):按量付费。
SourceEndpoint.InstanceType
源数据库实例的类型。
填入Redis。
DestinationEndpoint.InstanceType
目标数据库实例的类型。
填入Redis。
说明更多参数说明信息,请参见购买同步实例。
单击页面下方的发起调用按钮。
在右侧调用结果页签中,查看调用结果和返回信息。
重要若调用失败,您需要根据返回结果中Message的提示信息,修复后重新调用,直至调用成功。
可选:获取SDK示例代码。
单击SDK示例页签。
选择SDK版本和编程语言。
单击代码区域右上角的按钮,复制代码。
配置数据同步作业(单向)
本示例中,源实例的数据库账号需具备读权限,目标实例的数据库账号需具备读写权限。
配置单向数据同步时,您也可以将自建Redis数据库或云数据库Tair(兼容Redis)社区版实例作为源库或目标库,配置方法与本案例类似(需调整对应的请求参数,例如MigrationReserved
)。
配置数据同步作业(双向)
本示例中,用于数据同步的数据库账号需具备读写权限。
配置正向数据同步作业,详情请参见配置数据同步作业(单向)。
等待正向数据同步作业初始化完成(即转变为同步中状态)。
说明您可以通过控制台或调用查询一个数据同步实例状态接口查看数据同步作业的状态信息。
配置反向数据同步作业。
相关文档
通过全量同步性能和增量同步性能展示功能,您可以了解数据同步作业的运行状态,为您管理数据同步作业提供参考依据。
在数据同步过程中,您可以新增或移除同步对象。
您可以对重要的监控指标设置报警规则,让您及时了解同步作业的状态。