詳解Jedis連線池報錯處理

2022-07-08 10:42:19 字數 1694 閱讀 4508

在使用jedis連線池模式下,比較常見的報錯如下:

redis.clients.jedis.exceptions.jedisconnectionexception:could not get a resource from the pool

已華為雲的分布式快取服務(redis)為例,首先確認例項是正常執行中狀態,然後按以下步驟進行排查。

網路

1.        核對ip位址配置

檢查jedis客戶端配置的ip位址是否與快取例項配置的子網位址一致,如果從公網訪問,則檢查是否與快取例項繫結的彈性ip位址一致,不一致則修改一致後重試。

2.        測試網路

在客戶端使用ping和telnet小工具測試網路。

如果ping不通:

−          vpc內訪問時,要求客戶端與快取例項的vpc相同,安全組相同或者快取例項的安全組放開了6379埠訪問。

−          公網訪問時,要求快取例項安全組放開36379埠訪問。

檢查連線數是否超限

檢視已建立的網路連線數是否超過jedispool 配置的上限。如果連線數接近配置的上限值,則建議重啟服務觀察。如果明顯沒有接近,排除連線數超限可能。

unix/linux系統使用:

netstat-an | grep 6379 | grep established | wc -l

windows系統使用:

netstat-an | find "6379" | find "established" /c

檢查jedispool連線池**

如果連線數接近配置的上限,請分析是業務併發原因,或是沒有正確使用jedispool所致。

對於jedispool連線池的操作,每次呼叫jedispool.getresource()方法之後,需要呼叫jedispool.returnresource()或者jedis.close()進行釋放,優先使用close()方法。

客戶端time_wait是否過多

通過ss -s檢視time wait鏈結是否過多。

如果time_wait過多,可以調整核心引數(/etc/sysctl.conf):

##當出現syn等待佇列溢位時,啟用cookies來處理,可防範少量syn攻擊 

net.ipv4.tcp_syncookies = 1 

##允許將time-waitsockets重新用於新的tcp連線 

net.ipv4.tcp_tw_reuse = 1 

##開啟tcp連線中time-wait sockets的快速** 

net.ipv4.tcp_tw_recycle = 1 

##修改系統預設的timeout時間 

net.ipv4.tcp_fin_timeout = 30

調整後重啟生效:/sbin/sysctl -p

無法解決問題

如果按照以上原因排查之後還有問題,可以通過抓包並將異常時間點、異常資訊以及抓包檔案傳送給華為雲技術支援協助分析。

抓包可使用tcpdump工具,命令如下:

tcpdump-i eth0 tcp and port 6379 -n -nn -s 74 -w dump.pcap

公網訪問時請將埠改成36379。

網絡卡名請改成實際的網絡卡名稱。

jedis 連線池配置詳解

最大活動物件數 redis.pool.maxtotal 1000 最大能夠保持idel狀態的物件數 redis.pool.maxidle 100 最小能夠保持idel狀態的物件數 redis.pool.minidle 50 當池內沒有返回物件時,最大等待時間 redis.pool.maxwaitmi...

Jedis連線池的使用

所需jar jedis 2.1.0.jar和commons pool 1.5.4.jar jedis操作步驟如下 1 獲取jedis例項需要從jedispool中獲取 2 用完jedis例項需要返還給jedispool 3 如果jedis在使用過程中出錯,則也需要還給jedispool packag...

Jedis連線池的使用

所需jar jedis 2.1.0.jar和commons pool 1.5.4.jar jedis操作步驟如下 1 獲取jedis例項需要從jedispool中獲取 2 用完jedis例項需要返還給jedispool 3 如果jedis在使用過程中出錯,則也需要還給jedispool 如下 pac...