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.www58058.com/2488

(0)
s19930811s19930811
上一篇 2015-04-03
下一篇 2015-04-04

相關推薦

  • sed工具 vim編輯器

    sed工具:    用法:           sed [option]… 'script' inputfile…      常用選項:           &nbs…

    Linux干貨 2016-08-12
  • Git 分布式 Moosefs + Corosync + DRBD 集群

        對于 Git 集群來說,在不采用存儲陣列的情況下,分布式存儲系統是一個很好的解決方案。目前可使用的分布式文件系統,初步了解了一下,Git 是屬于小文件的應用,因此可考量的我想就只有目前的 Moosefs、Ceph 了,Ceph 目前好似國內應用不多,貌似不太穩定。至于 GlusterFS 其比較適用于大文件的應…

    Linux干貨 2016-02-22
  • n28 第二周作業

    n28 第二周作業

    Linux干貨 2017-12-09
  • 軟件包管理–RPM YUM

    包管理器 二進制應用程序的組成部分 二進制文件,配置文件,說明文檔,庫文件 程序包管理器 Debian  deb文件  dpkg包管理器 Redhat  rpm文件  rpm包管理器                   &nbsp…

    Linux干貨 2016-08-21
  • 線上多服務管理工具實例剖析

    原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://nolinux.blog.51cto.com/4824967/1583156        公司線上對nginx、tomcat和jar包的java應用的服務管理腳本之前都是單獨分離開…

    Linux干貨 2016-08-15
  • 設計模式 ( 二十 ) 訪問者模式Visitor(對象行為型)

    特此說明:對訪問者模式理解不是特別透徹,若有誤,請指正,謝謝! 1.概述 在軟件開發過程中,對于系統中的某些對象,它們存儲在同一個集合collection中,且具有不同的類型,而且對于該集合中的對象,可以接受一類稱為訪問者的對象來訪問,而且不同的訪問者其訪問方式有所不同。 例子1:顧客在超市中將選擇的商品,如蘋果、圖書等放在購物車中,然后到收銀員處付款。在購…

    Linux干貨 2015-04-07
欧美性久久久久