redis-shake工具同步redis数据

一、我的使用场景说明

1.业务场景

  • 由于业务要求,redis服务器迁移,将A服务器redis(单机)数据迁移到B服务器的redis(单机)上,只迁移5库数据,选择工具的原因是:B服务器上redis其他库都有数据,不能直接迁移A服务器redis的rdb或aof持久化文件
  • redis都是单机、6.0.2版本
  • redis使用docker容器部署
  • redis都开启了rdb持久化
  • A服务器redis-172.16.44.67:6379、B服务器redis=172.16.44.68:6379,密码:123456

 

二、redis-shake工具介绍

redis-shake 是一个用于数据迁移和同步的开源工具,主要用于将 Redis 数据从一个实例迁移到另一个实例。它可以帮助在不同的 Redis 集群或实例之间迁移数据,支持单向同步和双向同步,并可以用于在 Redis 实例之间同步不同的数据集或数据库。

1.主要功能

1.1 数据迁移:

支持将 Redis 实例的数据迁移到另一个实例。可以跨版本进行迁移,支持不同版本的 Redis 之间的数据传输。

 

1.2 增量同步:

支持全量数据迁移后,通过增量同步进行实时同步,保持目标 Redis 实例数据的实时更新。

 

1.3 支持多种模式:

Standalone(单机模式): 从一个 Redis 实例同步到另一个 Redis 实例。
Cluster(集群模式): 在 Redis 集群之间进行同步。

 

1.4 RDB/AOF 支持:

支持通过 RDB(Redis 数据库快照)文件或 AOF(Append Only File)日志进行数据同步。

 

1.5 多种同步方式:

全量同步: 将源 Redis 实例中的所有数据导出到目标实例。
增量同步: 在全量同步完成后,通过增量同步确保目标实例持续跟踪和同步源实例的更新。

 

2.常见使用场景

跨集群迁移: 当需要将 Redis 数据从一个集群迁移到另一个集群时,redis-shake 可以实现高效的同步。
集群升级: 在 Redis 集群版本升级时,redis-shake 可以帮助迁移数据,并确保在新版本中同步旧集群的数据。
数据备份与恢复: 可用于备份 Redis 数据并将其恢复到另一台 Redis 实例。
灾难恢复: 用于将一个实例的数据同步到另一个实例,提供灾难恢复的手段。

 

3.工作原理

全量同步: 使用 bgsave 命令从源实例生成 RDB 文件,然后将文件从源实例传输到目标实例,完成数据迁移。
增量同步: 在全量同步完成后,redis-shake 会启动增量同步机制,实时监控源实例的更新并同步到目标实例。
AOF 和 RDB 文件支持: redis-shake 支持通过 AOF 或 RDB 文件进行数据同步,适应不同的 Redis 持久化机制。

 

4.redis-shake工具下载

https://github.com/tair-opensource/RedisShake/releases

 

5.配置与使用

  • 解压 redis-shake-v4.3.1-linux-amd64.tar.gz 后,得到 redis-shake 执行程序和 shake.toml 配置文件
  • redis-shake 的配置通常通过 TOML 格式的配置文件进行,配置文件中包含源实例和目标实例的相关信息(如地址、密码、数据库等),并可以设置同步的数据库、同步方式(全量或增量)、同步的详细选项(例如是否启用 TLS、是否同步 AOF 等)。


5.1 配置文件shake.toml编辑(cat shake.toml)

  • 默认shake.toml文件配置较多,可只保留有用的配置即可
[sync_reader]
cluster = false
address = "172.16.44.67:6379" # 源 Redis 地址
password = "123456"          # 源 Redis 密码
sync_rdb = true               # 启用 RDB 同步
sync_aof = false               # 关闭 AOF 同步

[redis_writer]
cluster = false
address = "172.16.44.68:6379" # 目标 Redis 地址
password = "123456"          # 目标 Redis 密码

[filter]
allow_db = [5]                # 只同步 5 号库的数据

[advanced]
log_file = "shake.log"        # 日志文件路径
log_level = "info"            # 日志级别:info
pipeline_count_limit = 1024   # 默认管道大小

rdb_restore_command_behavior = "rewrite" # 遇到重复键时覆盖

这个配置文件指示 redis-shake 从 172.16.44.67:6379 的 Redis 实例中的 5 号数据库同步数据到 172.16.44.68:6379 的 Redis 实例的 5 号数据库。

 

  • sync_rdb 和 sync_aof选项说明
# 启用 RDB 全量同步,关闭 AOF 增量同步
sync_rdb = true
sync_aof = false

#关于 sync_rdb 和 sync_aof 的配置含义
sync_rdb = true:

表示启用 RDB(Redis DataBase)文件同步。
RDB 是 Redis 的快照文件,记录的是某个时间点的所有数据。
开启这个选项时,Redis-Shake 会在全量同步阶段将源 Redis 的 RDB 文件导出,并将其恢复到目标 Redis。

适用场景:
用于快速初始化目标 Redis 的数据。
全量同步非常适合数据量较大的场景,且可以避免实时同步延迟。

sync_aof = true:

表示启用 AOF(Append-Only File)日志同步。
AOF 是 Redis 的持久化日志,记录的是每条写命令的执行过程。
开启这个选项时,Redis-Shake 会捕获并同步源 Redis 的实时写入操作。

适用场景:
增量同步:在 RDB 全量同步完成后,AOF 负责保持源和目标数据的一致性。
如果源 Redis 数据更新频繁,这个选项非常重要。

 

5.2 配置项说明

[sync_reader]:配置源 Redis 实例的相关信息。
address:源 Redis 实例的 IP 地址和端口。
password:连接源 Redis 实例的密码。
sync_rdb:是否启用 RDB 同步。
sync_aof:是否启用 AOF 同步。

[redis_writer]:配置目标 Redis 实例的相关信息。
address:目标 Redis 实例的 IP 地址和端口。
password:连接目标 Redis 实例的密码。

[filter]:过滤同步数据的设置。
allow_db:指定要同步的数据库,可以是一个数字列表,这里只同步第 5 号数据库。

[advanced]:高级配置项。
log_file:设置日志文件的路径,记录同步过程中的信息。
log_level:设置日志级别,可以是 info、warn、error 等,控制日志的详细程度。
pipeline_count_limit:设置管道的最大数量,决定批量操作的大小。
rdb_restore_command_behavior:当目标 Redis 实例中已存在相同键时的行为,rewrite 表示覆盖目标 Redis 中的旧数据。

 

5.3 同步前操作(源服务器上)

  • 执行数据同步前,在源redis上执行落盘命令 bgsave

 

5.4 使用说明

使用以下命令启动 redis-shake 数据同步:

./redis-shake shake.toml

 这将会按照配置文件中的设置从源 Redis 实例(172.16.44.67:6379)同步数据到目标 Redis 实例(172.16.44.68:6379),并仅同步 5 号数据库的数据。

 

5.5 执行过程

[root@localhost 111]# ./redis-shake shake.toml
2025-01-12 13:41:31 INF load config from file: shake.toml
2025-01-12 13:41:31 INF log_level: [info], log_file: [/data/aibox-common/shell/111/data/shake.log]
2025-01-12 13:41:31 INF changed work dir. dir=[/data/aibox-common/shell/111/data]
2025-01-12 13:41:31 INF GOMAXPROCS defaults to the value of runtime.NumCPU [4]
2025-01-12 13:41:31 INF not set pprof port
2025-01-12 13:41:31 INF create SyncStandaloneReader
2025-01-12 13:41:31 INF * address: 172.16.44.67:6379
2025-01-12 13:41:31 INF * username: 
2025-01-12 13:41:31 INF * password: *******
2025-01-12 13:41:31 INF * tls: false
2025-01-12 13:41:31 INF create RedisStandaloneWriter
2025-01-12 13:41:31 INF * address: 172.16.44.68:6379
2025-01-12 13:41:31 INF * username: 
2025-01-12 13:41:31 INF * password: *******
2025-01-12 13:41:31 INF * tls: false
2025-01-12 13:41:31 INF start syncing...
2025-01-12 13:41:33 INF all done

 

5.6 验证同步结果

分别登陆两台redis容器:docker exec -it redis bash

分别进入redis5库:redis-cli -p 6379 -a 123456 -n 5

分别查看keys数量:keys *

分别随机抽几个key检查value值:get key,如我的key是:get camera:p100101

 

5.7 参考文档

https://tair-opensource.github.io/RedisShake/zh/guide/getting-started.html

 

posted @   Leonardo-li  阅读(653)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2023-01-12 library initialization failed - unable to allocate file descriptor table - out of memory
点击右上角即可分享
微信分享提示