【Redis 技术探索】「数据迁移实战」手把手教你如何实现在线 + 离线模式进行迁移 Redis 数据实战指南(离线同步数据)
离线迁移
与在线迁移相比,离线迁移适宜于源实例与目标实例的网络无法连通的场景,或者源端实例部署在其他云厂商 Redis 服务中,无法实现在线迁移。
存在的问题
由于生产环境的各种原因,我们需要对现有服务器进行迁移,包括线上正在运行的 redis 集群环境 如何去做?
涉及到数据源变动,原有数据如何平滑迁移到新实例,从而可以实现无缝迁移?
方案汇总
save/bgsave 导出 RDB+Redis-Shake 进行迁移
基于 redis 自身的 RDB/AOF 备份机制,执行 save\bgsave 触发数据持久化 RDB 文件,拷贝 redis 备份文件(dump.rdb)到目标机器,重启目标实例重新 load RDB 文件。
导入原有 Redis 实例的数据 dump.rdb
将上一步导出 dump.rdb 文件放到目标 Redis 服务所在的服务器的路径为:/root/dump.rdb
迁移到目标实例为单节点服务
需要使用 restore.toml 文件,进行编辑,从而进行执行执行文件进行迁移重放数据,如下图所示。
修改 restore.toml 为:
运行 redis-shake:
迁移到目标实例为集群实例服务
修改 restore.toml 为:
运行 redis-shake:
基于 redis-dump 导入导出 json 备份
redis-dump 基于 JSON 备份还原 Redis 的数据:https://github.com/delano/redis-dump
下载和运行 redis-dump
导出命令
导出指定数据库数据
如果 redis 设有密码
导入命令
指定 redis 密码
数据迁移之后进行数据对比
数据迁移后,我们通常需要对比源实例和目的实例中的数据是否一致。如果有不一致的数据,我们需要把它们找出来,从目的实例中剔除,或者是再次迁移这些不一致的数据。这里,我就要再给你介绍一个数据一致性比对的工具了,就是阿里云团队开发的 Redis-full-check 。
Redis-full-check
Redis-full-check 的工作原理很简单,就是对源实例和目的实例中的数据进行全量比对,从而完成数据校验。不过,为了降低数据校验的比对开销,Redis-full-check 采用了多轮比较的方法。
在第一轮校验时,Redis-full-check 会找出在源实例上的所有 key,然后从源实例和目的实例中把相应的值也都查找出来,进行比对。第一次比对后,Redis-full-check 会把目的实例中和源实例不一致的数据,记录到 sqlite 数据库中。
从第二轮校验开始,Redis-full-check 只比较上一轮结束后记录在数据库中的不一致的数据。
为了避免对实例的正常请求处理造成影响,Redis-full-check 在每一轮比对结束后,会暂停一段时间。随着 Redis-shake 增量同步的进行,源实例和目的实例中的不一致数据也会逐步减少,所以,我们校验比对的轮数不用很多。
在运行 Redis-full-check 命令时,把参数 comparetimes 的值设置为我们想要比对的轮数。等到所有轮数都比对完成后,数据库中记录的数据就是源实例和目的实例最终的差异结果了。
注意:Redis-full-check 提供了三种比对模式,我们可以通过 comparemode 参数进行设置。comparemode 参数有三种取值,含义如下:
KeyOutline ,只对比 key 值是否相等;
ValueOutline ,只对比 value 值的长度是否相等;
FullValue ,对比 key 值、value 长度、value 值是否相等。
在应用 Redis-full-check 时,根据业务对数据一致性程度的要求,选择相应的比对模式。如果一致性要求高,就把 comparemode 参数设置为 FullValue 。
最后至此完成了对应的数据的迁移和离线导入。后面的章节会详细介绍 Redis-full-check 的应用实战和实现原理。
版权声明: 本文为 InfoQ 作者【洛神灬殇】的原创文章。
原文链接:【http://xie.infoq.cn/article/69a9bca47c253fd175eca00af】。文章转载请联系作者。
评论