Redis数据迁移

redis集群由伪6节点组成(3台服务器,3主3从)迁移到单节点3主redis

正常情况下我们可以使用redis热迁移工具像RedisShake ,但这边集群环境配置有点问题工具无法完成迁移,所以才有了本次迁移记录

服务器列表如下:

主机IP下线/保留
5gxx-2-29192.168.64.29保留,部署3主单机redis
5gxx-2-30192.168.64.30下线
5gxx-2-31192.168.64.31下线

部署新Redis集群

创建3 单主redis配置文件

这里appendonly no暂时关闭aof,因为3节点的集群配置有问题导致主从、主主节点共用同一个aof文件,直接同步aof数据会有问题(3个槽的数据中有2个槽的数据是一样的)

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
56
57
58
59
60
61
62
[mms@5gxx-2-29 redis]$ vim conf/redis_6001.conf 
port 6001
bind 192.168.64.29
daemonize yes
pidfile /var/run/redis_6001.pid
cluster-enabled yes
cluster-config-file nodes-6001.conf
cluster-node-timeout 25000
appendonly no
dir /home/czz/redis/data1/
appendfilename appendonly.aof
loglevel debug
logfile /home/czz/redis/logs/redis-6001.logs
maxclients 15000
maxmemory 3gb
maxmemory-policy volatile-lru
protected-mode no
masterauth "密码保持一致"
requirepass "密码保持一致"
daemonize no

[mms@5gxx-2-29 redis]$ vim conf/redis_6002.conf
port 6002
bind 192.168.64.29
daemonize yes
pidfile /var/run/redis_6002.pid
cluster-enabled yes
cluster-config-file nodes-6002.conf
cluster-node-timeout 25000
appendonly no
dir /home/czz/redis/data2/
appendfilename appendonly.aof
loglevel debug
logfile /home/czz/redis/logs/redis-6002.logs
maxclients 15000
maxmemory 3gb
maxmemory-policy volatile-lru
protected-mode no
masterauth "密码保持一致"
requirepass "密码保持一致"
daemonize no

[mms@5gxx-2-29 redis]$ vim conf/redis_6003.conf
port 6003
bind 192.168.64.29
daemonize yes
pidfile /var/run/redis_6003.pid
cluster-enabled yes
cluster-config-file nodes-6003.conf
cluster-node-timeout 25000
appendonly no
dir /home/czz/redis/data3/
appendfilename appendonly.aof
loglevel debug
logfile /home/czz/redis/logs/redis-6003.logs
maxclients 15000
maxmemory 3gb
maxmemory-policy volatile-lru
protected-mode no
masterauth "密码保持一致"
requirepass "密码保持一致"
daemonize no

配置supervisor启动文件

1
2
3
4
5
6
7
8
9
10
11
12
13
[mms@5gxx-2-29 redis]$ sudo vim /etc/supervisord.d/redis_6001.ini 
[program:redis_6001]
command=/apps/usr/redis/bin/redis-server /apps/usr/redis/conf/redis_6001.conf
autostart=true
autorestart=true
startsecs=10
startretries=3
user=mms
daemonize=no
redirect_stderr=true
stdout_logfile=/apps/usr/redis/logs/redis-6001-out.log
stdout_logfile_maxbytes=100MB
stdout_logfile_backups=10

创建Redis Cluster

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#supervisor更新redis启动配置,启动redis服务
supervisor> update

# 创建集群,指定集群中只有3个主节点
# 前3个主节点,--cluster-replicas 0没有从节点
[mms@5gxx-2-29 redis]$ ./bin/redis-cli --cluster create --cluster-replicas 0 192.168.64.29:6001 192.168.64.29:6002 192.168.64.29:6003 -a "密码"
# 输入yes 等待集群创建完成
# 验证集群Redis-Cluster
[mms@5gxx-2-29 redis]$ ./bin/redis-cli -a {redis密码} -h {redis地址} -p {redsi端口} -c
# 验证集群信息
>cluster info #查看集群信息
>cluster nodes #查看集群节点列表

# 查看集群内主从关系
>cluster slots

到这里redis集群就创建好了

迁移Redis 数据

在旧redis集群上查看数据槽和节点的对应关系

1
lots192.168.64.31:7005> cluster slots

看情况是否修改数据存储路径或文件名,我这边一台服务器上的2个redis都用的同一个dbfilename路径和名称所以直接导出来的数据会有问题

1
2
> config set dir /data
> config set dbfilename newfilename.rdb

顺便在3个主节点上保存数据

1
> bgsave

在单redis节点上数据槽和节点的对应关系

1
192.168.64.29:6001> cluster slots

分别将3个数据槽的aof文件分别拷贝到对应数据库槽redis 的data目录下,例如将数据槽0-5460的数据拷贝到0-5460槽的redis data下

重启3个redis服务

1
2
[mms@5gxx-2-29 redis]# supervisorctl
supervisor> restart redis_6001 redis_6002 redis_6003

查看redis 3个节点的数据量

1
2
> dbsize
> info keyspace

redis 中启动aof,确保存储了aof日志

1
2
3
4
5
6
192.168.223.128:6003> config set appendonly yes
OK

[czz@czz redis]$ du -sh data3/*
183M data3/appendonly.aof
183M data3/dump.rdb

redis 修改conf配置文件,启动aof

1
2
3
4
5
6
[mms@5gxx-2-29 redis]$ sudo vim conf/redis_6001.conf
appendonly yes
[mms@5gxx-2-29 redis]$ sudo vim conf/redis_6002.conf
appendonly yes
[mms@5gxx-2-29 redis]$ sudo vim conf/redis_6003.conf
appendonly yes

再重启redis服务

1
supervisor> restart redis_6001 redis_6002 redis_6003
-------------本文结束感谢您的阅读-------------