当前位置: 首页 > news >正文

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 文件并恢复到新集群。

操作步骤:
  1. 备份旧集群数据
redis-cli -h <旧主节点IP> -p <端口> save
- 对每个主节点执行 `SAVE` 或 `BGSAVE` 生成 RDB 文件。
  1. 传输 RDB 文件:将 RDB 文件复制到新集群节点的数据目录(通常为 dir 配置项指定的路径)。
  2. 重启新节点并加载 RDB
    • 修改新节点配置文件(redis.conf),确保 dbfilename 与 RDB 文件名一致。
    • 重启 Redis 服务,自动加载 RDB 文件。
  3. 构建新集群
    • 使用 redis-cli --cluster create 命令将新节点组成集群,并分配槽位。

四、云平台迁移(以阿里云为例)

若涉及云平台(如从自建集群迁移到云托管 Redis),可通过以下方式:

1. 使用云平台迁移工具
  • 阿里云 Redis 提供 数据迁移工具,支持从自建集群或其他云厂商迁移数据:
    1. 登录阿里云 Redis 控制台,选择“数据迁移”。
    2. 配置源集群(自建 Redis 集群)和目标集群(阿里云 Redis 集群)信息。
    3. 启动全量迁移,完成后切换业务流量。
2. 手动迁移(适用于小数据量)
  • 通过 redis-cli 或第三方工具(如 redis-trib.rb)将数据逐个槽位迁移到云集群。

五、注意事项

  1. 数据一致性
    • 迁移过程中避免写入操作,或使用增量同步(如 --replicate 参数)确保最终一致性。
  2. 版本兼容性
    • 跨大版本(如 Redis 4.x → 6.x)迁移时,需注意新特性和废弃命令的影响。
  3. 监控与回滚
    • 迁移期间监控集群状态(内存、CPU、网络延迟)。
    • 提前备份旧集群数据,以便迁移失败时快速回滚。
  4. 流量切换
    • 迁移完成后,通过修改 DNS 或负载均衡配置,将业务流量切换到新集群。

六、常用命令总结

命令说明
CLUSTER REPLICATE <nodeID>将当前节点设置为指定节点的从节点
redis-cli --cluster reshard <IP:port> --from <srcID> --to <dstID>迁移槽位和数据到目标节点
redis-migrate-tool --from-uri --to-uri官方迁移工具,支持跨版本和架构迁移
SAVE / BGSAVE生成 RDB 快照
根据实际场景选择合适的迁移方案,建议先在测试环境演练,确保流程可靠后再执行生产环境迁移。

相关文章:

  • 本溪网站开发杭州网站建设公司
  • 北京市建设工程信息重庆网站搜索引擎seo
  • 建筑标准下载网站软文营销步骤
  • 中文的网站做不成二维码大的网站建设公司
  • 郑州做网站建设哪家好免费留电话的广告
  • 外国大气网站今日热点新闻事件摘抄
  • Lambda 表达式遍历集合的原理
  • 函数[x]和{x}在数论中的应用
  • Java程序实现了金额数字转大写的功能
  • 【linux】umask权限掩码
  • 李沐《动手学深度学习》| 4.4 模型的选择、过拟合和欠拟合
  • 【linux】全志tina分区表挂载的脚本路径
  • 前端融球效果原理讲解+具体实现+模糊度,对比度基础教学
  • 2025年- H50-Lc158 --25. k个一组翻转链表(链表,双指针,虚拟头节点)--Java版
  • 初学Transformer架构和注意力机制
  • 【FastAPI】--进阶教程1
  • 创新技术,重塑图片处理新方式
  • 恒坤新材闯上市:利润受益于大额补贴,产能利用率低仍要募资扩产
  • 【黑马点评】redis实战
  • 学习日记-day15-5.25
  • 【Linux】进程 信号的产生
  • 【医学影像 AI】探索 MONAI:医学影像 AI 的综合框架
  • redis集群配置
  • 【python实战】中国主要城市经济统计数据分析与预测
  • 【zabbix】--安装部署
  • 2025郑州台球展/台球厅地毯展/台球灯展/河南台球器材展