Redis常見問題及處理方法

來源:互聯網
上載者:User

標籤:

一、Redis狀態檢查

       唯一標記一個redis執行個體的是ip和連接埠,前端是用tcp方式來訪問redis的,我們提供給應用訪問的是一個ip+63379(一般使用63379) 連接埠。因此我們執行如下命令檢查redis狀態:

上面的role這個值一定是master的,只要保證vip在master上我們的Padis cache服務就是沒有問題的,如果不通或者role的角色是slave,那就得繼續查看是什麼問題.

二、兩個redis的角色都是slave的問題

     當兩個主機都掛了或者我們自己不小心將兩個redis停了,並且我們用下面的命令檢查

     /wls/wls81/redis/bin/redis-cli -h  {ip} -p {port} -a {password}  info replication

     發現無論是vip還是另外的兩個ip都是role:slave 的角色,這個時候需要對vip所在的主機執行slaveof no one 的操作,將vip 所在的redis變成master,如:

     /wls/wls81/redis/bin/redis-cli -h  {vip} -p {port} -a {password}  slaveof no one

三、sentinel的配置參數

    我們的sentinel 設定檔裡面有兩個重要的配置

   sentinel monitor pds_jks-core-prd 10.33.94.65 63379 1    -----------配置的ip和連接埠任何時候都需要是master的ip連接埠,切換的時候程式自動會改 。另外,紅色所示部分pds_jks-core-prd為redis對外提供的主機名稱,一般Jedis在調用redis時會用到此名稱。如果配置多個哨兵則一般要求此名稱唯一標識

   sentinel down-after-milliseconds pds_jks-core-prd 15000    ----------這個是sentinel串連master的逾時時間,超過這個時間就認為master掛了,實現自動切換。這個預設是30秒,這個時間得調節好,大了會在真正出現故障的時候切換時間會長,小了有時候master由於持久化資料,繁忙不響應,會導致自動切換,實際只是瞬間不可用,現在認為設定為15秒為宜.

四、AOF日誌

   這個日誌記錄了每一個寫入命令或者刪除命令的,這個對於我們審計功能是有用的,由於佔用很多磁碟,預設我們是關閉的

   如果開啟會產生一個.aof的檔案在data檔案中. 如:  /wls/apache/servers/pds_jks-core-prd/data

    在redis運行中中開啟:

     /wls/wls81/redis-icore/bin/redis-cli -h {ip} -p {port}  -a {password} config set appendonly yes

     開啟了可以查看日誌,記錄每一個命令,如有必要可以開啟查完問題後關閉. 同時說明一下

      /wls/wls81/redis-icore/bin/redis-cli -h {ip} -p {port}  -a {password} config set 可以在redis啟動並執行時候設定多個它的參數

五、空閑串連的timeout

      redis服務端不會自動斷開用戶端來的串連,redis服務端有設定用戶端空閑連線逾時時間,可用命令

      /wls/wls81/redis-icore/bin/redis-cli -h {ip} -p {port}  -a {password} config get timeout

      查看當前timeout時間,預設是0,就是不斷開閒置串連,如果不斷開閒置串連,就會造成redis串連過多

      所以一般情況下可以設定為3600秒:

      /wls/wls81/redis-icore/bin/redis-cli -h {ip} -p {port}  -a {password} config set timeout  3600

      也就是3600秒後將閒置串連關閉掉.  可以用下面的命令查看某個串連空閑了多久:

       /wls/wls81/redis-icore/bin/redis-cli -h {ip} -p {port}  -a {password} client list

六、監控redis執行的命令

    /wls/wls81/redis-icore/bin/redis-cli -h {ip} -p {port}  -a {password} monitor

   上述這個monitor命令可以查看redis執行了什麼命令,有時候查問題很有必要用到,我們可以知道那段時間redis執行了什麼,從而進行我們的問題診斷。

七、key的尋找與執行

   /wls/wls81/redis-icore/bin/redis-cli -h {ip} -p {port}  -a {password} keys "*"

   keys這個命令尋找所有的key,但是最好慎用,因為它很耗redis的效能,每個key都遍曆一遍. 也可以進行模糊比對如: keys "send*"

   千萬記住在生產環境上不能隨便亂用,因為它會將redis效能耗盡,導致其他串連擷取不到響應.

   /wls/wls81/redis/bin/redis-cli -h {ip} -p {port}  -a {password}  dbsize

   dbsize 這個命令可以看到整一個redis裡面有多少個key,當然和keys "*" | wc -l結果是一樣的。

   當我們需要大量刪除key值時可以用如下命令即可:

  /wls/wls81/redis/bin/redis-cli -h {ip} -p {port}  -a {password} keys "send*" | xargs  /wls/wls81/redis/bin/redis-cli -h {ip} -p {port}  -a {password} del

  我們需要將整個db都flush掉可以用:

   /wls/wls81/redis/bin/redis-cli -h {ip} -p {port}  -a {password} -a MamcCorePrd  flushdb

  /wls/wls81/redis/bin/redis-cli -h {ip} -p {port}  -a {password} -a flushall

八、由於串連redis的用戶端使用jedisPool

如果設定了

       redis.pool.testOnBorrow.REL=true

       redis.pool.testOnReturn.REL=true

 這兩個參數是說在或者pool中的串連和返回串連給pool的時候都需要檢查一下串連的有用性,也就是ping一下這個redis是不是好的,

 這樣在高並發的時候,由於並發線程太多,ping操作相對線程啟動來說很慢,因此,應用會堵在類似如下線程dump的地方

"[ACTIVE] ExecuteThread: ‘19‘ for queue: ‘weblogic.kernel.Default (self-tuning)‘" id=33 idx=0x9c tid=273669 prio=5 alive, native_blocked, daemon

at jrockit/net/SocketNativeIO.readBytesPinned(Ljava/io/FileDescriptor;[BIII)I(Native Method)

at jrockit/net/SocketNativeIO.socketRead(SocketNativeIO.java:32)

at java/net/SocketInputStream.socketRead0(Ljava/io/FileDescriptor;[BIII)I(SocketInputStream.java)

at java/net/SocketInputStream.read(SocketInputStream.java:129)

at java/net/SocketInputStream.read(SocketInputStream.java:90)

at redis/clients/util/RedisInputStream.fill(RedisInputStream.java:109)

at redis/clients/util/RedisInputStream.readByte(RedisInputStream.java:45)

at redis/clients/jedis/Protocol.process(Protocol.java:64)

at redis/clients/jedis/Protocol.read(Protocol.java:131)

at redis/clients/jedis/Jedis.ping(Jedis.java:35)

at redis/clients/jedis/JedisPool$JedisFactory.validateObject(JedisPool.java:104)

at org/apache/commons/pool/impl/GenericObjectPool.addObjectToPool(GenericObjectPool.java:922)

at org/apache/commons/pool/impl/GenericObjectPool.returnObject(GenericObjectPool.java:917)

^-- Holding lock: org/apache/commons/pool/impl/[email protected][fat lock]

at redis/clients/util/Pool.returnResourceObject(Pool.java:29)

at redis/clients/util/Pool.returnResource(Pool.java:41)

at com/paic/icore/mams/common/jedis/util/RedisPoolCacheTools.release(RedisPoolCacheTools.java:43)

    雖然後面會自動回復,不過導致應用響應緩慢.解決方案是將該兩個參數設定為false,並且定期檢查:

    testOnBorrow.REL=false

    testOnReturn.REL=false

    timeBetweenEvictionRunsMillis=60000       -------每隔60秒定期檢查空閑串連

    minEvictableIdleTimeMillis=120000           ---------串連在池中保持空閑而不被空閑串連回收器線程回收的最小時間值,單位毫秒               

    numTestsPerEvictionRun=-1                              ----------空閑串連掃描時,每次最多掃描的串連數,一般設定為-1,全部掃描

設定成這樣之後就不用每次都測試了,這樣就提高了應用的效能

有時候由於持久化導致master變得緩慢,所以建議關閉master的持久化,讓slave持久化

 關閉持久化   /wls/wls81/redis/bin/redis-cli -h {ip} -p {port}  -a {password} config set save ""

 開通持久化  /wls/wls81/redis/bin/redis-cli -h {ip} -p {port}  -a {password}  config set save "900 1 300 10 60 10000"

關閉持久化後如果發生主備切換了,請將master的持久化關閉,slave的持久化開啟  

九、查詢每秒執行的命令個數

十、單位時間內Redis執行的命令次數

Redis常見問題及處理方法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.