天天看點

詳解Jedis連接配接池報錯處理

聲明:本文并非原創,轉自華為雲幫助中心的分布式緩存服務(Redis)的使用者指南。

在使用Jedis連接配接池模式下,比較常見的報錯如下:

redis.clients.jedis.exceptions.JedisConnectionException:Could not get a resource from the pool

首先确認執行個體是正常運作中狀态,然後按以下步驟進行排查。

網絡

1.        核對IP位址配置

檢查jedis用戶端配置的ip位址是否與緩存執行個體配置的子網位址一緻,如果從公網通路,則檢查是否與緩存執行個體綁定的彈性ip位址一緻,不一緻則修改一緻後重試。

2.        測試網絡

在用戶端使用ping和Telnet小工具測試網絡。

如果ping不通:

−          VPC内通路時,要求用戶端與緩存執行個體的VPC相同,安全組相同或者緩存執行個體的安全組放開了6379端口通路。

−          公網通路時,要求緩存執行個體安全組放開36379端口通路。

−          如果IP位址可以ping通,telnet對應的端口不通,則嘗試重新開機執行個體,如重新開機後仍未恢複,請聯系華為雲技術支援。

檢查連接配接數是否超限

檢視已建立的網絡連接配接數是否超過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。

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

繼續閱讀