redis集群如何迁移
Redis 集群迁移是一个复杂的过程,需要根据具体场景(如版本升级、架构调整、云平台迁移等)选择合适的方案。以下是几种常见的迁移方式及操作步骤,供参考:
迁移方式:
-
全量迁移(业务可中断)
-
全量迁移+增量迁移(业务不能中断情况下)
一、基于 Redis 集群自身特性迁移
适用于同版本 Redis 集群之间的数据迁移,例如从旧集群迁移到新集群,或调整集群节点配置 或 新建一个节点加入旧集群进行节点主从间的替换。
1. 原理:使用 cluster replicate 命令
通过将新节点添加为旧节点的从节点,同步数据后提升为主节点,逐步替换旧集群节点。
2. 操作步骤:
步骤 1:准备新集群或新节点
- 部署新的 Redis 集群节点(节点数与旧集群一致,或按新架构规划),确保网络互通。
- 查看当前集群状态(reis集群配置参考)
/data # redis-cli -p 7001 cluster nodes
d50856317e509ab8add95baa06c2324bc97b5e8d 172.18.0.3:7002@17002 master - 0 1747807849000 2 connected 5461-10922
bef486e0773ee8efb8bb4b9425115af7ccce4a65 172.18.0.2:7001@17001 myself,master - 0 1747807848000 1 connected 0-5460
1fd3bb65f20b8091fa89c2959bcfc2deef7af1a6 172.18.0.6:7005@17005 slave bef486e0773ee8efb8bb4b9425115af7ccce4a65 0 1747807849411 1 connected
a3fe31a1b726f626b4703d3ebb77ccec0a9182af 172.18.0.4:7003@17003 master - 0 1747807847000 3 connected 10923-16383
e48ea426732610b3a8e058e4955fc8b16b50f717 172.18.0.5:7004@17004 slave a3fe31a1b726f626b4703d3ebb77ccec0a9182af 0 1747807847000 3 connected
c55ed02356d4ef3d5ddfed8e8da15b6fe33d0809 172.18.0.7:7006@17006 slave d50856317e509ab8add95baa06c2324bc97b5e8d 0 1747807847332 2 connected
步骤 2:逐个迁移主节点
以迁移移除旧主节点 172.18.0.3
为例:
- 配置172.18.0.8 节点:
lantai@lantaideMacBook-Pro redis-cluster % pwd
/Users/lantai/data/redis-cluster
lantai@lantaideMacBook-Pro redis-cluster % ls -ls
total 0
0 drwxr-xr-x 4 lantai staff 128 5 19 18:58 nodes1
0 drwxr-xr-x 4 lantai staff 128 5 19 18:58 nodes2
0 drwxr-xr-x 4 lantai staff 128 5 19 18:58 nodes3
0 drwxr-xr-x 4 lantai staff 128 5 19 18:58 nodes4
0 drwxr-xr-x 4 lantai staff 128 5 19 18:58 nodes5
0 drwxr-xr-x 4 lantai staff 128 5 19 18:58 nodes6
lantai@lantaideMacBook-Pro redis-cluster % mkdir -p nodes7/data nodes7/conf
编写 Redis 配置文件(nodes7/conf/redis.conf
)
port 7007
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
dir /data
启动 172.18.0.8 节点
docker run -d --name redis7 -p 7007:7007 -p 17007:17007 \
-v /Users/lantai/data/redis-cluster/nodes7/conf/redis.conf:/etc/redis/redis.conf \
-v /Users/lantai/data/redis-cluster/nodes7/data:/data \
--network redis_net \
--ip 172.18.0.8 \
redis:7.0-alpine \
redis-server /etc/redis/redis.conf
–network redis_net : 绑定redis cluter容器组的桥接网卡,方便相互网络通信。
–ip :指定固定ip
- 两集群间节点间替换法
- 在新集群中选择一个节点
A'
,执行以下命令使其成为旧主节点A
的从节点:
- 在新集群中选择一个节点
redis-cli -h <新节点A' IP> -p <端口> cluster replicate <旧主节点A的ID>
- 单节点替换集群中的节点法:
- 这里只是新增了一台172.18.0.8,不是新创建了一个新集群
- 先让新节点加入旧集群
redis-cli -h 172.18.0.8 -p 7007 cluster meet 172.18.0.2 7001
查看目前集群状态
可以看到172.18.0.8 节点已加入集群,并为master节点
/data # redis-cli -p 7007 cluster nodes
a3fe31a1b726f626b4703d3ebb77ccec0a9182af 172.18.0.4:7003@17003 master - 0 1747810979000 3 connected 10923-16383
1fd3bb65f20b8091fa89c2959bcfc2deef7af1a6 172.18.0.6:7005@17005 slave bef486e0773ee8efb8bb4b9425115af7ccce4a65 0 1747810978494 1 connected
6134e61436684124fb58b101bf7955db34279943 172.18.0.8:7007@17007 myself,master - 0 1747810976000 0 connected
d50856317e509ab8add95baa06c2324bc97b5e8d 172.18.0.3:7002@17002 master - 0 1747810978599 2 connected 5461-10922
bef486e0773ee8efb8bb4b9425115af7ccce4a65 172.18.0.2:7001@17001 master - 0 1747810979533 1 connected 0-5460
c55ed02356d4ef3d5ddfed8e8da15b6fe33d0809 172.18.0.7:7006@17006 slave d50856317e509ab8add95baa06c2324bc97b5e8d 0 1747810979533 2 connected
e48ea426732610b3a8e058e4955fc8b16b50f717 172.18.0.5:7004@17004 slave a3fe31a1b726f626b4703d3ebb77ccec0a9182af 0 1747810979644 3 connected
让172.18.0.8 节点变更为172.18.0.3的从节点
/data # redis-cli -c -h 172.18.0.8 -p 7007 cluster replicate d50856317e509ab8add95baa06c2324bc97b5e8d
OK
验证:
redis-cli -c -h 172.18.0.8 -p 7007 info replication
输出:
/data # redis-cli -c -h 172.18.0.8 -p 7007 info replication
# Replication
role:slave
master_host:172.18.0.3
master_port:7002
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_read_repl_offset:4612
slave_repl_offset:4612
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:0f40fea9c8e8ef9ded3c8cabae1872706b541272
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:4612
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:4557
repl_backlog_histlen:56
- 等待数据同步:
-master_link_status: up
表示同步完成。 - 查询集群中的key
/data # redis-cli -c -h 172.18.0.8 -p 7007
172.18.0.8:7007> get hello
-> Redirected to slot [866] located at 172.18.0.2:7001
"world"
172.18.0.2:7001> get number
-> Redirected to slot [7743] located at 172.18.0.3:7002
"15665565"
172.18.0.3:7002>
-
提升新节点为主节点:
a. 确认172.18.0.3的节点相关信息
这里172.18.0.7,172.18.0.8都为172.18.0.3的从节点
/data # redis-cli -c -h 172.18.0.3 -p 7002 info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.18.0.8,port=7007,state=online,offset=6600,lag=0
slave1:ip=172.18.0.7,port=7006,state=online,offset=6600,lag=1
master_failover_state:no-failover
master_replid:0f40fea9c8e8ef9ded3c8cabae1872706b541272
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:6600
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:6600
b. 执行手动故障转移
- 前提:确保数据同步完成了
使172.18.0.8其成为主节点
redis-cli -c -h 172.18.0.8 -p 7007 cluster failover takeover
# takeover 参数:强制立即进行故障转移,无需等待多数投票。
c. 验证 172.18.0.8 已成为主节点
/data # redis-cli -c -h 172.18.0.8 -p 7007 info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.18.0.3,port=7002,state=online,offset=7146,lag=0
slave1:ip=172.18.0.7,port=7006,state=online,offset=7146,lag=0
master_failover_state:no-failover
master_replid:8290ec231c1907815cb249c692e2a34e3081bf85
master_replid2:0f40fea9c8e8ef9ded3c8cabae1872706b541272
master_repl_offset:7160
second_repl_offset:7063
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:4557
repl_backlog_histlen:2604
可以看到172.18.0.3已经切换为主节点了
d. 验证槽位是否迁移完成
/data # redis-cli -c -h 172.18.0.8 -p 7007 cluster slots
2) 1) (integer) 54612) (integer) 109223) 1) "172.18.0.8"2) (integer) 70073) "6134e61436684124fb58b101bf7955db34279943"4) (empty array)4) 1) "172.18.0.3"2) (integer) 70023) "d50856317e509ab8add95baa06c2324bc97b5e8d"4) (empty array)5) 1) "172.18.0.7"2) (integer) 70063) "c55ed02356d4ef3d5ddfed8e8da15b6fe33d0809"4) (empty array)
# 确认所有槽位(如 5461-10922)已由 172.18.0.8 负责
e. 下线 172.18.0.3 这个从节点
确认点:
- 角色为 slave:确认是从节点。
- 无槽位分配:结尾无 表示不负责任何槽位。
确认从节点的id
/data # redis-cli -c -h 172.18.0.8 -p 7007 cluster nodes | grep "172.18.0.3:7002" | awk '{print $1}'
d50856317e509ab8add95baa06c2324bc97b5e8d
删除172.18.0.3从节点
redis-cli --cluster del-node 172.18.0.8:7007 d50856317e509ab8add95baa06c2324bc97b5e8d
输出
>>> Removing node d50856317e509ab8add95baa06c2324bc97b5e8d from cluster 172.18.0.8:7007
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.
验证
/data # redis-cli -c -h 172.18.0.8 -p 7007 cluster nodes
a3fe31a1b726f626b4703d3ebb77ccec0a9182af 172.18.0.4:7003@17003 master - 0 1747824472000 3 connected 10923-16383
1fd3bb65f20b8091fa89c2959bcfc2deef7af1a6 172.18.0.6:7005@17005 slave bef486e0773ee8efb8bb4b9425115af7ccce4a65 0 1747824473028 1 connected
6134e61436684124fb58b101bf7955db34279943 172.18.0.8:7007@17007 myself,master - 0 1747824473000 7 connected 5461-10922
bef486e0773ee8efb8bb4b9425115af7ccce4a65 172.18.0.2:7001@17001 master - 0 1747824474060 1 connected 0-5460
c55ed02356d4ef3d5ddfed8e8da15b6fe33d0809 172.18.0.7:7006@17006 slave 6134e61436684124fb58b101bf7955db34279943 0 1747824473000 7 connected
e48ea426732610b3a8e058e4955fc8b16b50f717 172.18.0.5:7004@17004 slave a3fe31a1b726f626b4703d3ebb77ccec0a9182af 0 1747824472510 3 connected
/data #
/data # redis-cli -c -h 172.18.0.8 -p 7007 info replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.18.0.7,port=7006,state=online,offset=9512,lag=1
master_failover_state:no-failover
master_replid:8290ec231c1907815cb249c692e2a34e3081bf85
master_replid2:0f40fea9c8e8ef9ded3c8cabae1872706b541272
master_repl_offset:9512
second_repl_offset:7063
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:4557
repl_backlog_histlen:4956
- 验证集群中的key
/data # redis-cli -c -h 172.18.0.8 -p 7007
172.18.0.8:7007> get number
"15665565"
# key number已经成功查询到在172.18.0.8生节点上了
172.18.0.8:7007> get hello
-> Redirected to slot [866] located at 172.18.0.2:7001
"world"
至此,新节点加入提升为主节点,替换旧的主节点完成。
二、使用 Redis 官方工具集群间迁移
支持(跨版本/跨架构)
1. redis-cli --cluster
工具(适用于同版本集群)
- 全量迁移:通过
redis-cli --cluster reshard
命令将旧集群的槽位和数据批量迁移到新集群。
redis-cli --cluster reshard <新集群主节点IP:端口> --from <旧集群所有主节点ID,用逗号分隔> --to <新集群主节点ID> --slots <总槽位数> --yes
2. redis-migrate-tool
(适用于跨版本或单机→集群)
- 工具简介:Redis 6.0+ 引入的官方迁移工具,支持单机实例或集群间的数据迁移,支持全量迁移和增量同步。
- 安装:随 Redis 源码包提供,编译后位于
src/
目录下。 - 示例(单机迁移到集群):
./redis-migrate-tool --from-uri redis://<旧单机IP:端口> --to-uri redis://<新集群IP:端口> --cluster
--cluster
:目标为集群时需指定。- 其他参数:
--auth
(认证密码)、--copy
(全量迁移)、--replicate
(全量+增量同步)。
3. 开源迁移工具RedisShake
RedisShake是一款开源的Redis迁移工具,支持Cluster集群的在线迁移与离线迁移(备份文件导入)。DCS Cluster集群与Redis Cluster集群设计一致,数据可平滑迁移。
参考链接:https://support.huaweicloud.com/usermanual-dcs/dcs-migrate-demo02.html
官方中文文档:https://tair-opensource.github.io/RedisShake/zh/guide/introduction.html
三、基于 RDB 文件的迁移(适用于冷迁移)
适用于停机维护场景,通过手动备份 RDB 文件并恢复到新集群。
操作步骤:
- 备份旧集群数据:
redis-cli -h <旧主节点IP> -p <端口> save
- 对每个主节点执行 `SAVE` 或 `BGSAVE` 生成 RDB 文件。
- 传输 RDB 文件:将 RDB 文件复制到新集群节点的数据目录(通常为
dir
配置项指定的路径)。 - 重启新节点并加载 RDB:
- 修改新节点配置文件(
redis.conf
),确保dbfilename
与 RDB 文件名一致。 - 重启 Redis 服务,自动加载 RDB 文件。
- 修改新节点配置文件(
- 构建新集群:
- 使用
redis-cli --cluster create
命令将新节点组成集群,并分配槽位。
- 使用
四、云平台迁移(以阿里云为例)
若涉及云平台(如从自建集群迁移到云托管 Redis),可通过以下方式:
1. 使用云平台迁移工具
- 阿里云 Redis 提供 数据迁移工具,支持从自建集群或其他云厂商迁移数据:
- 登录阿里云 Redis 控制台,选择“数据迁移”。
- 配置源集群(自建 Redis 集群)和目标集群(阿里云 Redis 集群)信息。
- 启动全量迁移,完成后切换业务流量。
2. 手动迁移(适用于小数据量)
- 通过
redis-cli
或第三方工具(如redis-trib.rb
)将数据逐个槽位迁移到云集群。
五、注意事项
- 数据一致性:
- 迁移过程中避免写入操作,或使用增量同步(如
--replicate
参数)确保最终一致性。
- 迁移过程中避免写入操作,或使用增量同步(如
- 版本兼容性:
- 跨大版本(如 Redis 4.x → 6.x)迁移时,需注意新特性和废弃命令的影响。
- 监控与回滚:
- 迁移期间监控集群状态(内存、CPU、网络延迟)。
- 提前备份旧集群数据,以便迁移失败时快速回滚。
- 流量切换:
- 迁移完成后,通过修改 DNS 或负载均衡配置,将业务流量切换到新集群。
六、常用命令总结
命令 | 说明 |
---|---|
CLUSTER REPLICATE <nodeID> | 将当前节点设置为指定节点的从节点 |
redis-cli --cluster reshard <IP:port> --from <srcID> --to <dstID> | 迁移槽位和数据到目标节点 |
redis-migrate-tool --from-uri --to-uri | 官方迁移工具,支持跨版本和架构迁移 |
SAVE / BGSAVE | 生成 RDB 快照 |