背景:我用 Java 开发了一个 IP 解析程序,用于解析公司某 API 调用入口处的日志信息,主要是统计用户的活跃地区( IP 信息来源主要是百度)。目前每秒钟需要处理三百左右的 IP 信息,使用 Jedis library 。假定部署 Java 程序的服务器为 server-a(centos, java task),部署 redis 程序的服务器为 server-b(ubuntu, redis)
过程:当用户请求来到的时候,查询 redis 中是否已经缓存了该 IP 对应的地区信息,如果没有就从百度查询并且缓存到 redis 中。 redis 目前允许的最大连接数是 10000 。 jedis 配置文件中连接池最大连接数是 1024 ,等待响应时间最大是 3000 ms 。
问题:我的 redis 连接数一直在增加,没过几天就会出现连接达到最大值的错误,但是我的 jedis 配置文件明明只允许 1024 的最大连接数啊,为啥我的 redis 中已经接近 10000 个连接了呢?
我的排查流程:
- 在 server-b(redis) 上执行 "netstat -anp | grep server-a-ip | wc -l" 的确几大千的连接,并且都是 ESTABLISHED 状态。
- 我在 server-a(java task) 上执行 "netstat -anp | grep server-b-ip:6379"。。。然后我就惊讶了,为毛我这里只显示两条链路到达 server-b 呢?是我执行命令的姿势不对吗?
Append: 我通过 server-b 上的 redis monitor 查看 1465701291.014345 [0 server-a-ip:39680] 这类信息,的确只看到了两条链路,两个端口
但是为啥在 server-b 上执行 netstat -anp | grep server-a-ip 时有真么多都处于 ESTABLISHED 状态呢,百思不得其解。