天天看點

Redis持久化之大資料服務暫停問題

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&gt; 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,如需轉載請自行聯系原作者