前段時(shí)間,由于線上redis服務(wù)器的內(nèi)存使用率達(dá)到了機(jī)器總內(nèi)存的50%以上,導(dǎo)致內(nèi)存數(shù)據(jù)的dump持久化一直失敗。擴(kuò)展到多臺(tái)redis后,應(yīng)用系統(tǒng)訪問redis時(shí), 在業(yè)務(wù)量較少時(shí),時(shí)不時(shí)會(huì)出現(xiàn)以下異常,當(dāng)業(yè)務(wù)量較大,redis訪問頻率很高時(shí),卻不會(huì)發(fā)生這個(gè)異常 ,一
前段時(shí)間,由于線上redis服務(wù)器的內(nèi)存使用率達(dá)到了機(jī)器總內(nèi)存的50%以上,導(dǎo)致內(nèi)存數(shù)據(jù)的dump持久化一直失敗。擴(kuò)展到多臺(tái)redis后,應(yīng)用系統(tǒng)訪問redis時(shí),在業(yè)務(wù)量較少時(shí),時(shí)不時(shí)會(huì)出現(xiàn)以下異常,當(dāng)業(yè)務(wù)量較大,redis訪問頻率很高時(shí),卻不會(huì)發(fā)生這個(gè)異常,一時(shí)覺得很詭異。
redis.clients.jedis.exceptions.JedisConnectionException:?It?seems?like?server?has?closed?the?connection.
at?redis.clients.util.RedisInputStream.readLine(RedisInputStream.java:90)?~[jedis-2.1.0.jar:na]
at?redis.clients.jedis.Protocol.processInteger(Protocol.java:110)?~[jedis-2.1.0.jar:na]
at?redis.clients.jedis.Protocol.process(Protocol.java:70)?~[jedis-2.1.0.jar:na]
at?redis.clients.jedis.Protocol.read(Protocol.java:131)?~[jedis-2.1.0.jar:na]
at?redis.clients.jedis.Connection.getIntegerReply(Connection.java:188)?~[jedis-2.1.0.jar:na]
at?redis.clients.jedis.Jedis.sismember(Jedis.java:1266)?~[jedis-2.1.0.jar:na]
看提示,應(yīng)該是服務(wù)端主動(dòng)關(guān)閉了連接。查看了新上線的redis服務(wù)器的配置,有這么一項(xiàng):
# Close the connection after a client is idle for N seconds (0 to disable) timeout 120
這項(xiàng)配置指的是客戶端連接空閑超過多少秒后,服務(wù)端主動(dòng)關(guān)閉連接,默認(rèn)值0表示服務(wù)端永遠(yuǎn)不主動(dòng)關(guān)閉。而op人員把服務(wù)器端的超時(shí)時(shí)間設(shè)置為了120秒。這就解釋了發(fā)生這個(gè)異常的原因。客戶端使用了一個(gè)連接池管理訪問redis的所有連接,這些連接是長(zhǎng)連接,當(dāng)業(yè)務(wù)量較小時(shí),客戶端部分連接使用率較低,當(dāng)兩次使用之間的間隔超過120秒時(shí),redis服務(wù)端就主動(dòng)關(guān)閉了這個(gè)連接,而等客戶端下次再使用這個(gè)連接對(duì)象時(shí),發(fā)現(xiàn)服務(wù)端已經(jīng)關(guān)閉了連接,進(jìn)而報(bào)錯(cuò)。
解決方案有兩種:
1. 在redis-cli下直接修改redis 的配置,把timeout改回為0,無需重啟redis即可直接生效。
2. 修改應(yīng)用系統(tǒng)代碼,設(shè)置連接的最大空閑時(shí)長(zhǎng)(超出此時(shí)長(zhǎng)將斷開空閑連接)小于120秒。
出于改動(dòng)成本考慮,采用了第一種方案,修改后,報(bào)錯(cuò)不再出現(xiàn)。
這里有一個(gè)問題,為何服務(wù)器端主動(dòng)關(guān)閉空閑連接后,客戶端沒有報(bào)錯(cuò)呢,系統(tǒng)依賴的是jedis-2.1.0,這塊需要細(xì)看下jedis連接池那塊的實(shí)現(xiàn),jedis連接池主要是基于commons-pool寫的,下來再研究研究,寫一篇文章總結(jié)一下。
(本文已被閱讀18次)
前段時(shí)間,由于線上redis服務(wù)器的內(nèi)存使用率達(dá)到了機(jī)器總內(nèi)存的50%以上,導(dǎo)致內(nèi)存數(shù)據(jù)的dump持久化一直失敗。擴(kuò)展到多臺(tái)redis后,應(yīng)用系統(tǒng)訪問redis時(shí),在業(yè)務(wù)量較少時(shí),時(shí)不時(shí)會(huì)出現(xiàn)以下異常,當(dāng)業(yè)務(wù)量較大,redis訪問頻率很高時(shí),卻不會(huì)發(fā)生這個(gè)異常,一時(shí)覺得很詭異。 redis.clients.jedis.exceptions.JedisConnectionException:?It?seems?like?server?has?closed?the?connection. at?redis.clients.util.RedisInputStream.readLine(RedisInputStream.java:90)?~[jedis-2.1.0.jar:na] at?redis.clients.jedis.Protocol.processInteger(Protocol.java:110)?~[jedis-2.1.0.jar:na] at?redis.clients.jedis.Protocol.process(Protocol.java:70)?~[jedis-2.1.0.jar:na] at?redis.clients.jedis.Protocol.read(Protocol.java:131)?~[jedis-2.1.0.jar:na] at?redis.clients.jedis.Connection.getIntegerReply(Connection.java:188)?~[jedis-2.1.0.jar:na] at?redis.clients.jedis.Jedis.sismember(Jedis.java:1266)?~[jedis-2.1.0.jar:na] 看提示,應(yīng)該是服務(wù)端主動(dòng)關(guān)閉了連接。查看了新上線的redis服務(wù)器的配置,有這么一項(xiàng): # Close the connection after a client is idle for N seconds (0 to disable) timeout 120 這項(xiàng)配置指的是客戶端連接空閑超過多少秒后,服務(wù)端主動(dòng)關(guān)閉連接,默認(rèn)值0表示服務(wù)端永遠(yuǎn)不主動(dòng)關(guān)閉。而op人員把服務(wù)器端的超時(shí)時(shí)間設(shè)置為了120秒。這就解釋了發(fā)生這個(gè)異常的原因。客戶端使用了一個(gè)連接池管理訪問redis的所有連接,這些連接是長(zhǎng)連接,當(dāng)業(yè)務(wù)量較小時(shí),客戶端部分連接使用率較低,當(dāng)兩次使用之間的間隔超過120秒時(shí),redis服務(wù)端就主動(dòng)關(guān)閉了這個(gè)連接,而等客戶端下次再使用這個(gè)連接對(duì)象時(shí),發(fā)現(xiàn)服務(wù)端已經(jīng)關(guān)閉了連接,進(jìn)而報(bào)錯(cuò)。 解決方案有兩種: 1. 在redis-cli下直接修改redis 的配置,把timeout改回為0,無需重啟redis即可直接生效。 2. 修改應(yīng)用系統(tǒng)代碼,設(shè)置連接的最大空閑時(shí)長(zhǎng)(超出此時(shí)長(zhǎng)將斷開空閑連接)小于120秒。 出于改動(dòng)成本考慮,采用了第一種方案,修改后,報(bào)錯(cuò)不再出現(xiàn)。 這里有一個(gè)問題,為何服務(wù)器端主動(dòng)關(guān)閉空閑連接后,客戶端沒有報(bào)錯(cuò)呢,系統(tǒng)依賴的是jedis-2.1.0,這塊需要細(xì)看下jedis連接池那塊的實(shí)現(xiàn),jedis連接池主要是基于commons-pool寫的,下來再研究研究,寫一篇文章總結(jié)一下。 (本文已被閱讀18次)
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com