如何导出Redis实例数据?
- 主备或集群实例:
主备和集群实例支持备份功能,可以执行以下操作将数据导出:
a. 进入缓存管理页面,切换到“备份与恢复”页签,查看实例的备份记录。
b. 如没有记录,则手动执行备份动作,执行完后,单击“下载”,根据提示完成数据的下载操作。
说明如果您的实例创建时间非常早,由于实例版本没有升级而无法兼容备份恢复功能,请联系技术支持将缓存实例升级到最新版本,升级后就可以支持备份恢复功能。
-
单机实例
单机实例不支持备份功能,用户可以通过Redis-cli客户端导出rdb文件,但是使用Redis-cli导出rdb文件依赖SYNC命名。- 放通了SYNC命令的单机实例(例如Redis3.0单机实例,未禁用SYNC命令),可以通过执行以下命令,将单机实例上的数据导出:
redis-cli -h {source_redis_address} -p 6379 [-a password] --rdb {output.rdb}
- 禁用了SYNC命令的单机实例(例如Redis 4.0和Redis5.0单机实例,禁用了SYNC命令),建议将单机实例的数据迁移到主备实例,然后使用主备实例的备份功能。
是否支持控制台导出RDB格式的Redis备份文件?
- Redis 3.0实例
Redis 3.0是通过AOF文件持久化的,控制台仅支持备份和下载AOF文件,RDB格式文件可以通过Redis-cli导出:
redis-cli -h {redis_address} -p 6379 [-a password ] --rdb {output.rdb}
- Redis 4.0/5.0/6.0实例
Redis4.0/5.0/6.0实例支持选择AOF和RDB格式进行持久化,支持在控制台备份和下载AOF和RDB文件。
Redis在线数据迁移是迁移整个实例数据么?
如果是单机和主备实例之间进行迁移,是迁移实例所有的数据,不管存在哪个DB都会进行迁移,且数据所在的DB序号不会变;
如果是集群实例,由于集群实例只有一个DB0节点,会迁移DB0上所有槽内的数据。
DCS支持数据持久化吗?开启持久化有什么影响?
是否支持持久化
- 对于Redis类型的缓存实例:
单机:不支持持久化。
主备、读写分离和集群(单副本集群除外):支持持久化。
DCS实例支持的持久化方式
- DCS实例默认仅支持AOF的方式进行持久化,同时支持客户自行开关数据持久化配置。创建的实例(单机或单副本集群除外)默认开启AOF持久化。
- DCS实例默认不支持RDB持久化,因此也无法支持客户自行配置save参数。如果需要进行RDB持久化,可以使用主备或者集群实例的备份恢复功能,备份恢复时,Redis 4.0及以上实例,可以支持选择生成RDB持久化文件并且自动转储到OBS中。
持久化的磁盘是什么类型
Redis 4.0及以上版本的实例,持久化的磁盘是SSD类型。
开启/关闭AOF持久化的影响
开启AOF持久化后,由于Redis-Server进程需要在AOF文件中记录对应的操作信息,用来进行数据持久化。开启持久化可能存在的影响:
- 当出现底层计算节点磁盘硬件故障或者IO故障时,可能会造成时延冲高或者主备倒换等情况发生。
- Redis-Server进程会定期进行AOF重写操作,重写期间可能会造成短暂的时延冲高,AOF重写规则请参考AOF文件在什么情况下会被重写。
如果在缓存场景下使用DCS实例进行应用加速,建议可以关闭持久化参数以获得更高的性能和稳定性。需根据实际业务慎重操作,关闭持久化后在极端故障场景(例如主备节点同时故障等)下可能出现缓存数据丢失的问题。
关闭操作:在实例详情的配置参数中将appendonly参数修改为no即可关闭AOF持久化。
AOF文件在什么情况下会被重写
AOF文件重写涉及到以下两个概念。
- 重写时间窗:目前该时间窗为凌晨1:00 - 4:59。
- 磁盘阈值:即磁盘的使用率超过50%,即认为达到阈值。
AOF文件在以下三种情况下会被重写。
- 如果磁盘达到阈值(无论是否处于时间窗内): AOF文件大小 > 内存数据集大小的实例会被重写。
- 如果磁盘未达到阈值且是重写时间窗:AOF文件大小 > 数据集内存 * 1.5的实例会被重写。
- 如果磁盘未达到阈值且是非重写时间窗:AOF文件大小 > 最大内存 * 4.5的实例会被重写。
一个数据迁移能迁移到多个目标实例么?
不能,一个迁移任务只能迁移到一个目标实例。要迁移到多个目标实例需要创建多个迁移任务。
怎么放通SYNC和PSYNC命令?
- DCS云服务内部进行迁移:
- 自建Redis迁移至DCS,默认没有禁用SYNC和PSYNC命令;
- DCS的Redis之间进行迁移,如果是同一帐号相同Region进行在线迁移,在执行迁移时,会自动放通SYNC和PSYNC命令;
- 如果是不同Region或相同Region不同帐号进行的在线迁移,不会自动放通SYNC和PSYNC命令,无法使用控制台的在线迁移。推荐使用备份文件导入方式迁移。
- 其他云厂商迁移到DCS云服务:
- 一般云厂商都是禁用了SYNC和PSYNC命令,如果使用DCS控制台的在线迁移功能,需要联系源端的云厂商运维人员放通此命令。离线迁移,推荐使用备份文件导入方式。
- 如果不需要增量迁移,可以参考使用Redis-shake工具在线全量迁移其他云厂商Redis进行全量迁移,该方式不依赖于SYNC和PSYNC。
创建迁移任务失败的原因?
创建迁移任务失败的可能原因:
- 底层资源不足。
- 迁移机ECS规格不足。
- 迁移之前创建的目标redis内存小于源redis。
迁移或导入备份数据时,相同的Key会被覆盖吗?
在迁移或导入备份数据时,源端与目标端重复的数据会被覆盖;源端没有,目标端有的数据会保留。
因此,如果在迁移后目标端与源端数据不一致,可能是目标端在迁移前有未清除的数据。
使用Rump在线迁移
背景说明
Rump是一款开源的Redis数据在线迁移工具,支持在同一个实例的不同数据库之间互相迁移,以及不同实例的数据库之间迁移。
迁移原理
Rump使用SCAN来获取keys,用DUMP/RESTORE来get/set值。
SCAN是一个时间复杂度O(1) 的命令,可以快速获得所有的key。DUMP/RESTORE使读/写值独立于关键工作。
以下是Rump的主要特性:
- 通过SCAN非阻塞的获取key,避免KEYS命令造成Redis服务阻塞。
- 支持所有数据类型的迁移。
- 把SCAN和DUMP/RESTORE操作放在同一个管道中,利用pipeline提升数据迁移过程中的网络效率。
- 不使用任何临时文件,不占用磁盘空间。
- 使用带缓冲区的channels,提升源服务器的性能。
说明1. Rump工具不支持迁移到DCS集群实例。请改用其他工具,如redis-port或Redis-cli。
2. Redis实例的密码不能包含#@:等特殊字符,避免迁移命令解析出错。
建议停业务迁移。迁移过程中如果不断写入新的数据,可能会丢失少量Key。
步骤1:安装Rump
- 下载Rump的release版本。
以64位Linux操作系统为例,执行以下命令:
wget https://github.com/stickermule/rump/releases/download/0.0.3/rump-0.0.3-linux-amd64;
- 解压缩后,添加可执行权限。
mv rump-0.0.3-linux-amd64 rump;
chmod +x rump;
步骤2:迁移数据
rump -from { source_redis_address } -to { target_redis_address }
参数/选项说明:
- {source_redis_address}
源Redis实例地址,格式为:redis://[user:password@]host:port/db,中括号部分为可选项,实例设置了密码访问时需要填写密码,格式遵循RFC 3986规范。注意用户名可为空,但冒号不能省略,例如redis://:mypassword@192.168.0.45:6379/1。
db为数据库编号,不传则默认为0。
- { target_redis_address }
目标Redis实例地址,格式与from相同。
以下示例表示将本地Redis数据库的第0个DB的数据迁移到192.168.0.153这台Redis数据库中,其中密码以*替代显示。
[root@ecs ~]# ./rump -from redis://127.0.0.1:6379/0 -to redis://:******@192.168.0.153:6379/0
.Sync done.
[root@ecs ~]#
不同类型的操作系统间进行数据传递和操作,需要注意什么?
建议将数据文件格式转换后再执行导入。
windows系统转换成类unix系统的文件格式:
dos2unix {filename}
类unix系统转换成windows系统的文件格式:
unix2dos {filename}
源Redis使用了多DB,能否迁移数据到集群实例?
DCS单机、读写分离和主备实例支持256个库,编号0-255。
- 若目的实例为Cluster集群实例。Cluster集群实例只有1个库。
两个解决思路:
a. 源Redis的不同DB合到同一个数据库。
b. 申请多个DCS缓存实例。
迁移后实例连接地址和数据库编号有变化,业务注意改造和适配。
- 若目的实例为Proxy集群。
Proxy集群默认不开启多DB,仅有一个DB0,请参考开启多DB操作开启Proxy集群多DB设置。再进行迁移。
只想迁移部分数据时应该怎么处理?
控制台在线迁移功能,不支持迁移指定数据库。如果需要单独迁移Redis中的 指定数据库, 可以使用redis-shake导出或者导入指定的数据库。
Redis-shake的安装和使用可以参考使用Redis-Shake工具迁移自建Redis Cluster集群和Redis-shake配置说明。
如果单独迁移 指定数据 ,建议自行开发脚本,获取指定的key及数据,然后导入DCS缓存实例中。
源Redis迁移到集群实例中有哪些限制和注意事项?
- Proxy版集群实例
使用方式与单机、主备实例类似,但是默认只有1个DB,不支持select命令。数据文件批量导入时,遇到select命令会返回错误提示并忽略,同时继续将剩余数据导入。
举例:
源Redis在数据库编号0和2中有数据,生成的AOF或RDB文件包含了这两个库。
在导入到Proxy集群实例时会忽略“select 2”的命令,然后继续导入源数据库2中的数据到DB0中。
用户需要注意以下:
源Redis中不同数据库包含了相同的key,则导入时,编号靠前的数据库的key的value会被靠后的数据库中的key覆盖。
源Redis使用了多个数据库,数据迁移到DCS集群实例后,都存储在同一数据库中,不支持select命令。业务需要做适配。
- Cluster版集群实例
Cluster版集群除了只有1个DB外,导入方式与其他类型的Redis实例也有差异。Cluster集群的数据,必须由客户端分别连接各分片节点,将数据分别导入。各分片节点的IP地址查询命令:
redis-cli -h {Redis Cluster IP} -p 6379 -a {password} cluster nodes
返回的节点地址清单中,标记为master的节点IP地址即为Cluster集群的分片节点地址。
在线迁移需要注意哪些?
- 网络
在线迁移首先需要打通网络,迁移任务必须和源Redis、DCS缓存实例二者网络互通。
- 工具
在线迁移工具,推荐使用DCS控制台的在线迁移功能。
- 数据完整性
如果选择中断业务,则迁移完成后检查数据量和关键key。
如果选择不中断业务,则用户需要考虑增量数据的迁移。
- 迁移过程源端扩容影响迁移结果
在线迁移期间源端扩容操作会影响迁移,有可能导致迁移失败,也有可能会影响客户的数据,客户如果在迁移期间源端实例的内存不够用需要扩容,建议先中断迁移任务,然后再扩容。
- 迁移时间
迁移操作建议在业务低峰期进行。
- 版本限制
低版本可以到高版本,高版本也可以到低版本,不同版本,在迁移时需要分析业务系统使用到的缓存命令在目的端实例是否兼容。
- 多db限制
如果目标端与源端均使用DCS的Proxy集群实例,请注意二者的multi-db参数需要配置一致,否则会导致迁移失败。
在线迁移能否做到完全不中断业务?
可以使用应用双写的方式,即在迁移过程中业务数据继续从源Redis中正常读取,同时将数据的增删改操作在DCS的Redis实例中执行一遍。
保持以上状态运行一段时间后(等待较多的旧数据过期删除),把系统的缓存数据库正式切到DCS。如涉及业务系统迁移云服务,需要在缓存数据库切换前完成业务系统的部署。
不推荐使用这种方式。原因如下:
- 网络无法保证稳定快速,如果源Redis实例不在DCS,则需要使用公网访问DCS,效率不高。
- 同时写2份数据,需要用户自行修改代码实现。
- 源Redis实例的数据逐出策略各有差异,迁移耗时可能较长,数据完整性保障难度大。
在线迁移实例源端报“Disconnecting timedout slave”和“overcoming of output buffer limits”
当进行在线迁移时可能会出现如下报错:
- 源端报“ Disconnecting timedout slave ”,如下图:
解决方法:建议将源端Redis实例的repl-timeout参数值配置为300秒。
- 源端报“ overcoming of output buffer limits ”,如下图:
解决方法:建议将源端Redis实例的client-output-buffer-limit参数值配置为实例最大内存的20%。
使用Rump工具迁移数据,命令执行后无报错,但Redis容量无变化
Rump工具的具体使用,请参考数据迁移指南。
可能原因:
- Rump工具不支持迁移到集群实例。
- Rump命令参数有误。
DCS实例是否兼容低版本Redis迁移到高版本
支持,目前Redis高版本是支持兼容低版本的。
源端是DCS Redis,自建Redis,或者其他云厂商Redis的低版本或相同版本实例,都可以迁移到DCS的目标端实例。