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

相關推薦

  • Mariadb數據庫備份恢復系列(二):xtrabackup物理備份工具之完全備份

    實驗二:利用xtrabackup+二進制日志實現完全備份和恢復數據庫 1、安裝xtrabackup軟件包 2、驗證數據的存儲引擎類型 3、查看數據初始狀態 4、利用innobackupex進行完全備份 5、進行apply-log操作 6、查看備份出來的文件的信息 7、模擬在完全備份后,對數進行修改,以測試通過二進制日志還原完全備份后尚未來得及備份的變化的數據…

    Linux干貨 2016-11-24
  • Linux 第四天: (07月28日) 練習和作業

    Linux 第四天: (07月28日) 練習和作業         定義別名命令baketc, 每天將/etc/目錄下所有文件, 備份到/testdir獨立的子目錄下, 并要求子目錄格式為backupYYYY-mm-dd, 備份過程可見 alias baketc='cp -a /etc/ /testdir/b…

    Linux干貨 2016-08-08
  • yum的簡單配置與使用

    yum 的基本配置與使用 1、yum:是rpm包管理器的前端工具,它是基于C/S結構,就客戶端服務器模式 2、yum使用前需先配置好服務端的倉庫(yum源) 3、yum客戶端是通過文件傳輸協議來獲取到yum源上的軟件包的,yum一共支持四種傳輸協議 http:// https:// ftp:// file:// (這是一個本地路徑,當yum源為本地光盤時,使…

    Linux干貨 2017-06-11
  • Javascript 裝載和執行

    一兩個月前在淘寶內網里看到一個優化Javascript代碼的競賽,發現有不少的人對Javascript的執行和裝載的基礎并不懂,所以,從那天起我就想寫一篇文章,但一直耽擱了。自上篇《瀏覽器渲染原理簡介》,正好也可以承前啟后。 首先,我想說一下Javascript的裝載和執行。通常來說,瀏覽器對于Javascript的運行有兩大特性:1)載入后馬上執行,2)執…

    Linux干貨 2016-07-10
  • 關于大型網站技術演進的思考(一):存儲的瓶頸(1)

    原文出處: 夏天的森林  前不久公司請來了位互聯網界的技術大牛跟我們做了一次大型網站架構的培訓,兩天12個小時信息量非常大,知識的廣度和難度也非常大,培訓完后我很難完整理出全部聽到的知識,今天我換了個思路是回味這次培訓,這個思路就是通過本人目前的經驗和技術水平來思考下大型網站技術演進的過程。 首先我們要思考一個問題,什么樣的網站才是大型網…

    Linux干貨 2015-02-26
欧美性久久久久