RedisShake

  • 官网地址:https://tair-opensource.github.io/RedisShake/zh/
  • github:https://github.com/tair-opensource/RedisShake

编译

  • 基于 go 语言开发,编译需要 go 语言开发环境
1
2
3
git clone https://github.com/alibaba/RedisShake
cd RedisShake
bash build.sh

全量 导出/导入 集群数据

查询 Redis Cluster Master 节点信息

  • 连接 Redis 任何一个节点,执行 CLUSTER NODES 命令,获取 Master 节点地址信息
1
redis-cli -h <源集群任意IP> -p <端口> -a <密码> CLUSTER NODES

导出rdb 文件

  • 依次连接 redis cluster 的 master 节点,生成 rdb 文件
1
2
3
4
5
6
## 创建目录
mkdir rdb01
## 依次生成文件
sudo /data/redis/redis_6379/bin/redis-cli -c -h master_ip_01 -a 123456 -p master_port_01 --rdb rdb/master1.rdb
sudo /data/redis/redis_6379/bin/redis-cli -c -h master_ip_02 -a 123456 -p master_port_02 --rdb rdb/master2.rdb
sudo /data/redis/redis_6379/bin/redis-cli -c -h master_ip_03 -a 123456 -p master_port_03 --rdb rdb/master3.rdb

导入 rdb 文件

  • 将 rdb 目录和 RedisShake 发送至要导入集群所在的服务器
  • 编辑配置文件,分别编写导入 master1.rdb/master2.rdb/master3.rdb 的导入配置文件
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
$ vim master1-shake.toml
[rdb_reader]
filepath = "/home/rc/RedisShake/rdb/master1.rdb"

[redis_writer]
cluster = true
address = "192.168.212.61:6379" # when cluster is true, address is one of the cluster node
username = ""              # keep empty if not using ACL
password = "123456"              # keep empty if no authentication is required
tls = false

[advanced]
dir = "./data"                            # RDB 文件输出目录
ncpu = 0                                  # 使用 CPU 核心数,0 表示使用全部
log_file = "dump.log"                     # 日志文件
log_level = "info"                        # 日志级别:debug / info / warn
log_interval = 1                          # 日志间隔(秒)

#############################################
$ vim master2-shake.toml
[rdb_reader]
filepath = "/home/rc/RedisShake/rdb/master2.rdb"

[redis_writer]
cluster = true
address = "192.168.212.61:6379" # when cluster is true, address is one of the cluster node
username = ""              # keep empty if not using ACL
password = "123456"              # keep empty if no authentication is required
tls = false

[advanced]
dir = "./data"                            # RDB 文件输出目录
ncpu = 0                                  # 使用 CPU 核心数,0 表示使用全部
log_file = "dump.log"                     # 日志文件
log_level = "info"                        # 日志级别:debug / info / warn
log_interval = 1                          # 日志间隔(秒)

#############################################
$ vim master3-shake.toml
[rdb_reader]
filepath = "/home/rc/RedisShake/rdb/master3.rdb"

[redis_writer]
cluster = true
address = "192.168.212.61:6379" # when cluster is true, address is one of the cluster node
username = ""              # keep empty if not using ACL
password = "123456"              # keep empty if no authentication is required
tls = false

[advanced]
dir = "./data"                            # RDB 文件输出目录
ncpu = 0                                  # 使用 CPU 核心数,0 表示使用全部
log_file = "dump.log"                     # 日志文件
log_level = "info"                        # 日志级别:debug / info / warn
log_interval = 1                          # 日志间隔(秒)
  • 调用导入
1
2
3
4
5
# 增加执行权限
chmod u+x redis-shake 
./redis-shake master1-shake.toml 
./redis-shake master2-shake.toml 
./redis-shake master3-shake.toml 

补充

BUSYKEY reply. cmd=[RESTORE

  • key 重复导入失败,可以在 toml 的 advanced 节点下增加 rdb_restore_command_behavior="rewrite” 配置,增加覆盖导入以强制导入
  • 风险点:一般导入失败实际上是备份时的问题,注意排查