转载

Redis Cluster FlushAll失败

温馨提示:
本文最后更新于 2023年02月01日,已超过 698 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

问题背景

Flush是一个极少用到的操作,不过既然碰到过诡异的现象,也记录在此。

问题场景是在Reids Cluster中使用主从模式,向主节点发送flush命令,预期主从节点都会清空数据库。但是诡异的现象出现了,我们得到的结果是主从节点发生了切换,并且数据并没有被清空。

问题分析

分析以上case,Redis采用单线程模型,flush操作执行的时候会阻塞所有其它操作,包括集群间心跳包。当Redis中有大量数据的时候,flush操作会消耗较长时间。所以该节点较长时间不能跟集群通信,当达到一定阈值的时候,集群会判定该节点为fail,并且会切换主从状态。

Redis采用异步的方式进行主从同步,flush操作在主节点执行完成之后,才会将命令同步到从节点。此时老的从节点变为了主节点,它不会再接受来自老的主节点的删除数据的操作。

当老的主节点flush完成的时候,它恢复与集群中其它节点的通讯,得知自己被变成了从节点,所又会把数据同步过来。最终造成了主从节点发生了切换,并且数据没有被清空的现象。

解决方案

解决方式:临时调大集群中所有节点的cluster-node-timeout参数

port 7000  //7000-7005
cluster-enabled yes   //开启集群
cluster-config-file nodes.conf  //保存节点配置,自动创建,自动更新
cluster-node-timeout 5000    //集群超时时间,节点超过这个时间没反应就断定是宕机
appendonly yes   //存储方式,aof,将写操作记录保存到日志中
我是将 cluster-node-timeout 设置为了5000000 待数据清理完以后回复参数 重启集群
正文到此结束
本文目录