missing-cn 阅读(112) 评论(0)

redis一例连接池连接不上的故障及解决

故障现象描述

  • 应用连接redis出现错误
[ERROR]
java.lang.NullPointerException
        at redis.clients.util.Pool.getActivePool(Pool.java:101)
  • redis本身无错误

故障定位

初步定位应该是出在网络层面

  • 检查网络

    通过zabbix监控看到故障发生时redis主机网卡速度达到几百兆,其他期间只有几十兆。

  • 检查网络突发速度的原因

    故障期间redis备份脚本开始运行

故障分析

备份脚本分析

脚本中通过 redis-cli save 完成备份, save命令需要同步,
所以运行期间其他提交更新的数据操作会被阻塞,直到save命令完成,所以本次故障的原因已经h

故障解决方法

用bgsave命令替换save

采取更多措施避免故障发生

  • 备份脚本从redis的master迁移到slave

    redis master只处理客户端的请求,不再负责备份。

  • 限速备份脚本

    脚本中scp复制rdb文件到备份存储机,scp增加-l 163840 参数,以20MB/s的速度进行拷贝,防止进程占用太多网络带宽。