Redis持久化是有兩種方式:RDB和AOF
對這兩種方式的官方文檔的翻譯請看:
<a href="http://latteye.com/2011/11/redis-persistence.html">http://latteye.com/2011/11/redis-persistence.html</a>
RDB就是快照存儲,比如“每1個小時對redis進行快照存儲”。那麼,
26376 test 16 0 13.5g 13g 7488 D 0.0 42.8 6:48.24 redis-server
32459 test 18 0 13.5g 13g 7200 D 1.3 42.8 0:23.22 redis-server
redis 10.1.0.108:6379> set test2 22
耗時(40.47s)近1分鐘
就是說在大資料量的時候,做RDB,redis服務會暫停近1分鐘!這個就是redis持久化的時候的服務暫停現象。
好吧,為了保證資料容錯性,我們的快照一般是要頻繁快照的,是以暫停一分鐘是不可容忍的。
現在嘗試使用AOF+RDB:
1 将RDB的快照時間設定為1天(由于加上了AOF,是以這個時間是合理的)。
2 1次性壓入1000w左右的string資料到redis中(大概有5G資料量)
3 檢視性能表現:
第一個步驟fsync:
redis會從記憶體中逐漸生成appendonly.aof 在這個過程我試了下set和get操作都是沒有暫停現象的(很好~!)
好了,現在appendonly.aof生成了,有5.7個G
-rw-r--r-- 1 root root 4186238374 Mar 6 15:50 appendonly.aof
第二個步驟:調用BGREWRITEAOF重寫aof檔案
這個時候top檢視:
看到也是兩個redis-server服務開着。說明rewrite的時候是fork一個子程序在rewrite的,主程序是進行着redis服務的。
這個時候redis-cli調用檢查
get操作:無延時
set操作:出現了延遲現象 !!
這個配置項是設定在rewrite的時候是否對新的寫操作進行fsync。no表示進行fsync,yes表示不進行
預設是設定為no
現在将這個配置項設定為yes(我們對于rewrite的aof檔案硬碟大小沒有很大要求)
重新進行測試:
對同樣的5.7G的AOF操作進行一次BGREWRITEAOF。
get操作:無延遲
set操作:無延遲
很好!說明在rewrite的時候如果不進行fsync操作,主程序和子程序是互不幹擾的。
那麼如果rewrite的時候對新的寫操作不進行fsync,那麼新的aof檔案裡面是否會丢失這個寫操作呢?
答案是不會的,redis會将新的寫操作放在記憶體中,等待rewrite操作完成的時候,将新操作直接挂在aof中。
好了,至此,這個問題應該已經可以過去了。
推薦幾個文章:
(這個文章提供了一個非常好的方法,當資料量大,記憶體足夠的情況,一台機子上盡量多開幾個redis,甚至可以考慮有幾個cpu就開幾個redis,這樣,每個redis的記憶體量不會太大,就不會有大資料量服務暫停問題,這個也是考慮到了redis是單線程的,能盡量利用CPU)
(這個文章很好解釋了問什麼大資料量的時候會出現服務暫停)
本文轉自軒脈刃部落格園部落格,原文連結:http://www.cnblogs.com/yjf512/archive/2012/03/06/2382733.html,如需轉載請自行聯系原作者