当前位置:   article > 正文

Redis迁移-RedisShake工具_redis-shake

redis-shake

一、迁移工具安装

        RedisShake有很多版本,本文介绍的是4.x版本的使用,不同的版本在设置和配置文件上略有不同,功能也有所不同。​  拷贝命令:git clone https://github.com/tair-opensource/RedisShake.git

        下载文件之后解压进入目录,执行 sh build.sh 进行编译。或者也可以直接下载编译好的文件,解压就可以使用 。

二、配置文件

        配置文件在RedisShake文件夹的bin/shake.toml文件。主要需要修改数据源[sync_reader]目标数据库[redis_writer],如出现性能问题可以尝试调节管道命令最大数和缓存区大小。迁移中真正的速度受网络,cpu,磁盘等多方面因素影响,如遇到白名单或内网限制,可调整脚本运行的实际虚拟机灵活解决,在生产服务器运行脚本时,应限制cpu占用数,防止性能问题对生产环境造成影响。

  1. #lua脚本内容
  2. function = ""
  3. # 数据源
  4. [sync_reader]
  5. cluster = false # 是否为集群模式
  6. address = "127.0.0.1:6379" # 源redis的地址,ip:port
  7. username = "" # 用户名(如果有)
  8. password = "" # 密码(如果有)
  9. tls = false # 源端是否开启 TLS/SSL
  10. sync_rdb = true # 全量同步
  11. sync_aof = true # 增量同步
  12. # 通过 SCAN 命令遍历源端数据库中的所有 Key,并使用 DUMP 与 RESTORE 命令来读取与写入 Key 的内容。本方案为次选方案,当可以使用 sync_reader 时,请优选 sync_reader。
  13. # [scan_reader]
  14. # cluster = false # 源端是否为集群
  15. # address = "127.0.0.1:6379" # 源端地址, 当源端为集群时,address 为集群中的任意一个节点即可
  16. # username = "" # 用户名(如果有)
  17. # password = "" # 密码(如果有)
  18. # ksn = false # 开启 ksn 参数后 RedisShake 会在 SCAN 之前使用 Redis keyspace notifications 能力来订阅 Key 的变化。当 Key 发生变化时,RedisShake 会使用 DUMP 与 RESTORE 命令来从源端读取 Key 的内容,并写入目标端。
  19. # tls = false # 源端是否开启 TLS/SSL
  20. # dbs = [] # 源端为非集群模式时,支持指定DB库
  21. # 可以使用 rdb_reader 来从 RDB 文件中读取数据,然后写入目标端。常见于从备份文件中恢复数据。
  22. # [rdb_reader]
  23. # filepath = "/tmp/dump.rdb" #绝对路径
  24. # 可以使用 aof_reader 来从 AOF 文件中读取数据,然后写入目标端。常见于从备份文件中恢复数据,还支持数据闪回。
  25. # [aof_reader]
  26. # filepath = "/tmp/.aof" # 绝对路径
  27. # timestamp = 0 # subsecond
  28. # 目标数据库
  29. [redis_writer]
  30. cluster = false # 是否为集群
  31. address = "127.0.0.1:6380"
  32. username = "" # 用户名(如果有)
  33. password = "" # 密码(如果有)
  34. tls = false # 是否开启 TLS/SSL
  35. [advanced]
  36. dir = "data" #工作目录
  37. ncpu = 0 # 可以占用的cpu数,0为占用默认系统提供数
  38. pprof_port = 0 # pprof监控端口
  39. status_port = 0 # status监控端口
  40. # log
  41. log_file = "shake.log"
  42. log_level = "info" # log级别,可为debug
  43. log_interval = 5 # 日志输出时间间隔
  44. # 当遇到目标库键正忙时可以配置这个选项,默认为停止
  45. # panic: 当遇到“目标密钥名称正忙”错误时,redis-shake将停止。
  46. # rewrite: redis-shake将用新值替换键。
  47. # ignore: redis-shake在遇到“目标密钥名称繁忙”错误时会跳过还原密钥。
  48. rdb_restore_command_behavior = "ignore" # panic, rewrite or skip
  49. # redis-shake 使用管道来提高发送性能。
  50. # 此项限制管道中命令的最大数量。
  51. pipeline_count_limit = 1024
  52. # 缓冲区大小配置,此为1g
  53. target_redis_client_max_querybuf_len = 1024_000_000
  54. # 单个字符串被限制为 512 mb.
  55. target_redis_proto_max_bulk_len = 512_000_000
  56. # 如果源是Elasticache或MemoryDB,则可以设置此项
  57. aws_psync = ""
  58. # 示例: aws_psync = "10.0.0.1:6379@nmfu2sl5osync,10.0.0.1:6379@xhma21xfkssync"
  59. [module]
  60. # 出现数据不兼容时可设置此项
  61. target_mbbloom_version = 20603

        启动命令:./redis-shake shake.toml

        注意两个Redis的版本最好相同,否则可能会因为新的特性或者新的编码方式出现不兼容问题。迁移方式分为两种,一种是Sync模式,原理是把目标数据库模拟为数据源的从节点进行数据迁移,迁移分为全量迁移和增量迁移两个阶段,增量迁移为迁移所有数据,增量迁移为在迁移期间,数据源发生的数据修改同步到目标数据库。还有一种是Scan模式,使用scan便利数据库中的所有键,在使用dump和restore来读取和写入键的内容。

        注意:如果是阿里云redis,需要使用有复制权限的账号来操作

三、数据清洗

        数据清洗可以实现把数据源0库的键迁移到目标数据库的1库,或只迁移指定的键,或只迁移指定的库。但是在迁移时,如果是用的是Sync模式,默认都会扫描所有库,所以如果数据量巨大需要一定的时间才会扫描到需要进行迁移的库。这个过程由lua脚本来实现。

从0库迁移到1库:

  1. if DB ~= 0 then
  2. return
  3. end
  4. shake.call(1, ARGV)

 从7库迁移到8库同时过滤test字段:

  1. local prefix = "test"
  2. local prefix_len = #prefix
  3. if DB ~= 7 then
  4. return
  5. else if string.sub(KEYS[1], 1, prefix_len) ~= prefix then
  6. return
  7. end
  8. end
  9. shake.call(8, ARGV)

丢弃源端 db 0 的数据,将其他 db 的数据写入到目标端:

  1. shake.log(DB)
  2. if DB == 0
  3. then
  4. return
  5. end
  6. shake.call(DB, ARGV)

    修改 Key 的前缀:把 test1 修改为 test2:

  1. local prefix_old = "test1"
  2. local prefix_new = "test2"
  3. shake.log("old=" .. table.concat(ARGV, " "))
  4. for i, index in ipairs(KEY_INDEXES) do
  5. local key = ARGV[index]
  6. if string.sub(key, 1, #prefix_old) == prefix_old then
  7. ARGV[index] = prefix_new .. string.sub(key, #prefix_old + 1)
  8. end
  9. end
  10. shake.log("new=" .. table.concat(ARGV, " "))
  11. shake.call(DB, ARGV)

        在lua脚本中还有很多变量可以使用,可以根据自己的需求对数据进行清洗,下面是官方文档的一张表。可以使用的函数有shake.log 和 shake.call

        shake.call(DB, ARGV):返回一个 Redis 命令,RedisShake 会将该命令写入目标端。

        shake.log(msg):打印日志。

        越复杂的lua脚本一定是代表更大的cpu开销,对数据的清洗工作是在本地进行的,如果在部署了redis的服务器上进行数据清洗一定要注意资源的开销,防止对redis造成性能影响。

        最后补充一下配置文件中的lua脚本格式要求,如图所示:

官方中文文档:https://tair-opensource.github.io/RedisShake/

官方仓库地址:https://github.com/tair-opensource/RedisShake?tab=readme-ov-file

3.x版本仓库地址:https://github.com/tair-opensource/RedisShake/tree/v3

2.x版本仓库地址:https://github.com/tair-opensource/RedisShake/tree/v2

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/784543
推荐阅读
相关标签
  

闽ICP备14008679号