redis客户端连接异常
本文参考:http://mdba.cn/2015/04/02/redistwemproxy-%e5%ae%a2%e6%88%b7%e7%ab%af%e8%bf%9e%e6%8e%a5%e5%bc%82%e5%b8%b8/
对于一个DBA,客户端连接异常问题可以说是家常便饭的事情,处理多了都想吐。
root cause无疑发生在三个地方,先找自身的原因,依次排查下去:
1)服务器端db的负载,如果负载太高,创建socket太慢引起超时。另外服务器端socket的个数太多,也可以导致创建连接需要很长的时间或者创建连接不成功。
2)网络是够有抖动,包括lvs/twemproxy重启操作。
3)客户端的连接配置参数是否合理,连接池的大小,超时参数大小。还有客户端服务器的状态,负载和tcp连接状况。
下面是近三个工作日碰到的redis/twemproxy连接问题。
1、不合理的jedispool配置,连接池设置的太小
错误信息:
daemon prio=10 tid=0x00002ab367888000 nid=0x1881 in Object.wait()
[0x00002ab3e5754000] java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1315)
at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557)
...
监控的连接数显示:redis的连接数每秒维持在200+个, 比较正常。
jedispool配置:最大允许创建的连接个数为50个,相比连接数,这个值偏小。
解决方法:
1)增大连接池的大小,但是不要太大,避免客户端和服务器端维持大量的空闲了连接。
2)可以设置minIdle和EvictIdle的时间,加快获取连接对象和释放空闲的连接。
3)设置testOnBorrow=True参数,每次get连接时候进行连接有效性检测。
ps:jedis/jedispool的很多默认参数配置并不适合用,需要按照应用需求何求调整。
下面提供一个供参考的redis配置文件:
<bean name="poolConfig" class="org.apache.commons.pool2.impl.GenericObjectPoolConfig">
<property name="maxTotal" value=""/>
<property name="maxIdle" value=""/>
<property name="minIdle" value=""/>
<property name="testOnBorrow" value="true" />
</bean> <bean name="jedisCluster" class="redis.clients.jedis.JedisCluster" scope="singleton">
<constructor-arg index="">
<!-- 配置redis集群节点地址 -->
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="" value="${redis.ip1}"/>
<constructor-arg index="" value="${redis.port1}" type="int"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="" value="${redis.ip2}"/>
<constructor-arg index="" value="${redis.port2}" type="int"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="" value="${redis.ip3}"/>
<constructor-arg index="" value="${redis.port3}" type="int"/>
</bean>
</set>
</constructor-arg>
<!-- timeout: 超时时间 -->
<constructor-arg index="" value=""/>
<!-- maxRedirections: 最大重定向 -->
<constructor-arg index="" value=""/>
<!-- 连接池 -->
<constructor-arg index="" ref="poolConfig"/>
</bean>
2、没有返回连接对象
错误信息:
an error occurred when executing function getJedis(): Could not get a resource from the pool
jedispool连接池的使用方式:
Jedis jedis = JedisFactory.jedisPool.getResource();
try{
jedis.set("key","val");
}
finally {
JedisFactory.jedisPool.returnResource(jedis);
}
连接使用完之后,需要归还到连接池中。
3、容错处理
网络链路并不能保证绝对的稳定,db服务也不能提供99.999%的可靠服务。代码需要能够捕获异常和异常处理,而不是应用程序报错。
redis客户端连接异常的更多相关文章
- Redis客户端连接以及持久化数据(三)
0.Redis目录结构 1)Redis介绍及部署在CentOS7上(一) 2)Redis指令与数据结构(二) 3)Redis客户端连接以及持久化数据(三) 4)Redis高可用之主从复制实践(四) 5 ...
- 使用redis客户端连接windows和linux下的redis并解决无法连接redis的问题
搭建环境:linux是centos7.4(请注意centos7以下版本的防火墙跟centos7以上的不同,使用redis客户端连接redis时会有区别,建议使用centos7以上版本) 一.下载red ...
- C#两大知名Redis客户端连接哨兵集群的姿势
前言 前面利用<Docker-Compose搭建Redis高可用哨兵集群>, 我们的思路是将Redis.Sentinel.Redis Client App链接到同一个网桥网络,这个网桥内的 ...
- Redis客户端连接池
使用场景 对于一些大对象,或者初始化过程较长的可复用的对象,我们如果每次都new对象出来,那么意味着会耗费大量的时间. 我们可以将这些对象缓存起来,当接口调用完毕后,不是销毁对象,当下次使用的时候,直 ...
- Redis 客户端连接
Redis 通过监听一个 TCP 端口或者 Unix socket 的方式来接收来自客户端的连接,当一个连接建立后,Redis 内部会进行以下一些操作: 首先,客户端 socket 会被设置为非阻 ...
- Redis客户端连接
Redis接受上配置监听TCP端口和Unix套接字客户端的连接,如果启用.当一个新的客户端连接被接受,如有以下操作进行: 客户端套接字置于非阻塞状态,因为Redis的使用复用和非阻塞I/O操作. TC ...
- redis客户端连接到服务器的步骤
和大多数客户端连接到服务器一样,redis-cli连接到服务器也主要分为两个阶段,请求连接阶段和数据传送阶段.具体来讲redis-cli做的事情有: 1.以socket方式建立连接: 2,选择相应的数 ...
- redis客户端连接服务端the version of redis server is too low to support this function错误
redis作为一个内存数据库,使用得当可以大大的提升系统运行的效率,据说能读的速度是110000次/s,写的速度是81000次/s,我们的其中一个系统就用到了这个. 由于之前负责这个的同事离职,只好临 ...
- 用StackExchange.Redis客户端连接阿里云Redis服务遇到的问题
阿里云推荐的Redis服务.NET客户端是ServiceStack.Redis,但ServiceStack.Redis不支持异步,不支持.NET Core,于是尝试使用StackExchange.Re ...
随机推荐
- Nvelocity用法
NVelocity用法 NVelocity是一个基于.NET的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由.NET代码定 ...
- python之路-Mysql&&ORM
1. 数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库, 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据. 我们也可以 ...
- MFC窗口乱弹问题
操作过程将子窗口放到主窗口的OnInitDialog函数和OnPaint函数中调用,在本机没有异常,放到其他机器上发现子窗口莫名其妙的被调用,跟踪发现主窗口这两个函数不止调用一次,中间会因为其他如按钮 ...
- Redis(二) 扩展
事务multi ... exec 之间的操作先进入等待队列,到exec时一起执行 事物的所有操作结果都是一起返回的,所以前一条指令的结果无法作为后一条指令的参数 ...
- WebLogic 中的基本概念
完全引用自: WebLogic 中的基本概念 WebLogic 中的基本概念 上周参加了单位组织的WebLogic培训,为了便于自己记忆,培训后,整理梳理了一些WebLogic的资料,会陆续的发出来, ...
- flash中网页跳转总结
浏览器中,程序同时跳转两个网页地址,第一个地址不会跳转,只会跳转第二个地址,如果第二个地址做延时,则第一个正常跳转,第二个地址会被拦截: 浏览器中,接口返回事件的函数中不能程序跳转网页地址. 这两条结 ...
- js从服务器下载文件
通常,将文件绝对路径url作为超链接<a>的链接地址href的值,点击<a>后,浏览器将会尝试请求文件资源,如果浏览器能够辨认文件类型,则将会以预设的打开方式直接打开下载的文件 ...
- tnsnames.ora配置注意(连接新的数据库)
文件地址D:\app\think\product\11.2.0\instantclient_11_2\network\admin\tnsnames.ora# tnsnames.ora Network ...
- django admin后台提示没有static样式相关的文件
问题现象: 将 DEBUG = TEMPLATE_DEBUG = False 设置为False后,访问admin的管理后台,没有样式了. 解决办法: vim settings.py 确保有下面的这两 ...
- AngularJs自定义指令详解(10) - 执行次序
代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8 ...