hello云胜

技术与生活

0%

备节点failover失败

今天redis集群遇到一个故障

1:S 18 Jul 2023 06:48:30.029 # Currently unable to failover: Disconnected from master for longer than allowed. Please check the ‘cluster-replica-validity-factor’ configuration option.

这个报错是说,备节点的数据太老了,没有办法 failover成主节点。

让我们检查cluster-replica-validity-factor参数。

cluster-replica-validity-factor

这个参数是控制什么样的从节点可以进行faiover(故障转移),变成master节点。

如果一个从节点的数据太旧了,就不能faiover成master

但是并没有一个简单的办法可以准确的判断数据的新旧程度。redis会进行下面两个判断逻辑

1、 选主从同步offset最大的

2、 比较同master最后交互的时间。发送ping或者命令都算交互

如果这个时间间隔太长了,这个从节点将不能进行failover

第2点是可以配置的。根据这个公式,得到的是最大的间隔时间

(cluster-node-timeout * cluster-replica-validity-factor) + repl-ping-replica-period

比如,假设node-timeout是30秒,cluster-replica-validity-factor是10

repl-ping-replica-period是主备心跳间隔时间,默认是10秒

那么最后交互时间超过310秒的从节点就不能进行failover

这个从节点数据有效因子如果太大,可能导致比较旧的从节点failover成主节点。

如果太小,又可能导致没有从节点能failover成主节点。

为了保持最高的高可用性,可以将replica-validity-factor设置为0.

这样从节点总会尝试进行failover

我的错

我用的这几个配置都是默认值,按理说问题不大。

继续查看redis日志,发现是之前主从一直同步失败。

原因是之前的配置文件没有配置masterauth。所以一直无法同步数据,进而导致从节点的数据过时。

这里需要补充我之前文章里的一个错误

就是这个文档,

image-20230719144940893

configmap里的redis.conf里忘记配masterauth了。