当前位置:首页 > 问答 > 正文

Redis集群要停了,怎么弄才不出错,安全关机有啥讲究和步骤呢

最重要的一点是,直接粗暴地切断电源或者使用像 kill -9 这样的强制命令来关闭Redis集群是绝对不可取的,这样做会导致数据丢失和集群状态混乱,恢复起来会非常麻烦,安全关机的核心目标是:让数据完整地保存下来,并让集群节点之间有序地退出,彼此知道对方的离开,从而保持集群视图的一致性。

根据Redis官方文档的指导,安全关闭Redis集群的正确方法是逐个节点地、优雅地进行关闭,你不能同时把所有节点都关掉,必须给集群留出时间来处理节点下线的信息。

具体步骤如下:

第一步:准备工作

Redis集群要停了,怎么弄才不出错,安全关机有啥讲究和步骤呢

  1. 确定关闭顺序:虽然理论上可以从任意节点开始,但一个常见的建议是先关闭从节点(Slave),最后关闭主节点(Master),这样做的好处是,即使在这个过程中有客户端还在向主节点写数据,也能保证数据在最后时刻被持久化,如果你先关主节点,集群会进行故障转移,将一个从节点提升为主节点,这虽然不会丢数据,但增加了一次不必要的主从切换。
  2. 通知相关人员:确保所有使用该Redis集群的应用服务已经停止写入操作,最理想的状态是,已经将流量从这台集群上切走,没有任何客户端在连接它,你可以通过Redis自带的命令 redis-cli -h <host> -p <port> CLIENT LIST 来检查是否还有客户端连接。
  3. 备份最新数据(可选但强烈推荐):在执行关机之前,即使你认为数据已经持久化,手动执行一次备份也是一个非常好的习惯,你可以使用 BGSAVE 命令在某个主节点上创建一个RDB快照备份。

第二步:逐个关闭从节点(Slave)

  1. 选择第一个要关闭的从节点,使用Redis命令行工具连接上去。
  2. 执行优雅关闭命令:redis-cli -h <slave_ip> -p <slave_port> SHUTDOWN
    • 这个 SHUTDOWN 命令是关键,它会先执行一次阻塞式的数据保存(SAVE),确保在关闭前将所有内存中的数据同步到磁盘上的RDB文件和高可用性下的增量文件(AOF文件,如果开启了的话),它才会安全地终止Redis进程。
    • SHUTDOWN 相对的是 SHUTDOWN SAVE(默认行为)和 SHUTDOWN NOSAVENOSAVE 表示强制关机不保存数据,在正常关机流程中绝对不要使用
  3. 等待该从节点进程完全退出,你可以通过操作系统的命令(如 ps -ef | grep redis)来确认。
  4. 重复步骤1-3,直到集群中所有的从节点都被安全关闭。

第三步:逐个关闭主节点(Master)

Redis集群要停了,怎么弄才不出错,安全关机有啥讲究和步骤呢

  1. 在所有从节点都关闭后,现在集群中只剩下主节点了,这些主节点此时由于没有从节点复制数据,会处于一种“警告”状态,这是正常的。
  2. 选择一个主节点,同样使用 redis-cli 连接。
  3. 执行同样的优雅关闭命令:redis-cli -h <master_ip> -p <master_port> SHUTDOWN

    同样,这个命令会触发数据保存操作,确保数据的完整性。

  4. 等待进程退出。
  5. 重复步骤2-4,关闭剩余的所有主节点。

第四步:验证与后续

  1. 在所有节点都执行完 SHUTDOWN 后,使用操作系统命令检查是否还有Redis进程残留,确保所有节点都已完全停止。
  2. 如果未来需要重新启动集群,只需要按照你启动集群时的顺序(通常没有严格顺序),逐个启动每个Redis服务实例即可,集群节点启动后,它们会通过内置的Gossip协议自动互相发现,并重新组成集群。

一些额外的讲究和注意事项:

  • 关于数据持久化配置:安全关机依赖 SHUTDOWN 命令的数据保存能力,你需要确保你的Redis配置文件(redis.conf)中已经设置了合理的持久化策略,save 参数(控制RDB快照条件)和 appendonly 参数(是否开启AOF),即使没有到自动触发的保存条件,SHUTDOWN 命令也会强制执行一次保存。
  • 如果遇到节点无法正常关闭:极少数情况下,可能某个节点执行 SHUTDOWN 命令没有响应,这时候不要立即使用 kill -9,你应该先尝试使用 kill 命令(默认是SIGTERM信号),这相当于温和地请求进程退出,Redis会捕获这个信号并尝试执行保存和关闭,只有在 kill 命令也无效的情况下,才考虑 kill -9 作为最后手段,但要清楚这有数据丢失的风险。
  • 集群模式与单机模式的区别:上述流程是针对Redis Cluster集群模式的,如果你使用的是主从哨兵(Sentinel)模式或者仅仅是单机Redis,基本原则是相通的,都是使用 SHUTDOWN 命令来优雅关闭,只是不需要考虑主从节点的关闭顺序,对于哨兵模式,你需要先关闭Redis实例,再关闭Sentinel哨兵进程。

Redis集群的安全关机就像一个有序的撤退过程,核心在于耐心顺序,通过 SHUTDOWN 命令让每个士兵(节点)都能稳妥地处理好自己的任务(保存数据)后再离开,而不是一窝蜂地溃散,只要遵循先从节点、后主节点的顺序,并确保每个节点都使用了正确的关闭命令,就能最大程度地保证数据安全和集群结构的完整性。 参考和整合自Redis官方文档中关于持久化、客户端命令以及集群管理的相关章节)