在生产环境中,遇到redis配置文件被rewrite,requirepass参数值也被自动加上"",这样对服务存在很大风险,本文基于redis2.8进行分析
问题描述
一般情况,redis配置文件中,requirepass参数值不含有""的
redis配置文件被rewrite后,参数值为字符串的,全部自动加上"",包括requirepass参数;如果redis发生重启,密码就被改变了,程序读写也会发生“认证失败”报错;使用脚本访问redis也会报错。
场景分析
经过分析redis源代码和测试发现,出现rewrite的场景一般是以下两种:
1 执行config rewrite
当手动执行config rewrite时,redis配置文件被rewrite,参数值为字符串的,全部会加上""
2 启用sentinel高可用
使用sentinel高可用框架,redis配置文件出现rewrite的场景通常是如下情况:
情况一:
主库发生故障切换,新主库的配置文件会自动rewrite
情况二:
故障主库重新启动后,会自动成为从库,配置文件也会自动rewrite
原因分析
对于以上场景,redis或sentinel都会调用如下函数:
int
rewriteConfig(
char
*path)
|
该函数的功能就是把内存中的参数值重写到磁盘上
解决方案
了解了rewrite的场景,很显然,我们可以采取以下方案:
方案一:
避免出现场景一;如果redis主库发生故障切换,我们需要手动修正配置文件,去掉""
此方法成本较小,但是无法根治
方案二
修改rewrite函数逻辑,保证rewrite后,不会自动加上""
需要修改源代码,有一定风险,但是可以根治
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30341463/viewspace-1758418/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30341463/viewspace-1758418/