在使用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...