千家信息网

redis报错“max number of clients reached"

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,查看redis监控的时候看到redis的graph出现不正常的情况,截图如下:如上面截图所展示的样子,可以看到redis 的客户端连接数很突兀的上升到10K,又突然下降到0.排除了监控本身的原因,很明
千家信息网最后更新 2025年01月21日redis报错“max number of clients reached"

查看redis监控的时候看到redis的graph出现不正常的情况,截图如下:

如上面截图所展示的样子,可以看到redis 的客户端连接数很突兀的上升到10K,又突然下降到0.排除了监控本身的原因,很明显是因为redis本身出了问题。


进入redis服务器,连接上去

/usr/bin/redis-cli -p 6399 -h 127.0.0.1

>127.0.0.1:6399>> info

ERR max number of clients reached

无论执行命令,显示的都是上面的那个错误。这个时候唯一想到的就是redis的客户端已经达到了最大的连接数,无法创建连接了。即redis client可以打开的文件描述符不足

1.获取得到redis:6399这个服务的PID信息

netstat -tunlp | grep 6399

2.获取redis的能够打开的最大文件描述符

cat /proc/PID/limints

可以看上述截图中Max open file这行参数可以看得到进程能够打开的最大文件描述符

3.查看进程打开的文件描述符

方法一:ll /proc/6677/fd | wc -l

方法二:lsof | grep 6399 | wc -l

通过上述方法获取得到的值是10015和10007,可以看得到redis的文件描述符已经使用完毕了。

4.因为redis-cli连接上redis之后无论如何更改出现上面的报错,但是redis server因为是作为缓存使用,不能够随随便便的重启,所以只能在客户端想办法,只能主动让客户端断开连接。所以获取得到6399端口的连接信息:

netstat -tun | grep 6399 | awk '{print $5}' | awk -F':' '{print $1}' | sort | uniq -c

8 10.143.106.95

8 10.143.90.216

5433 10.207.169.67

4788 10.221.236.76

1 10.221.244.39

6 10.225.36.189

在上面的命令可以很明显的获取得到那个IP地址连接redis服务的连接很多

5.进入连接最多的服务器,获得连接redis的客户端信息

netstat -tun | grep 6399

lsof -i:Port

根据上面俩个命令可以获得客户端的应用服务信息

6.获取得到应用服务信息之后,我们和开发商量之后,只能重启才能让客户端主动断开连接。所以直接重启了应用服务。

7.更改redis配置信息。

重启客户端之后,redis的connect也减少了一部分,这个时候可以连接上redis了。

a)获取redis的状态信息

>127.0.0.1:6399>>info

b)获取redis本地配置文件信息,最大连接数,timeout,tcp-keepalive

>127.0.0.1:6399>> config *

>127.0.0.1:6399>> config get maxclients

"10000"

>127.0.0.1:6399>> config get timeout

0

>127.0.0.1:6399>> config get tcp-keepalive

0

c)从上面命令可以看得出,最大连接数是10000,timeout和tcp-keepalive并没有开启,但是又不能重启redis-server,所以只能在线修改配置信息。

>127.0.0.1:6399>> config set maxclients=100000

OK

>127.0.0.1:6399>> config set timeout = 300

OK


做完上面措施之后,客户端连接数也已经断开。


问题产生的原因:

1.zabbix监控获取得到的值为什么是0

zabbix server上面执行

zabbix_get -s 0.0.0.0 -k 'redis[connect client,6399]'

0

原因是因为在agent段redis脚本抓取info信息的时候,对于不是数字类型的数据替换成0,所以导致zabbix 监控获取得到的数值是0

2.为什么有这么多的连接

线上的架构是

client ->VIP->server #VIP指的是负载均衡

客户端和服务的连接的中间是通过VIP进行转发的,他们直接的通信是TCP/IP四层的通信,在VIP上面本身自己是有做timeout设置的,默认20min ,它会主动的断开连接,但是却没有通知client和server端,导致client和server端并不清楚自己已经断开了连接。但是由于client的代码并没有设置主动断开连接,所以client会认为自己是一直连接的状态,等到下一次它发起请求的时候,VIP会告诉client连接已经断开,client会重新在创建一个新的连接;对于server端来说即redis它本身也没有开启timeout和tcp-keepalive的,所以server端也不会主动的断开连接,所以连接会越来越多,导致连接数完全被使用完。


信息 客户 客户端 服务 文件 最大 时候 主动 命令 监控 原因 应用服务 截图 方法 面的 应用 配置 明显 服务器 状态 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 创造与魔法怎么维修服务器 如何清理服务器内存 打开数据库sql 服务器分之1=多少 河北师大网络安全实验室 抚顺 软件开发 统计数据库字段重复 华为服务器管理软件bmc ecu软件开发用什么语言开发 对于计算机网络技术未来的打算 广州元信互联网科技有限公司 烟台善通软件开发有限公司 海口联合农商银行软件开发 中学生网络安全问题论文 服务器数据库管理和数据备份 2022网络安全会议时间 在云服务器里怎么打开进程管理 tp5添加数据库一个字段 机房里如何手动重启服务器 湖南全球软件开发大会 数据库的哪个更好用 会计软件开发正式最新版 H3C服务器来电开机 张槎深信服网络安全号 曲靖云图软件开发有限公司 mysql访问不同数据库 电信运营商履行网络安全主题责任 厦门市网宁软件开发 安徽网络安全培训服务机构 商业银行数据库管理实践 王飞鹏
0