redis/twemproxy 客户端连接异常

对于一个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的很多默认参数配置并不适合用,需要按照应用需求何求调整。

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); }

连接使用完之后,需要归还到连接池中。

After each Jedis method call, return the resource pool. Your app has probably used all the threads and waits for some to be 
dropped.This may cause behavior you're explaining and the app is probably blocked.

3、容错处理

网络链路并不能保证绝对的稳定,db服务也不能提供99.999%的可靠服务。代码需要能够捕获异常和异常处理,而不是应用程序报错。

转自:http://mdba.cn/?p=846

原创文章,作者:s19930811,如若转载,请注明出处:http://www.178linux.com/2488

(0)
s19930811s19930811
上一篇 2015-04-03 22:12
下一篇 2015-04-04 21:14

相关推荐

  • 关于大型网站技术演进的思考(十四)–网站静态化处理—前后端分离—上(6)

    原文出处: 夏天的森林   前文讲到了CSI技术,这就说明网站静态化技术的讲述已经推进到了浏览器端了即真正到了web前端的范畴了,而时下web前端技术的前沿之一就是前后端 分离技术了,那么在这里网站静态化技术和前后端分离技术产生了交集,所以今天我将讨论下前后端分离技术,前后端分离技术讨论完后,下一篇文章我将会以网站 静态化技术的…

    Linux干货 2015-03-03
  • bash的基础特性

    1、Bash的命令补全      使用tab键可以实现命令补全或者路径补全 2、Bash的命令行展开      使用~,可以展开为用户的家目录;             例如#cd ~ 表示切换目录到当前用户家目录中   &nbs…

    Linux干货 2016-11-02
  • sed行编辑器与vim编辑器

    一、sed行编辑器   1、简介:sed的本身也是一个管道命令,可以分析标准输入,还可以将数据进行替换、删除、新增、选取特定行的功能   2、工作原理:sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”( pattern space),接着用sed命令处理缓冲区中的内容…

    Linux干货 2016-08-11
  • linux学习第二天知识点-linux入门及使用帮助

    一 基础命令 1. #ifconfig     显示或配置网卡的命令,英文全称是network interfaces configuring。     配置网卡的IP地址语法例:ifconfig eth0 192.168.0.1 netmask 255.255.255.0 2.&…

    Linux干货 2016-07-26
  • 网卡别名的设置

    网卡别名的设置 设备网卡别名对虚拟主机的作用 可以将多个IP地址绑定到一个NIC上 eth0:1 eth0:2 eth0:3 ifconfig命令: 使用ipconfig命令来设置网卡别名 ifconfigeth0:0 192.168.1.100/24 up 使用ip命令来设置网卡别名 ipaddradd 172.16.1.2/…

    Linux干货 2016-09-06
  • linux基础学习第七天-正则表达式及grep

    2016-08-04 授课内容: 各种文本工具来查看、分析、统计文本文件(more、less、cat、cut、sort、wc、uniq、head、tail、paste、diff) grep 正则表达式 扩展正则表达式 【】所有的文本查看、分析、统计等都是只是更改标准输出的显示方式,对原文件内容并没有更改 cat [OPTION]… [FILE]&…

    Linux干货 2016-08-07