一、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/GenericObjectPool@0xb8513338[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執行的命令次數