READONLY You can't write against a read-only salve

问题描述:
某客户环境突然出现登录和操作任意功能提示错误, READONLY You can't write against a read-only salve.

原因分析:
1、根据错误提示是mservice服务连到了只读的redis节点上,查看redis服务,当前状态是一主两从,并且主为可写,从只读,是正常状态。
2、登录mservice容器查看主进程仍然持有切换前Redis主服务的一至多个TCP连接没有释放。
3、查看sentinel日志,发现在出现问题的时间前redis出现了主从切换的情况。
#12752:X 07 Feb 01:45:04.673 # +sdown master mymaster 10.122.3.58 6380
#12752:X 07 Feb 01:45:04.673 # +sdown sentinel 9b1a02b675333972a7ebb6001bca5d308261d5ca 10.122.3.58 7506 @ mymaster 10.122.3.58 6380
#12752:X 07 Feb 01:45:04.674 # +sdown sentinel 5240f5dc585925289dddb2b42678c15f1a1825f8
10.122.3.58 7506 @ mymaster 10.122.3.58 6380
4、查询sentinel.conf文件,发现配置的哨兵心跳检查间隔参数down-after-milliseconds为3秒。
心跳检测的逻辑:Redis主服务在3秒(down-after-milliseconds)内连续向Sentinel返回PING的无效回复,则Sentinel判定Redis主服务为主观下线状态,如果多数Sentinel均判定Redis主服务为主观下线则形成Redis主服务客观下线的共识,并由主Sentinel实施执行Redis主从切换。
5、由于redis是单线程运行的,而如果Redis负载较高(命令多或者大key操作)或者网络短暂中断等问题,响应超过3秒,均会形成主观下线的判断,最终导致出现主从切换的情况。
解决方案:
为了避免出现redis主从频繁切换的情况,建议做如下参数情况。
1、参数优化
1)优化哨兵心跳检查间隔参数:从3秒改为30秒,官方建议默认是30秒。
# vi sentinel-7505.conf
sentinel down-after-milliseconds mymaster 300
READONLY You can't write against a read-only salve
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



