游乐游手机版
首页/数据库/文章详情

Redis集群节点换IP后恢复并保留数据

时间:2026-06-15 07:02
Redis集群节点更换IP后,依次停止所有节点,修改每个节点集群配置文件(如nodes conf)中的旧IP为新IP,再重启所有节点,即可恢复集群并保留全部数据,无需清库重建。

在生产环境中,IP网段迁移的情况时有发生。Redis集群在初始化时绑定了每个节点的IP:PORT,一旦IP地址发生变化,集群便会陷入瘫痪。若希望保留原有数据并恢复集群正常运行,该如何操作呢?

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

多数场景下,可以直接清空所有节点的数据文件(dbfilename、持久化文件appendfilename、集群配置文件cluster-config-file),而后重新搭建集群。但如果数据不能丢失,就需要采用其他方法。

以三主三从单副本集群为例,演示数据完整的恢复流程

[root@test1 bin]# ./redis-cli -a password --cluster check 192.168.66.101:7000Warning: 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 sla ves.192.168.66.102:7003 (d21ce248...) -> 341 keys | 5462 slots | 1 sla ves.192.168.66.101:7001 (bb5c5e76...) -> 325 keys | 5461 slots | 1 sla ves.[OK] 1000 keys in 3 masters.0.06 keys per slot on a verage.>>> 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) sla ve   replicates d21ce2482179af3b76a9f29d870848bae18a3214S: 92d8208b582c6111bd383b6fdfc2d80a86f47350 192.168.66.102:7005   slots: (0 slots) sla ve   replicates d1ddeaa7c77e35b3df50953fc09834b662cbac8bS: ea68bec54e3deb0bd209f151151098ae6d8cf0b4 192.168.66.102:7004   slots: (0 slots) sla ve   replicates bb5c5e768ab4aff9c92d7fd3f2d55007e2736c65M: 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.*网段。直接执行集群检查,会发现它仍固执地尝试连接旧IP,最终超时报错:

[root@test1 bin]# ./redis-cli -a password --cluster check 192.168.77.101:7000Warning: 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......

首先需要停止所有节点。

关键文件是每个节点中 cluster-config-file 配置项指定的集群配置文件(本例中为 /data/redis/cluster/7000/nodes_7000.conf)。打开查看,里面记录了每个节点的IP和端口:

[root@test1 ~] cat /data/redis/cluster/7000/nodes_7000.confd1ddeaa7c77e35b3df50953fc09834b662cbac8b 192.168.66.101:7000@17000 myself,master - 0 1626244031000 1 connected 0-5460ea68bec54e3deb0bd209f151151098ae6d8cf0b4 192.168.66.102:7004@17004 sla ve bb5c5e768ab4aff9c92d7fd3f2d55007e2736c65 0 1626244034813 5 connectedd21ce2482179af3b76a9f29d870848bae18a3214 192.168.66.102:7003@17003 master - 0 1626244033803 4 connected 5461-10922089b2e16dff1f68c399a1efc73580e7cbbbfa71b 192.168.66.101:7002@17002 sla ve d21ce2482179af3b76a9f29d870848bae18a3214 0 1626244032793 4 connectedbb5c5e768ab4aff9c92d7fd3f2d55007e2736c65 192.168.66.101:7001@17001 master - 0 1626244030770 2 connected 10923-1638392d8208b582c6111bd383b6fdfc2d80a86f47350 192.168.66.102:7005@17005 sla ve d1ddeaa7c77e35b3df50953fc09834b662cbac8b 0 1626244031782 6 connectedvars currentEpoch 6 lastVoteEpoch 0

解决思路十分直接:将所有节点配置文件中的旧IP替换为新IP。在每台机器上执行相应的替换命令即可:

# 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:7000Warning: 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 sla ves.192.168.77.102:7003 (d21ce248...) -> 341 keys | 5462 slots | 1 sla ves.192.168.77.101:7001 (bb5c5e76...) -> 325 keys | 5461 slots | 1 sla ves.[OK] 1000 keys in 3 masters.0.06 keys per slot on a verage.>>> 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) sla ve   replicates d1ddeaa7c77e35b3df50953fc09834b662cbac8bM: 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) sla ve   replicates d21ce2482179af3b76a9f29d870848bae18a3214S: ea68bec54e3deb0bd209f151151098ae6d8cf0b4 192.168.77.102:7004   slots: (0 slots) sla ve   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 sla ves.192.168.77.102:7003 (d21ce248...) -> 341 keys | 5462 slots | 1 sla ves.192.168.77.101:7001 (bb5c5e76...) -> 325 keys | 5461 slots | 1 sla ves.[OK] 1000 keys in 3 masters.0.06 keys per slot on a verage.

可以看到集群状态已恢复正常,各节点间通信畅通,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"hellon"192.168.77.101:7000> get name400-> Redirected to slot [11448] located at 192.168.77.101:7001"hellon"192.168.77.101:7001> set testkey 'testvalue'-> Redirected to slot [4757] located at 192.168.77.101:7000OK192.168.77.101:7000> get testkey"testvalue"

原有数据读取完全正确,新写入的数据也能正常存取,集群功能已完整恢复。

总结

整个恢复过程其实只需三步:停止所有节点 → 修改每个节点的 cluster-config-file 文件中的旧IP为新IP → 重启所有节点。集群会自动识别新IP、保留原有数据,实现无缝恢复。该方法适用于任何网段迁移场景,有效避免了删库重建造成的数据丢失风险。

来源:https://www.jb51.net/database/359508xwi.htm
上一篇Redis热Key问题原因与解决方案实战深度剖析详解 下一篇Redis中StringRedisTemplate的HashOperations使用详解
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Redis 7.0增量AOF重写RDB前导码配置详解
数据库 · 2026-07-02

Redis 7.0增量AOF重写RDB前导码配置详解

先说一个几乎所有人都踩过的典型误区:很多人把 aof-use-rdb-preamble yes 当作开启“增量重写”的开关。实际上,这个配置只干了一件事——让重写后的 AOF 文件头部带上 RDB 快照。它解决的是加载速度问题,跟“增量重写”本身的概念压根不是一回事。真正的增量重写,依赖的是 Red

在Python Tornado异步框架中安全执行SQL命令的方法与最佳实践
数据库 · 2026-07-02

在Python Tornado异步框架中安全执行SQL命令的方法与最佳实践

直接在Tornado里用SQLAlchemy同步执行SQL,结果就是阻塞IOLoop,所谓“异步框架里写同步数据库代码”,等于白搭。安全执行的关键不是“怎么写SQL”,而是“怎么不卡住事件循环”。 为什么不能在RequestHandler里直接调用session execute() 因为sessio

利用SQL触发器实现在INSERT数据时自动同步到审计表
数据库 · 2026-07-02

利用SQL触发器实现在INSERT数据时自动同步到审计表

先说结论:可以用触发器把 INSERT 数据同步到审计表,但必须用 AFTER INSERT,并且审计表的字段顺序、类型、字符集得和源表严格一致。否则,轻则写入错位、数据截断,重则直接报错、丢数据。下面把这些坑一个一个掰开说。 能,但必须用 AFTER INSERT,且审计表字段顺序、类型、字符集要

如何用SQL编写按不同工作日统计员工出勤率
数据库 · 2026-07-02

如何用SQL编写按不同工作日统计员工出勤率

在实际业务中,统计不同工作日的出勤率是HR系统里的高频需求。如果直接按日期函数分组,很容易掉进语言环境、索引失效或分母口径的坑里。下面就来拆解具体的实现要点。 必须用 CASE WHEN 将日期映射为固定 weekday 标签(如 Mon )再分组,避免语言环境导致的分组断裂;需过滤 DOW IN

Spring Boot 3动态拼接SQL为何引发严重安全漏洞
数据库 · 2026-07-02

Spring Boot 3动态拼接SQL为何引发严重安全漏洞

SQL注入漏洞的核心成因,本质上是因为用户输入直接参与了SQL语句的字符串拼接,而未采用参数化绑定机制。在MyBatis中使用${}、QueryWrapper中调用apply()与last()、JPA的@Query注解进行拼接等操作,都会绕过PreparedStatement的安全防护。动态字段必须