1

【Redis技术探索】「数据迁移实战」手把手教你如何实现在线 + 离线模式进行迁移Redis...

 1 year ago
source link: https://blog.51cto.com/alex4dream/5996469
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

与在线迁移相比,离线迁移适宜于源实例与目标实例的网络无法连通的场景,或者源端实例部署在其他云厂商Redis服务中,无法实现在线迁移。

存在的问题

  • 由于生产环境的各种原因,我们需要对现有服务器进行迁移,包括线上正在运行的redis集群环境 如何去做?
  • 涉及到数据源变动,原有数据如何平滑迁移到新实例,从而可以实现无缝迁移?

save/bgsave导出RDB+Redis-Shake进行迁移

基于redis自身的RDB/AOF 备份机制,执行save\bgsave触发数据持久化 RDB文件,拷贝redis备份文件(dump.rdb)到目标机器,重启目标实例重新load RDB 文件。

bgsave

阻塞客户端

需要fork子线程,消耗内存

导入原有Redis实例的数据dump.rdb

将上一步导出dump.rdb文件放到目标Redis服务所在的服务器的路径为:/root/dump.rdb

迁移到目标实例为单节点服务

需要使用restore.toml文件,进行编辑,从而进行执行执行文件进行迁移重放数据,如下图所示。

【Redis技术探索】「数据迁移实战」手把手教你如何实现在线 + 离线模式进行迁移Redis数据实战指南(离线同步数据)_Redis
修改 restore.toml 为:
type = "restore"

[source]
rdb_file_path = "/root/dump.rdb"

[target]
type = "standalone"
address = "127.0.0.1:6379"
password = "r-aaaaa:xxxxx"
运行 redis-shake:
redis-shake restore.toml
迁移到目标实例为集群实例服务

修改 restore.toml 为:

type = "restore"
[source]
rdb_file_path = "/root/dump.rdb"

[target]
type = "cluster"
address = "192.168.0.1:6379" # 这里写集群中的任意一个节点的地址即可
password = "r-ccccc:xxxxx"

运行 redis-shake:

redis-shake restore.toml

基于redis-dump导入导出 json备份

redis-dump基于JSON 备份还原Redis的数据:​ ​https://github.com/delano/redis-dump​

下载和运行redis-dump
git clone https://github.com/delano/redis-dump.git
$ cd redis-dump
$ gem install redis
$ gem install uri-redis
$ gem install yajl-ruby
$ gem install drydock
$ ruby -r rubygems bin/redis-dump
redis-dump –u 127.0.0.1:6379 > dump.json
导出指定数据库数据
redis-dump -u 127.0.0.1:6379 -d 15 > dump.json
如果redis设有密码
redis-dump –u :[email protected]:6379 > dump.json
dump.json redis-load
指定redis密码
dump.json redis-load -u :[email protected]:6379

数据迁移之后进行数据对比

数据迁移后,我们通常需要对比源实例和目的实例中的数据是否一致。如果有不一致的数据,我们需要把它们找出来,从目的实例中剔除,或者是再次迁移这些不一致的数据。这里,我就要再给你介绍一个数据一致性比对的工具了,就是阿里云团队开发的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的应用实战和实现原理。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK