2014-10-19 54 views
2

我想設置2個Redis實例,因爲我對要存儲在Redis中的數據有不同的要求。雖然我有時不介意丟失一些主要用作緩存數據的數據,但我希望避免在某些情況下丟失一些數據,例如,當我使用存儲到Redis中的要執行的作業的Python RQ時。Redis的2個實例:作爲緩存和作爲持久數據存儲

我在下面提到了實現這樣一個目標的主要設置。

您認爲如何?

我忘記了什麼重要嗎?

1)的Redis作爲高速緩存

# Snapshotting to not rebuild the whole cache if it has to restart 
# Be reasonable to not decrease the performances 
save 900 1 
save 300 10 
save 60 10000 

# Define a max memory and remove less recently used keys 
maxmemory X # To define according needs 
maxmemory-policy allkeys-lru 
maxmemory-samples 5 

# The rdb file name 
dbfilename dump.rdb 

# The working directory. 
dir ./ 

# Make sure appendonly is disabled 
appendonly no 

2)的Redis作爲持久數據存儲

# Disable snapshotting since we will save each request, see appendonly 
save "" 

# No limit in memory 
# How to disable it? By not defining it in the config file? 
maxmemory 

# Enable appendonly 
appendonly yes 
appendfilename redis-aof.aof 
appendfsync always # Save on each request to not lose any data 
no-appendfsync-on-rewrite no 

# Rewrite the AOL file, choose a good min size based on the approximate size of the DB? 
auto-aof-rewrite-percentage 100 
auto-aof-rewrite-min-size 32mb 

aof-rewrite-incremental-fsync yes 

aof-load-truncated yes 

來源:

回答

4

我覺得你的持久選項過於激進 - 但它主要取決於性質和您的數據量。

對於緩存,使用RDB是一個好主意,但請記住,根據數據量的不同,將內存內容轉儲到磁盤上會產生成本。在我的系統上,Redis可以以400 MB/s的速度寫入內存數據,但請注意數據可能(或不可能)被壓縮,可能(或不可能)使用密集數據結構,因此您的行駛里程會有所不同。使用您的設置,支持大量寫入的緩存將每分鐘生成一次轉儲。你必須檢查你的音量,轉儲時間遠遠低於那一分鐘(大約6-10秒就可以)。其實,我建議只保存900 1並刪除其他保存行。即使每15分鐘轉儲一次也可能被認爲太頻繁,特別是如果您的SSD硬件會逐漸耗盡。

對於持久存儲,您還需要定義dir參數(因爲它也控制AOF文件的位置)。除非吞吐量非常低,否則appendfsync always選項對於大多數用途來說是過度殺毒和太慢的。你應該把它設置爲每秒。如果即使在系統崩潰的情況下,您也承受不起丟失一點數據的風險,那麼使用Redis作爲存儲後端並不是一個好主意。最後,您可能必須將auto-aof-rewrite-percentage和auto-aof-rewrite-min-size調整爲Redis實例必須支持的寫入吞吐量級別。

+0

爲什麼持久性選項過於激進?我不想丟失關於這個Redis實例的任何數據。那麼這些設置是否合適?我不會存儲很多內容,它不會成爲我的主要數據存儲區。 至於緩存,我會將保存更改爲「1800 1」。這應該夠了。作爲緩存,我不介意丟失一些數據。謝謝 – Michael 2014-10-20 20:09:47

+0

這些設置適合避免丟失任何數據,但實際上價格太高。每次寫操作都會導致同步fsync,導致Redis總凍結幾毫秒。在這幾毫秒內,實例將完全無響應,而不僅僅是單個連接 - 對於所有連接。一般來說,這不是一個好主意。 – 2014-10-20 22:03:45

2

我完全同意@Didier - 這是更多的補充,而不是一個完整的答案。

首先請注意,Redis提供可調整的持久性 - 您可以使用RDB和/或AOF。雖然您選擇使用RDB進行永久緩存非常合理,但我建議您考慮將兩者用於持久性存儲。這將允許您基於快照(即備份)進行時間點恢復以及在AOF上執行最後記錄的操作後的崩潰後恢復。

對於持久性存儲,您不要想要將maxmemory設置爲0(如果它在conf文件中註釋掉,則這是默認值)。當設置爲0時,Redis將使用盡可能多的內存,因爲操作系統最終會給它這樣的內存,隨着數據集的增長,您將遇到操作系統會殺死它以釋放內存的情況(這通常發生在您最不期待的時候; ))。相反,您應該使用基於您的服務器具有足夠的操作系統填充的內存量的實際值。例如,如果你的服務器有16GB的內存,根據經驗,我會限制Redis的使用超過14GB。

但有一個問題。既然您已經閱讀了有關Redis持久性的所有信息,您可能還記得Redis會將這些數據寫入磁盤。在子進程執行期間,分叉可以使內存消耗增加一倍以上(副本+更改),因此如果使用數據持久性,則需要確保服務器具有足夠的可用內存。另外請注意,您應該在maxmemory計算中考慮其他潛在的消耗內存的東西,例如複製和客戶端緩衝區,具體取決於您和應用程序使用Redis的方式/方式。

相關問題