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)
上一篇 2015-04-03 22:12
下一篇 2015-04-04 21:14

相关推荐

  • 正则表达与扩展正则表达

    说到正则表达式那就不得不说grep命令: 1.grep命令的作用:grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。2.格式 2.命令格式 :grep [options] 3.主要参数: gre…

    2017-08-07
  • linux中软链接和硬链接简单说明

    linux链接文件 在 Linux 上文件系统被分成两个部分:数据 (user data) 与元数据 (metadata)。数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如:文件大小、创建时间、所有者等信息。在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含…

    Linux干货 2016-12-05
  • sed的基本用法详解

    在Linux的世界中,有着一个文本三剑客的称呼,它们分别代表grep(文本过滤),sed(流编辑器),awk(gawk)(报告生成器)。 它们是强大的文本处理工具,了解并掌握它们,可以让你对文本的处理更加从容和轻松。 今天我们主要是围绕sed来进行分析。 一、初识sed sed:Stream Editor 从名字上也可以直观的了解到它是一个流编辑工具。何为流…

    Linux干货 2015-06-08
  • 正则表达式的如何使用

    简述:正则表达式主要用于文本的搜索,它表示了搜索文本的过滤条件。根据这些条件,对目标文本朱行进行匹配检查,最后对输出匹配到符合过滤条件的行。 使用:正确高效的使用正则表达式,需要掌握以下基本知识点         1:语法 grep [OPTION] PATTERN FILE……

    Linux干货 2017-06-04
  • 1. linux basic cmd

    一。 国有股加点廉价航空j 1. 2. 二。

    2017-11-13
  • shell脚本之变量类型、算数运算符、条件测试

    一、bash中的变量类型     本地变量:仅对当前shell有效,对其子shell无效             变量赋值:name=value      &n…

    Linux干货 2016-08-15