|

redis-shake redis-tool redis-port
作者 阿里(https://github.com/alibaba/RedisShake) 个人(https://github.com/icowan/redis-tool) CodisLabs(https://github.com/CodisLabs/redis-port)
社区活跃 一般 不活跃
基本功能 解析、恢复、备份、同步 同步 解析、恢复、备份、同步
支持数据类型 所有 所有 所有
支持过滤条件 filter.db
filter.key
filter.slot
filter.key filterdb
校验 提供redis-full-check
工具校验


小结:
redis-shake项目较活跃,且支持功能丰富,建议优先考虑。 redis-shake模拟slave协议进行实时数据同步,有需求也可考虑二次开发通过redis-shake同步到其他类型数据库。

redis-shake文档简介:

配置模板下载: redis-shake.conf

主要参数说明

参数 是否必填 说明 取值示例
source.type 根据源库(自建数据库)的架构选择,取值:
- standalone:主从架构。
- cluster:集群架构。
standalone
source.address 源库的连接地址和端口号,连接地址和端口号之间使用英文冒号(:)分隔。
说明
- 如果源库与Redis-shake部署在同一设备,可填写为127.0.0.1:6379。
- 如果源库为集群架构,在填写连接地址时需要添加master@前缀,例如master@127.0.0.1:6379。

| 127.0.0.1:6379 | | source.password_raw | 是 | 源库的密码,如果源库未设置密码,无需填写。 | Rp829dlwa | | target.type | 是 | 根据目标Redis实例的架构选择,取值:
- standalone:标准(主从)架构
- cluster:集群架构
| standalone | | target.address | 是 | 目标Redis实例的连接地址与端口号,连接地址和端口号之间使用英文冒号(:)分隔。关于如何获取连接地址和端口号,请参见查看连接地址

- ECS实例通过专有网络连接:需获取Redis实例的专有网络连接地址。
- 本地设备通过公网连接:需获取Redis实例的公网连接地址。
说明 如果目标实例为集群架构,您需要通过直连地址连接(网络类型为专有网络),且在填写连接地址时需要添加master@前缀,例如master@r-bp1mfnrflszg75w.redis.rds.aliyuncs.com:6379。关于如何申请直连地址,请参见开通直连访问。 | r-bp1wcw2rlw76acc5k.redis.rds.aliyuncs.com
:6379 | | target.password_raw | 是 | 目标Redis实例的账号(需具备读写权限)及其密码,账号和密码之间使用英文冒号(:)分隔。关于如何创建账号,请参见创建与管理账号
。 | testaccount:Rp829dlwa | | target.db | 否 | 将源库中所有库的数据都迁移至目标库的指定库中,取值范围为0~15。
说明 默认值为-1,表示不启用该功能。 | -1 | | key_exists | 否 | 当源库中的Key与目标库中的Key相同时,采取的数据写入策略,取值:
- rewrite:覆盖写入至目标库。
- none:默认值,停止运行Redis-shake程序并提示冲突的Key。
- ignore:直接跳过当前迁移的Key,保留目标库的数据,继续执行数据迁移。
| rewrite | | filter.db.whitelist | 否 | 需要迁移的库名,多个库名间用英文分号(;)分隔,默认为空,即迁移所有库。 | 0;1 | | filter.db.blacklist | 否 | 不需要迁移的库名(即黑名单),多个库名间用英文分号(;)分隔。默认为空,即不设置黑名单。 | 1;2 | | parallel | 否 | Redis-shake执行迁移的并发线程数,适当调大该值可提高同步性能。
说明 默认值为32,最小值为1,最大值取决于Redis-shake所在服务器的性能。 | 32 |

若有需要,修改redis-shake.conf里的filter相关规则。注意,不需要填正则表达式 * 等相关符号

# 支持按前缀过滤key,只让指定前缀的key通过,分号分隔。比如指定abc,将会通过abc, abc1, abcxxx
filter.key.whitelist = ssss
# 支持按前缀过滤key,不让指定前缀的key通过,分号分隔。比如指定abc,将会阻塞abc, abc1, abcxxx
filter.key.blacklist =

配置更新后,可执行命令进行同步

Usage of ./redis-shake.darwin: -conf string configuration path -type string run type: decode, restore, dump, sync, rump -version show version //linux系统使用 redis-shake.linux ./redis-shake.darwin -type=sync -conf=redis-shake.conf

官方文档详细介绍
https://help.aliyun.com/document_detail/111066.html?spm=a2c4g.11186623.6.625.52597ce0BQ1GwU
https://github.com/alibaba/RedisShake/wiki/%E7%AC%AC%E4%B8%80%E6%AC%A1%E4%BD%BF%E7%94%A8%EF%BC%8C%E5%A6%82%E4%BD%95%E8%BF%9B%E8%A1%8C%E9%85%8D%E7%BD%AE%EF%BC%9F

使用过程发生的常见问题

  1. 同步已经存在的key | 2021/12/06 14:19:06 [PANIC] target key name is busy: jims_super_m_set
    [stack]:
    1 github.com/alibaba/RedisShake/redis-shake/common/utils.go:908

github.com/alibaba/RedisShake/redis-shake/common.RestoreRdbEntry

0 github.com/alibaba/RedisShake/redis-shake/dbSync/syncRDB.go:71

github.com/alibaba/RedisShake/redis-shake/dbSync.(*DbSyncer).syncRDBFile.func1.1.syncRDBFile.func1.1)

… … | | —- |


redis-shake.conf 把rewrite参数改为key_exists,其取值有以下三种:
rewrite表示源端覆盖目的端。
none表示一旦发生进程直接退出。
ignore表示保留目的端key,忽略源端的同步key。该值在rump模式下没有用。