Redis连接错误的情况总结分析

 更新时间:2019年02月06日 08:44:35   作者:panyanyany  
这篇文章主要给大家总结介绍了关于Redis连接错误的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言

最近由于流量增大,redis 出现了一连串错误,比如:

  • LOADING Redis is loading the dataset in memory
  • use of closed network connection
  • connection pool exhausted
  • connection refuse by peer

一个个来分析。

LOADING Redis is loading the dataset in memory

这里至少有2种可能

  • 可用内存太小,修改 redis.conf 中的 maxmemory 即可解决
  • redis 在启动时正在加载 dump.rdb 文件,由于加载比较慢导致 redis 在启动时不可用

我遇到的就是第2种情况,AWS在自动扩容的时候,每个新产生的 EC2 实例都报错,原因就是 redis 在启动时发现有个 dump.rdb,然后就去加载它,导致服务器里的服务都报错,然后就退出了,并且 redis 加载这个要好久(不知道为什么),supervisord 自动重启了新的服务后依然报错。

后来把镜像中的 dump.rdb 文件删了,服务才能正常启动。

dump.rdb 文件产生的原因可能是之前 redis 出现了某种错误,然后在制作镜像时也做进去了,导致新生成的实例个个都报错。

这次吸取了教训,下次制作镜像之前都要先 stop 掉 redis 然后删掉 dump.rdb 。

其他3种错误

一开始也是各种找资料,然后各种改配置,导致这3种错误都先后出现。

一开始我认为是 golang 代码没有正确处理 redis 连接异常的情况,于是各种升级 redigo,改 golang 中的 timeout 、max_active、wait 等的配置,发现都没有用。

这样来来回回折腾了大概一周,终于从 pool.Active 和 pool.MaxActive 中发现了猫腻。

因为我 MaxActive 设置的是 10000,于是我开了 10000 个 go runtine 去测试它,发现当前连接数 pool.Active 老是才 4000 左右,然后就各种报错。

那段时间也是脑子短路了,老是认为 redigo 没有正确处理 redis 的连接才导致 pool.Active 不能上到最大。老是想着改 redigo 的代码……

后来实在没办法,想着去改一改 ulimit,旧的是 500000,改到 990000,发现还是报连接错误,pool.Active 还是上不去,我想这不可能啊,这才想到会不会是 redis 本身有最大连接数的配置。上网一查,果然,redis-server 有一个 maxclients 的配置……默认是 4000 多,改到 10000 后,整个世界都清静了……

其实也不能怪我,因为 redigo 也有个 max_active 参数,鬼知道 redis-server 还要设置呢 [笑哭]?

Redis 用于高并发服务的配置

Redis 客户端(即 golang 代码)

Wait: true 如果连接池满了,就等待, Redis 处理很快的,等个几微秒用户也感觉不出来什么
IdleTimeout: 5s 一个业务逻辑5s都处理不完,那你应该优化你的代码了。如果设置为0,万一这个连接失踪了服务端就收回不了了,会产生僵尸连接的。

MaxActive: 10000 相当于这个服务器能处理每秒 10000 并发了。

Redis 服务器(即 redis-server)

maxclients 要设置得比 MaxActive 大

附加题:一台服务器的最大文件数怎么算?

linux kernel - Need to “calculate” optimum ulimit and fs.file-max values according to my own server needs - Stack Overflow

this ends up being about 100 for every 1MB of ram.

例,如果是 4G 内存,那么打开文件数最大可以设置为:4 * 1024 * 100 = 409600

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • Redis如何实现分布式锁

    Redis如何实现分布式锁

    这篇文章主要介绍了Redis如何实现分布式锁问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • redis加锁的三种方式小结

    redis加锁的三种方式小结

    本文主要介绍了redis加锁的三种方式小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Redis客户端及服务端的安装教程详解

    Redis客户端及服务端的安装教程详解

    这篇文章主要介绍了Redis客户端及服务端的安装教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • redis命令行查看中文不乱码的方法(十六进制字符串处理)

    redis命令行查看中文不乱码的方法(十六进制字符串处理)

    这篇文章主要给大家介绍了关于redis命令行查看中文不乱码的方法,其中详细介绍了十六进制字符串处理的相关资料,文中给出了详细的示例代码,供大家参考学习,下面随着小编来一起学习学习吧。
    2017-10-10
  • Windows下redis下载、redis安装及使用教程

    Windows下redis下载、redis安装及使用教程

    redis 提供了多种数据类型来支持不同的业务场景,所以经常使用在分布式锁中,今天给大家讲解redis安装及使用教程,感兴趣的朋友跟随小编一起看看吧
    2021-06-06
  • 一文详解Redis中的持久化

    一文详解Redis中的持久化

    这篇文章主要介绍了一文详解Redis中的持久化,持久化功能有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复
    2022-09-09
  • Linux Redis 的安装步骤详解

    Linux Redis 的安装步骤详解

    这篇文章主要介绍了 Linux Redis 的安装步骤详解的相关资料,希望大家通过本文能掌握如何安装Redis,需要的朋友可以参考下
    2017-08-08
  • redis常用命令小结

    redis常用命令小结

    这篇文章主要介绍了redis的一些常用命令,需要的朋友可以参考下
    2014-06-06
  • springmvc集成使用redis过程

    springmvc集成使用redis过程

    这篇文章主要介绍了springmvc集成使用redis过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • redis5.0以上基于密码认证的集群cluster方式

    redis5.0以上基于密码认证的集群cluster方式

    这篇文章主要介绍了redis5.0以上基于密码认证的集群cluster方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11

最新评论