Redis重要引數回顧

壹頁書發表於2016-05-13
最近有點鬧心.
先是昨天壁掛爐管子崩了,家裡發大水.
小花狸還把鑰匙扔廁所裡了,沒注意直接給沖走了..
晚上,有郵件報警.
才發現家裡鍵盤還讓小花狸玩壞了...
這孩子.太淘氣了

晚上9點半,叫車去單位處理.
發現Redis記憶體使用接近上限.已經使用了10G左右.
我調整了一下上限,解除了報警.
但是檢視top的時候,發現Redis-server cpu使用率達到100%.
昨天是崩潰的一天..
當時每秒執行400左右,設定並檢視慢日誌.沒有明顯問題.
後來想起,這個Redis有大量寫入.觸發了rdb持久化儲存.每分鐘fork一個子程式,進行轉儲匯出.那個CPU使用率達到100%的程式,應該是fork的子程式.
對業務應該沒有影響.畢竟Redis rdb是透過 Copy-on-write 寫時複製機制的.(好像就是修改請求,寫記憶體的新頁,不會修改原來的資料頁,讓fork的子程式做持久化.)
不過我還是修改了save的配置.減少rdb持久化頻率.畢竟每分鐘持久化一次,寫6G多檔案,沒有什麼必要.
修改之後,習慣性的檢視配置.
狗血的事情來了...
  1) "dbfilename"
  2) "authorized_keys"
。。。。。
 91) "dir"
 92) "/root/.ssh"

這是什麼鬼?這臺Redis是以root執行的..
當時晚上11點,倒抽一口涼氣...
馬拉個雞..這駭客是要砸我飯碗嗎?


由於我們伺服器都有ACL保護,所以這個漏洞原來也沒有太當回事.


終於都弄完了...
回顧一下Redis的幾個重要引數.
  1. #在預設情況下,如果RDB快照持久化操作被啟用(至少一個條件被啟用)並且持久化操作失敗,Redis則會停止接受更新操作。  
  2. #這樣會讓使用者瞭解到資料沒有被正確的儲存到磁碟上。否則沒人會注意到這個問題,可能會造成災難。  
  3. #  
  4. #如果後臺儲存(持久化)操作程式再次工作,Redis會自動允許更新操作。  
  5. #  
  6. #然而,如果你已經恰當的配置了對Redis伺服器的監視和備份,你也許想關掉這項功能。  
  7. #如此一來即使後臺儲存操作出錯,redis也仍然可以繼續像平常一樣工作。  
  8. stop-writes-on-bgsave-error yes  

  1. #是否在匯出.rdb資料庫檔案的時候採用LZF壓縮字串和物件?  
  2. #預設情況下總是設定成‘yes’, 他看起來是一把雙刃劍。  
  3. #如果你想在儲存的子程式中節省一些CPU就設定成'no',  
  4. #但是這樣如果你的kye/value是可壓縮的,你的到處資料接就會很大。  
  5. rdbcompression yes  
rdbcompression 就是為什麼之前會看到 fork的子程式cpu使用率100%的原因.

  1. #從版本RDB版本5開始,一個CRC64的校驗就被放在了檔案末尾。  
  2. #這會讓格式更加耐攻擊,但是當儲存或者載入rbd檔案的時候會有一個10%左右的效能下降,  
  3. #所以,為了達到效能的最大化,你可以關掉這個配置項。  
  4. #  
  5. #沒有校驗的RDB檔案會有一個0校驗位,來告訴載入程式碼跳過校驗檢查。  
  6. rdbchecksum yes 


slave-serve-stale-data yes
當slave丟失master或者同步正在進行時,如果發生對slave的服務請求:
slave-serve-stale-data設定為yes則slave依然正常提供服務
slave-serve-stale-data設定為no則slave返回client錯誤:"SYNC with master in progress"

repl-ping-slave-period 10
slave傳送PINGS到master的時間間隔

repl-timeout 60
IO超時時間

repl-disable-tcp-nodelay no
解釋:
在slave和master同步後(傳送psync/sync),後續的同步是否設定成TCP_NODELAY
假如設定成yes,則redis會合並小的TCP包從而節省頻寬,但會增加同步延遲(40ms),造成master與slave資料不一致
假如設定成no,則redis master會立即傳送同步資料,沒有延遲
前者關注效能,後者關注一致性

repl-backlog-size 1mb
避免slave斷開重連之後,全量的資料同步

maxmemory-policy volatile-lru
noeviction: 不進行置換,表示即使記憶體達到上限也不進行置換,所有能引起記憶體增加的命令都會返回error
allkeys-lru: 優先刪除掉最近最不經常使用的key,用以儲存新資料
volatile-lru: 只從設定失效(expire set)的key中選擇最近最不經常使用的key進行刪除,用以儲存新資料
allkeys-random: 隨機從all-keys中選擇一些key進行刪除,用以儲存新資料
volatile-random: 只從設定失效(expire set)的key中,選擇一些key進行刪除,用以儲存新資料
volatile-ttl: 只從設定失效(expire set)的key中,選出存活時間(TTL)最短的key進行刪除,用以儲存新資料

maxmemory-samples 5
Redis中的LRU不是嚴格意義上的LRU演算法實現,是一種近似的LRU實現,主要是為了節約記憶體佔用以及提升效能。
Redis的LRU是取出配置的數目的key,然後從中選擇一個最近最不經常使用的key進行置換,maxmemory-samples預設的5
可以透過調整樣本數量來取得LRU置換演算法的速度或是精確性方面的優勢。
Redis不採用真正的LRU實現的原因是為了節約記憶體使用。雖然不是真正的LRU實現,但是它們在應用上幾乎是等價的
如果你將maxmemory-samples設定為10,那麼Redis將會增加額外的CPU開銷以保證接近真正的LRU效能,可以透過檢查命中率來檢視有什麼不同。

no-appendfsync-on-rewrite no
重寫 aof檔案的時候,是否呼叫fsync

還有一些引數,先整理這麼多吧。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-2099173/,如需轉載,請註明出處,否則將追究法律責任。

相關文章