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

Redis集群怎么安全关掉再启动,步骤和注意点分享

要理解安全关闭和启动Redis集群的核心目标:防止数据丢失和避免集群状态混乱,Redis集群是分布式系统,不能像单机Redis那样随意重启,需要按顺序操作。

第一部分:安全关闭Redis集群的步骤

关闭集群的顺序很重要,基本原则是先停从节点,再停主节点,并且要确保数据已经持久化到磁盘。

第一步:检查集群当前状态 在开始任何操作之前,先使用Redis命令行工具redis-cli连接上集群中的任意一个节点,执行cluster info命令,你需要重点关注两个指标:

Redis集群怎么安全关掉再启动,步骤和注意点分享

  • cluster_state:这个值应该是ok,表示集群处于正常状态。
  • cluster_slots_ok:这个值应该等于16384(总槽位数),表示所有哈希槽都正常分配。 如果这两个值不正常,说明集群本身就有问题,需要先解决再执行关闭操作,这是为了避免带着问题操作,导致重启后问题加剧。

第二步:选择合适的时间并设置写保护(可选但重要) 为了避免在关闭过程中有新的数据写入,最好在业务低峰期进行操作,一个更稳妥的做法是,将集群设置为只读模式,你可以连接到每个主节点,执行命令:CONFIG SET cluster-require-full-coverage no,这个命令的含义是,即使不是所有哈希槽都可用,也允许集群继续提供读取服务,但更常见的做法是,在应用层面切断写流量,因为Redis集群本身没有提供一个直接对整个集群进行写保护的命令,需要逐个节点设置,且主要影响的是键空间通知等配置,对于普通写入操作,更有效的方式是通过运维手段在负载均衡器或客户端侧停止写请求。

第三步:逐个关闭从节点 现在开始正式关闭,首先关闭所有的从节点,使用redis-cli连接到每一个从节点,执行命令:redis-cli -h [从节点IP] -p [端口] shutdown save。 这里的shutdown save命令非常重要,它告诉Redis在关闭之前执行一次持久化,将内存中的数据保存到磁盘上的RDB文件(如果配置了AOF,也会写入AOF文件),这样可以保证从节点在重启后能加载到最新的数据。 等待一个从节点完全关闭后(可以通过ps aux | grep redis命令确认进程已退出),再关闭下一个,不要同时批量关闭,以便观察日志是否有异常。

第四步:逐个关闭主节点 在确认所有从节点都已经成功关闭后,开始关闭主节点,操作和关闭从节点完全一样:使用redis-cli连接到每一个主节点,执行shutdown save命令。 为什么必须先关从再关主? 因为如果先关闭主节点,集群会触发故障转移,剩余的从节点会竞选成为新的主节点,这时你再关闭这些“新主节点”,集群状态会变得非常复杂,甚至可能导致部分数据不可用,按从节点到主节点的顺序关闭,是一个平滑的缩容过程。

Redis集群怎么安全关掉再启动,步骤和注意点分享

第五步:最终确认 关闭所有节点后,再次检查所有服务器,确保所有的Redis进程都已经结束,你可以通过命令ps -ef | grep redis-server来确认,确保没有残留进程,以免对后续启动造成干扰。

第二部分:安全启动Redis集群的步骤

启动的顺序与关闭相反,基本原则是先启动主节点,再启动从节点

第一步:启动所有主节点 找到集群中所有主节点的配置文件(通常是redis.conf),使用配置文件启动每个主节点的Redis服务,命令类似于:redis-server /path/to/redis.conf &。 关键是要确保启动命令指向正确的配置文件,该配置文件中应包含集群相关的配置,特别是cluster-enabled yes这一行,它声明了这个实例是集群模式。 启动后,先不要急于启动从节点,给主节点一些时间来完成初始化和加载数据。

Redis集群怎么安全关掉再启动,步骤和注意点分享

第二步:检查主节点状态并等待集群识别 逐个连接到你启动的每一个主节点,执行ping命令确认它们可以正常响应,在其中任意一个主节点上执行cluster nodes命令,你可能会发现命令输出中只列出了已经启动的这几个主节点,并且它们之间可能还没有建立起集群联系(显示为fail状态),这是正常的,因为集群需要所有节点(包括未启动的从节点)的参与才能达到完整状态,但目前我们只启动了主节点。

第三步: meet操作(如果需要) 在旧版本的Redis中,如果节点之间无法自动发现,可能需要手动执行cluster meet命令,让主节点互相认识,在节点A上执行cluster meet 节点B的IP 节点B的端口,但在较新的版本中,只要节点配置了相同的集群配置文件且之前已经组成过集群,它们通常能通过存储的集群配置信息自动重新建立连接,你可以先观察几分钟,如果cluster nodes显示节点之间仍然是断开状态,再手动进行meet。

第四步:启动所有从节点 当所有主节点都成功启动,并且彼此之间能够识别(在cluster nodes中能看到其他主节点,即使状态不是connected)后,开始启动所有的从节点,方法和启动主节点一样,使用各自的配置文件启动:redis-server /path/to/redis.conf &

第五步:等待集群状态恢复正常 所有节点启动完毕后,需要给集群一些时间来同步数据和重新建立复制关系,这个过程可能需要几分钟,具体取决于数据量的大小。 持续监控集群状态:

  1. 执行cluster info命令,观察cluster_state是否变为okcluster_slots_ok是否变为16384。
  2. 执行cluster nodes命令,仔细检查输出:
    • 确认所有主节点和从节点都已在列表中。
    • 确认每个主节点后面都跟随着正确的从节点(显示为slave)。
    • 确认所有节点的连接状态都是connected
  3. 可以进行简单的数据读写测试,选择一个主节点,执行setget命令,验证服务是否正常。

重要的注意点总结

  1. 顺序是金科玉律:关闭时“从->主”,启动时“主->从”,记反了很容易导致集群故障转移和状态异常。
  2. 持久化是关键:务必使用shutdown saveshutdown nosave(除非你确定数据可以丢弃,否则绝对不要用nosave)来关闭节点,保证数据落盘。
  3. 耐心等待:分布式系统的状态同步需要时间,在启动过程中,不要因为一时看不到cluster_state:ok就盲目地重复重启操作,那样只会让情况更糟,给集群足够的时间(比如5-10分钟)来自我恢复。
  4. 备份配置文件和数据文件:在操作前,最好备份整个Redis的数据目录(dir配置项指定的路径)和所有节点的配置文件,这是一份重要的保险。
  5. 监控日志:在整个过程中,密切关注每个节点的日志输出(logfile配置项指定的文件),日志会清晰地告诉你节点正在做什么,遇到了什么错误,是排障的最重要依据。
  6. 考虑使用脚本:如果集群节点数量很多,手动逐个操作既繁琐又容易出错,可以提前编写Shell脚本,来自动化执行按顺序关闭和启动的命令,但务必在测试环境充分验证脚本的正确性。

遵循以上步骤和注意点,可以最大程度地保证Redis集群重启操作的安全性和成功率。