redis-shake实现无感知不停服迁移redis服务以及数据

  • 由于业务要求,redis服务器迁移,将A服务器redis(单机)数据迁移到B服务器的redis(单机)上,只迁移5库数据,选择工具的原因是:B服务器上redis其他库都有数据,不能直接迁移A服务器redis的rdb或aof持久化文件

二、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工具下载

bash 复制代码
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文件配置较多,可只保留有用的配置即可
ini 复制代码
[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选项说明
ini 复制代码
# 启用 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 数据同步: ```bash ./redis-shake shake.toml ``` 这将会按照配置文件中的设置从源 Redis 实例(172.16.44.67:6379)同步数据到目标 Redis 实例(172.16.44.68:6379),并仅同步 5 号数据库的数据。 #### 5.5 执行过程 ```yaml [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

相关推荐
Joseit1 分钟前
基于 Spring Boot实现的图书管理系统
java·spring boot·后端
{⌐■_■}21 分钟前
【go】什么是Go语言的GPM模型?工作流程?为什么Go语言中的GMP模型需要有P?
java·开发语言·后端·golang
IT杨秀才1 小时前
LangChain框架入门系列(5):Memory
人工智能·后端·langchain
程序猿chen1 小时前
JVM考古现场(二十四):逆熵者·时间晶体的永恒之战
java·jvm·git·后端·程序人生·java-ee·改行学it
AronTing1 小时前
单例模式:确保唯一实例的设计模式
java·javascript·后端
AronTing1 小时前
模板方法模式:定义算法骨架的设计模式
java·后端·面试
AronTing1 小时前
迭代器模式:统一数据遍历方式的设计模式
java·后端·面试
AronTing1 小时前
策略模式:动态切换算法的设计智慧
java·后端·面试
爱的叹息1 小时前
查看Spring Boot项目所有配置信息的几种方法,包括 Actuator端点、日志输出、代码级获取 等方式,附带详细步骤和示例
java·spring boot·后端
Maxkim2 小时前
🚀一篇教你看懂后端目录长啥样⁉️有啥用 ⁉️
前端·后端