若您希望迁移部署在本地、ECS或其他云上的Redis数据库至云数据库 Tair(兼容 Redis),且不影响业务正常运行,您可以使用数据传输服务DTS。DTS可以在不中断数据库服务的同时,将数据全量或者增量迁移至云数据库 Tair(兼容 Redis)。该方案相比使用AOF方式迁移,具有更高的性能和安全性。
功能概述
全量迁移
DTS将源库的存量数据全部迁移到目标库中,全量迁移不收费。
增量迁移
在全量迁移的基础上,DTS将源库的增量更新实时地同步到目标库中。若需执行增量迁移,请确保可在源库中正常执行
PSYNC
或SYNC
命令,否则只能进行全量迁移。增量迁移会根据使用时长产生费用(与迁移的数据量无关),更多信息请参见计费项。说明为保障正常执行增量迁移,建议您关闭源库复制输出缓冲区的限制,设置方法:连接源库,执行
CONFIG SET client-output-buffer-limit 'slave 0 0 0'
。
前提条件
已创建云数据库 Tair(兼容 Redis)实例,且该实例规格需大于自建Redis已使用的内存。更多信息请参见创建实例。
建议目标数据库总内存比源库的内存占用大10%以上。若因为目标数据库内存不足,可能会导致数据不一致、任务失败等问题,您需要清空目标数据库并重新配置任务。
注意事项
迁移期间,请勿对源库和目标库进行扩缩容、变配规格、变更连接地址等操作,否则会导致任务失败,您需重新配置任务。同时,执行迁移操作会占用源库和目标库资源,建议您在业务低峰期执行。
操作步骤
进入迁移任务的列表页面。
登录DMS数据管理服务。
在顶部菜单栏中,单击集成与开发。
在左侧导航栏,选择 。
单击创建任务。
配置源库及目标库信息,并单击页面下方的测试连接以进行下一步。
类别
配置
说明
无
任务名称
DTS会自动生成一个任务名称,建议配置具有业务意义的名称(无唯一性要求),便于后续识别。
源库信息
选择DMS数据库实例
若您已将源库录入至DMS中,可在此选择,选择后无需填写下方的源库信息。若未录入,请忽略该选项。
数据库类型
选择Tair/Redis。
接入方式
根据源库的部署位置进行选择,若实例在本地IDC或其他云,请选择公网IP。
本示例选择ECS自建数据库。
实例地区
选择ECS实例所属的地域,若实例在本地IDC或其他云,请选择就近源库的地域。
是否跨阿里云账号
本示例为同一阿里云账号间的迁移,选择不跨账号。
ECS实例ID
选择源库所在的ECS实例ID。
说明若源库为集群架构时,选择任意节点的Master所在的ECS实例ID。
实例模式
根据源库的架构选择:
单机版:标准架构(主从)。
集群版:集群架构。若源库为集群架构时,在端口参数中填入任一Master节点的端口号。
端口
填入源Redis数据库的端口,默认为6379。
认证方式
请根据实际情况选择密码登录或免密登录。
说明若自建Redis数据库没有设置密码,您可以选择免密登录。
数据库密码
填入用于连接源Redis数据库的密码。
说明非必填项,若没有设置密码可以不填。
若使用自定义账号,该账号需要具有读权限,账号、密码的格式为<user>:<password>。例如,Redis实例自定义的账号为admin,密码为Rp829dlwa,则此处填入的数据库密码为admin:Rp829dlwa。
连接方式
请根据实际情况选择非加密连接或SSL安全连接。
说明若自建Redis(接入方式不是云实例)且选择了SSL安全连接,您还需要上传CA 证书并填写CA 密钥。
目标库信息
选择DMS数据库实例
若您已将目标库录入至DMS中,可在此选择,选择后无需填写下方的目标库信息。若未录入,请忽略该选项。
数据库类型
将默认选择Tair/Redis。
接入方式
选择云实例。
实例地区
选择目标实例的所属地域。
实例ID
选择目标实例ID。
认证方式
请根据实际情况选择密码登录或免密登录,本示例选择密码登录。
说明若云数据库Tair(兼容Redis)实例没有开启专有网络免密访问功能,请选择密码登录。
数据库密码
填入连接目标数据库的密码。
说明若使用自定义账号,该账号需要具有写权限,账号、密码格式为<user>:<password>。例如,Redis实例自定义的账号为admin,密码为Rp829dlwa,则此处填入的数据库密码为admin:Rp829dlwa。
连接方式
请根据实际情况选择非加密连接或SSL安全连接。
配置任务对象,并单击页面下方的下一步高级配置。
配置
说明
迁移类型
根据实际情况选择迁移类型。
全量迁移 + 增量迁移(默认):使用Redis原生同步逻辑,以内存快照方式将数据写入到目标端,实现源库不停机的迁移。
若对源库没有SYNC或PSYNC权限,请选择全量迁移。
全量迁移:使用SCAN命令遍历整个源端,将遍历到的数据写入到目标端。为保障数据一致性,请勿在迁移期间对源实例写入新的数据。
目标已存在表的处理模式
预检查并报错拦截(默认):检查目标库中是否存在数据(Key)。
若存在,则在预检查阶段提示错误,且不会启动迁移任务;若不存在,则通过。
忽略报错并继续执行:跳过目标库对象数据存在性检查项,若目标库中已存在名称相同的Key,则会被覆盖。
源库对象与已选择对象
在源库对象框中勾选待迁移对象,然后单击将其移动至已选择对象框。若您需要移除已选择的对象,可以在已选择对象框中单击目标对象,然后单击将其移动至源库对象。
说明迁移对象的选择粒度为库(DB 0 ~ DB 255)。
进行高级配置,并单击页面下方的下一步数据校验。
通常情况下,该配置项保持默认即可,更多信息请参见附录:高级设置说明。
进行校验配置,并单击页面下方的下一步保存任务并预检查。
通常情况下,该配置项保持默认即可,更多信息请参见在DTS同步或迁移实例中配置数据校验。
进行预检查,完成后单击下一步购买。
若预检查产生警告或失败项,请逐条确认。您可以单击查看详情,根据提示进行修复;您也可以单击点击确认告警详情,忽略检查项,但可能会产生数据不一致等问题,给业务带来风险,更多信息请参见预检查问题。完成上述操作后,请重新进行预检查。
在购买页配置信息,并单击购买并启动。
(可选)选择DTS迁移链路所属的资源组配置,默认为default resource group。
(可选)选择DTS迁移链路的规格,规格越高,迁移速率越大,费用也越高,默认为large,更多信息请参见数据迁移链路规格说明。
阅读并勾选服务条款。
购买后,迁移任务正式开始,您可在数据迁移界面查看具体进度。
后续步骤
若您使用了增量迁移,请您在完成迁移后,在控制台手动结束或释放该任务。
您可以进行数据校验,更多信息请参见校验迁移后的Redis数据。
相关文档
若您的数据库无需在线迁移,您可以通过轻量级工具redis-cli,导入AOF文件进行数据迁移,更多信息请参见使用AOF文件进行迁移。
常见问题
为什么测试连接失败?
请排查以下几方面:
账号密码错误,Redis的密码格式为
user:password
,更多信息请参见实例的登录方式。若源库为IDC自建数据库或其他云数据库,可能存在网络防火墙,请您手动添加对应地区DTS服务的IP地址,以允许来自DTS服务器的访问,更多信息请参见添加DTS服务器的IP地址段。
为什么会运行失败?
迁移期间,若对源库和目标库进行扩缩容、变配规格、变更连接地址等操作,会导致任务失败,您需重新配置任务。
若目标实例内存空间不足,或目标实例为集群架构且某分片达到了内存上限,DTS任务会因内存溢出(Out of Memory)而失败。
若目标实例已开启透明数据加密TDE功能,则暂不支持通过DTS迁移数据。
为什么数据量不一致?
若源库中的某些Key使用了过期(Expire)策略,由于可能存在Key已过期但未被及时删除的情况,所以目标库中的Key数量可能会比源库少。
对于List列表,由于DTS在调用PSYNC或SYNC传输数据时,不会对目标端已有的数据执行FLUSH操作,所以可能出现重复的数据。
若在执行全量迁移过程中网络中断,DTS可能会执行多次全量迁移(会自动覆盖同名Key),若在此时对源库执行删除操作,则该命令不会被同步到目标库。可能会造成目标库大于源库的情况。
为什么会检查Redis逐出策略是否为noeviction?
由于云数据库 Tair(兼容 Redis)的默认数据逐出策略(maxmemory-policy)为volatile-lru,若目标数据库内存不足,触发数据逐出会导致目标库与源库数据不一致的情况,但不会影响任务的正常运行。为避免该情况发生,建议将目标库的数据逐出策略设置为noeviction,当目标库内存不足时,数据会写入失败,同时任务也会失败,但目标库不会因为数据逐出而丢失数据。关于数据逐出策略详情,请参见Redis数据逐出策略介绍。
源库中为什么会有DTS_REDIS_TIMESTAMP_HEARTBEAT?
为保障迁移、同步质量,DTS会在源库中插入一个前缀为DTS_REDIS_TIMESTAMP_HEARTBEAT的Key用于记录更新时间点,若源库为集群架构,DTS会在各个shard上均插入该Key。DTS在执行任务过程中会过滤该Key,该Key会在任务结束时自动过期。
增量迁移支持哪些命令?
支持如下命令:
APPEND
BITOP、BLPOP、BRPOP、BRPOPLPUSH
DECR、DECRBY、DEL
EVAL、EVALSHA、EXEC、EXPIRE、EXPIREAT
FLUSHALL、FLUSHDB
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、PUBLISH
RENAME、RENAMENX、RESTORE、RPOP、RPOPLPUSH、RPUSH、RPUSHX
SADD、SDIFFSTORE、SELECT、SET、SETBIT、SETEX、SETNX、SETRANGE、SINTERSTORE、SMOVE、SPOP、SREM、SUNIONSTORE
ZADD、ZINCRBY、ZINTERSTORE、ZREM、ZREMRANGEBYLEX、ZUNIONSTORE、ZREMRANGEBYRANK、ZREMRANGEBYSCORE
XADD、XCLAIM、XDEL、XAUTOCLAIM、XGROUP CREATECONSUMER、XTRIM
对于通过EVAL或EVALSHA调用的Lua脚本,由于目标端在执行脚本时不会明确返回执行结果,DTS无法确认该类型脚本是否执行成功。
附录:高级设置说明
配置 | 说明 |
源库、目标库无法连接后的重试时间 | 在迁移任务连接失败时,DTS持续地进行重试,默认重试时间为720分钟,取值范围为10~1440分钟。若DTS在重试时间内恢复连接,迁移任务将自动恢复。否则,迁移任务将失败。建议您根据业务需求自定义重试时间,建议设置30分钟以上。 重试期间,DTS将正常计费。 |
源库、目标库出现其他问题后的重试时间 | 在迁移期间,若源库或目标库出现非连接性的其他问题,DTS会报错并持续地进行重试,默认重试时间为10分钟,取值范围为10~1440分钟。若DTS在重试时间内成功执行相关操作,迁移任务将自动恢复。否则,迁移任务将会失败。建议设置10分钟以上。 |
是否限制增量迁移速率 | 增量数据写入时,可能会导致目标端的负载上升。您可以根据实际情况,选择是否对增量迁移进行限速设置(设置每秒增量迁移的行数和数据量),以缓解目标端的压力。默认为否。 |
环境标签 | 您可以根据实际情况,选择用于标识实例的环境标签。 |
延长目标库key的过期时间 | 在目标库中,对已设置过期时间的Key,延长过期时间,默认为1800s。若迁移时Key已过期,则不会被迁移至目标库。 |
使用Slave节点 | 当源自建Redis的实例模式为集群版时,您可以选择是否从Slave节点读取数据,默认为否,即从Master读取数据。 |
配置ETL功能 | 选择是否配置ETL功能。关于ETL的更多信息,请参见什么是ETL。
|
监控报警 | 是否设置告警,当同步失败或延迟超过阈值后,将通知告警联系人。
|