Redis集群中节点更换IP后实现恢复集群且保留数据

 更新时间:2026年03月03日 09:00:59   作者:洒满阳光的午后  
本文介绍了如何在Redis集群中更改节点IP地址,并通过修改cluster-config-file文件中的IP地址并重启所有节点,成功恢复集群

前段时间在生产中遇到一个问题,即系统需要从一个网段迁移到另一个网段。我们知道redis集群在创建时是指定了节点的ip:port,因此在节点IP变更后,集群自然就失效了。如果需要恢复集群怎么办?

当然在大部分情况下,我们可以选择删除所有节点的数据文件dbfilename、持久化文件appendfilename、集群配置文件cluster-config-file,然后重建集群。但是如果需要保留数据,又该怎么操作呢?

以一个三主三从的单副本集群来演示恢复过程

[root@test1 bin]# ./redis-cli -a password --cluster check 192.168.66.101:7000
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.66.101:7000 (d1ddeaa7...) -> 334 keys | 5461 slots | 1 slaves.
192.168.66.102:7003 (d21ce248...) -> 341 keys | 5462 slots | 1 slaves.
192.168.66.101:7001 (bb5c5e76...) -> 325 keys | 5461 slots | 1 slaves.
[OK] 1000 keys in 3 masters.
0.06 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.66.101:7000)
M: d1ddeaa7c77e35b3df50953fc09834b662cbac8b 192.168.66.101:7000
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: d21ce2482179af3b76a9f29d870848bae18a3214 192.168.66.102:7003
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 089b2e16dff1f68c399a1efc73580e7cbbbfa71b 192.168.66.101:7002
   slots: (0 slots) slave
   replicates d21ce2482179af3b76a9f29d870848bae18a3214
S: 92d8208b582c6111bd383b6fdfc2d80a86f47350 192.168.66.102:7005
   slots: (0 slots) slave
   replicates d1ddeaa7c77e35b3df50953fc09834b662cbac8b
S: ea68bec54e3deb0bd209f151151098ae6d8cf0b4 192.168.66.102:7004
   slots: (0 slots) slave
   replicates bb5c5e768ab4aff9c92d7fd3f2d55007e2736c65
M: bb5c5e768ab4aff9c92d7fd3f2d55007e2736c65 192.168.66.101:7001
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

将集群中所有节点的IP由192.168.66.*更换为192.168.77.*,此时如果尝试检查集群状态,可以看到集群仍然尝试连接192.168.66.*网段的节点:

[root@test1 bin]# ./redis-cli -a password --cluster check 192.168.77.101:7000
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
Could not connect to Redis at 192.168.66.102:7003: Connection timed out
......

shutdown所有节点。

找到节点配置文件中cluster-config-file,此字段配置集群配置文件的保存位置(本示例中为/data/redis/cluster/7000/nodes_7000.conf),查看该文件内容:

[root@test1 ~] cat /data/redis/cluster/7000/nodes_7000.conf
d1ddeaa7c77e35b3df50953fc09834b662cbac8b 192.168.66.101:7000@17000 myself,master - 0 1626244031000 1 connected 0-5460
ea68bec54e3deb0bd209f151151098ae6d8cf0b4 192.168.66.102:7004@17004 slave bb5c5e768ab4aff9c92d7fd3f2d55007e2736c65 0 1626
244034813 5 connected
d21ce2482179af3b76a9f29d870848bae18a3214 192.168.66.102:7003@17003 master - 0 1626244033803 4 connected 5461-10922
089b2e16dff1f68c399a1efc73580e7cbbbfa71b 192.168.66.101:7002@17002 slave d21ce2482179af3b76a9f29d870848bae18a3214 0 1626
244032793 4 connected
bb5c5e768ab4aff9c92d7fd3f2d55007e2736c65 192.168.66.101:7001@17001 master - 0 1626244030770 2 connected 10923-16383
92d8208b582c6111bd383b6fdfc2d80a86f47350 192.168.66.102:7005@17005 slave d1ddeaa7c77e35b3df50953fc09834b662cbac8b 0 1626
244031782 6 connected
vars currentEpoch 6 lastVoteEpoch 0

将所有节点的cluster-config-file文件中的IP地址均由192.168.66.*改为192.168.77.*:

# 192.168.66.101 执行
sed -i 's/192.168.66/192.168.77/g' /data/redis/cluster/7000/nodes_7000.conf /data/redis/cluster/7001/nodes_7001.conf /data/redis/cluster/7002/nodes_7002.conf

# 192.168.66.102 执行
sed -i 's/192.168.66/192.168.77/g' /data/redis/cluster/7003/nodes_7003.conf /data/redis/cluster/7004/nodes_7004.conf /data/redis/cluster/7005/nodes_7005.conf

启动所有节点。

再次检查集群状态

[root@test1 bin]# ./redis-cli -a password --cluster check 192.168.77.101:7000
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.77.101:7000 (d1ddeaa7...) -> 334 keys | 5461 slots | 1 slaves.
192.168.77.102:7003 (d21ce248...) -> 341 keys | 5462 slots | 1 slaves.
192.168.77.101:7001 (bb5c5e76...) -> 325 keys | 5461 slots | 1 slaves.
[OK] 1000 keys in 3 masters.
0.06 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.77.101:7000)
M: d1ddeaa7c77e35b3df50953fc09834b662cbac8b 192.168.77.101:7000
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 92d8208b582c6111bd383b6fdfc2d80a86f47350 192.168.77.102:7005
   slots: (0 slots) slave
   replicates d1ddeaa7c77e35b3df50953fc09834b662cbac8b
M: d21ce2482179af3b76a9f29d870848bae18a3214 192.168.77.102:7003
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: bb5c5e768ab4aff9c92d7fd3f2d55007e2736c65 192.168.77.101:7001
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 089b2e16dff1f68c399a1efc73580e7cbbbfa71b 192.168.77.101:7002
   slots: (0 slots) slave
   replicates d21ce2482179af3b76a9f29d870848bae18a3214
S: ea68bec54e3deb0bd209f151151098ae6d8cf0b4 192.168.77.102:7004
   slots: (0 slots) slave
   replicates bb5c5e768ab4aff9c92d7fd3f2d55007e2736c65
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

[root@test1 bin]# ./redis-cli -a password --cluster info 192.168.77.101:7000 
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.77.101:7000 (d1ddeaa7...) -> 334 keys | 5461 slots | 1 slaves.
192.168.77.102:7003 (d21ce248...) -> 341 keys | 5462 slots | 1 slaves.
192.168.77.101:7001 (bb5c5e76...) -> 325 keys | 5461 slots | 1 slaves.
[OK] 1000 keys in 3 masters.
0.06 keys per slot on average.

可以看到集群状态已经恢复,key数量与IP变更前一致。

测试一下集群的数据写入和读取

[root@test1 bin]# ./redis-cli -a password -c -h 192.168.77.101 -p 7000       
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.77.101:7000> keys *
  1) "name725"
  2) "name359"

......
192.168.77.101:7000> get name7
"hello\n"
192.168.77.101:7000> get name400
-> Redirected to slot [11448] located at 192.168.77.101:7001
"hello\n"
192.168.77.101:7001> set testkey 'testvalue'
-> Redirected to slot [4757] located at 192.168.77.101:7000
OK
192.168.77.101:7000> get testkey
"testvalue"

原有数据读取正常,新数据写入读取正常,集群恢复。

总结

redis集群节点更换IP后,只需要修改所有节点 cluster-config-file 中的IP地址为新地址,并重启所有节点,集群即可自动恢复。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 基于Redis-Shake实现Redis实时同步的示例代码

    基于Redis-Shake实现Redis实时同步的示例代码

    本文主要介绍了基于Redis-Shake实现Redis实时同步的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11
  • 使用Redis实现数据库对象自增ID的方法

    使用Redis实现数据库对象自增ID的方法

    在分布式项目中,数据表的主键ID一般可能存在于UUID或自增ID这两种形式,UUID好理解而且实现起来也最容易,但是缺点就是数据表中的主键ID是32位的字符串,我们通常会优先考虑使用自增ID来代替UUID使用,所以本文介绍了使用Redis实现生成对象自增ID的方法
    2024-11-11
  • 深入理解Redis内存淘汰策略

    深入理解Redis内存淘汰策略

    本文主要介绍了深入理解Redis内存淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Redis的主从同步问题的一些解决方法

    Redis的主从同步问题的一些解决方法

    Redis的主从同步问题可能会影响数据一致性和可用性,本文介绍了Redis主从同步常见问题的解决方案,下面就来详细的介绍一下,感兴趣的可以了解一下
    2026-01-01
  • redis单节点安装与配置方式

    redis单节点安装与配置方式

    这篇文章主要介绍了redis单节点安装与配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 利用Redis实现SQL伸缩的方法简介

    利用Redis实现SQL伸缩的方法简介

    这篇文章主要介绍了利用Redis实现SQL伸缩的方法,包括讲到了锁和时间序列等方面来提升传统数据库的性能,需要的朋友可以参考下
    2015-06-06
  • Redis中的数据过期策略详解

    Redis中的数据过期策略详解

    这篇文章主要介绍了Redis中的数据过期策略,文中通过示例代码介绍的很详细,相信对大家的理解和学习具有一定的参考借鉴价值,有需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • Redis+Caffeine两级缓存的实现

    Redis+Caffeine两级缓存的实现

    本文主要介绍了Redis+Caffeine两级缓存的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 详解redis数据结构之sds

    详解redis数据结构之sds

    sds是Simple Dynamic String的缩写,译为简单动态字符串,redis使用该结构保存字符串,不同于c中的字符串,redis使用该结构来更方便的进行字符串的处理,需要的朋友可以参考下
    2017-05-05
  • 如何打造redis缓存组件

    如何打造redis缓存组件

    文章介绍了如何使用热插拔AOP、反射、Redis自定义注解和SpringEL表达式来打造一个优雅的Redis缓存组件,通过这种方式,可以重构和简化缓存代码,并提供了Redis配置和自定义注解的详细说明,文章还包含了AOP测试的总结,并鼓励读者参考和支持
    2024-12-12

最新评论