1.我的场景
需要把本地的redis数据上传到阿里云服务器上面,服务器上redis并没有开aof持久化,但是将rdb文件上传至服务器后每次重启redis,rdb文件会被覆盖导致无法同同步数据,最终决定使用RedisShake
2.RedisShake介绍
什么是 RedisShake
RedisShake 是一个用于处理和迁移 Redis 数据的工具,它提供以下特性:
- Redis 兼容性:RedisShake 兼容从 2.8 到 7.2 的 Redis 版本,并支持各种部署方式,包括单机,主从,哨兵和集群。
- 云服务兼容性:RedisShake 与主流云服务提供商提供的流行 Redis-like 数据库无缝工作,包括但不限于:
- 阿里云-云数据库 Redis 版
- 阿里云-云原生内存数据库Tair
- AWS - ElastiCache
- AWS - MemoryDB
- Module 兼容:RedisShake 与 TairString,TairZSet 和 TairHash 模块兼容。
- 多种导出模式:RedisShake 支持 PSync,RDB 和 Scan 导出模式。
- 数据处理:RedisShake 通过自定义脚本实现数据过滤和转换。
更详细内容请见官方文档
3.使用教程
3.1首先下载RedisShake
https://github.com/tair-opensource/RedisShake/releases
- 解压后,得到 redis-shake 执行程序和 shake.toml 配置文件。windows系统自行将redis-shake加.exe后缀
3.2 编辑shake.toml配置文件
其中reader,用来对接不同的源端
- 对于从备份中恢复数据的场景,可以使用
rdb_reader
。 - 对于数据迁移场景,优先选择
sync_reader
。一些云厂商没有提供 PSync 协议支持,可以选择scan_reader
。
3.2.1 rdb迁移
# 全局配置
log_file = "shake.log" # 日志文件路径
log_level = "info" # 日志级别:info
# 源数据
[rdb_reader]
filepath = "D:/develop/Redis-x64-3.2.100/dump.rdb" # 你的rdb文件位置
# 目标 Redis 配置
# 目标redis
[redis_writer]
cluster = false # false就是单例, true是集群
address = "192.168.230.131:6379" # 如果cluster为true, 只需要填集群中的任意一个节点地址即可同步到整个集群
username = "" # 开了ACL写用户名 没开空着
password = "123456" # 如果有密码,开没开ACL都写 否则空着
tls = false
# 高级配置
[advanced]
pipeline_count_limit = 1024 # 默认管道大小
rdb_restore_command_behavior = "rewrite" # 遇到重复键时覆盖
3.2.2 sync Reader
当源端数据库兼容 PSync 协议时,推荐使用 sync_reader
优势:数据一致性最佳,对源库影响小,可以实现不停机的切换
# 全局配置
log_file = "shake.log" # 日志文件路径
log_level = "info" # 日志级别:info
# 源数据
[sync_reader]
cluster = false # set to true if source is a redis cluster
address = "127.0.0.1:6379" # when cluster is true, set address to one of the cluster node
username = "" # keep empty if not using ACL
password = "" # keep empty if no authentication is required
tls = false
sync_rdb = true # 是否同步 RDB,设置为 false 时,RedisShake 会跳过全量同步阶段
sync_aof = true # 是否同步 AOF,设置为 false 时,RedisShake 会跳过增量同步阶段,此时 RedisShake 会在全量同步阶段结束后退出
# 目标redis
[redis_writer]
cluster = false # false就是单例, true是集群
address = "192.168.230.131:6379" # 如果cluster为true, 只需要填集群中的任意一个节点地址即可同步到整个集群
username = "" # 开了ACL写用户名 没开空着
password = "123456" # 如果有密码,开没开ACL都写 否则空着
tls = false
# 高级配置
[advanced]
pipeline_count_limit = 1024 # 默认管道大小
rdb_restore_command_behavior = "rewrite" # 遇到重复键时覆盖
3.2.3可选项
RedisShake 提供了多种内置的过滤规则,用户可以根据需要选择合适的规则。
[filter]
allow_keys = ["user:1001", "product:2001"] # 允许的键名
allow_key_prefix = ["user:", "product:"] # 允许的键名前缀
allow_key_suffix = [":active", ":valid"] # 允许的键名后缀
allow_key_regex = [":\\d{11}:"] # 允许的键名正则,11位手机号
block_keys = ["temp:1001", "cache:2001"] # 阻止的键名
block_key_prefix = ["temp:", "cache:"] # 阻止的键名前缀
block_key_suffix = [":tmp", ":old"] # 阻止的键名后缀
block_key_regex = [":test:\\d{11}:"] # 阻止的键名正则,11位手机号,前缀为test
如果不设置这些选项,默认允许所有键。
[filter]
allow_db = [0, 1, 2]
block_db = [3, 4, 5]
也可以指定迁移具体的库或者阻止具体的库, 不写则默认所有库进行迁移
3.3 执行redis-shake
redis-shake shake.toml
至此应该成功了,若显示 redis-shake source db is not doing bgsave! continue.
可以先看看数据迁移过去没有,是有概率能迁移过去的,可以考虑从过滤项入手看一下,我将过滤项的allow_db删掉后就不会出现那个问题了,其余的没尝试过请自行探索
4.官方文档地址
https://tair-opensource.github.io/RedisShake/zh/