Redis 運(yùn)維實際經(jīng)驗紀(jì)錄之一
本文轉(zhuǎn)自一米六二博客(nice name),是將Redis用在較大型數(shù)據(jù)上的一個運(yùn)維實例,作者為yahoo!中國的后端工程師,其收集整理的Tokyocabinet/Tokyotyrant文檔大合集在亦在網(wǎng)上廣為流傳。
原文鏈接:http://www.162cm.com/archives/1062.html
Redis 改版的項目上線有兩個月了,記錄一下Redis 相關(guān)的經(jīng)驗,也給大家一個參照:
我們的Redis Server是一主一從,使用R710的機(jī)器,8核心,24G內(nèi)存。 每天約插入200萬左右的數(shù)據(jù),現(xiàn)在庫里有3000萬條紀(jì)錄,占用了9G的內(nèi)存。由于現(xiàn)在每天內(nèi)存增長太快,擔(dān)心很快會無法負(fù)載,因此寫了腳本每天將過期數(shù)據(jù)刪除。
現(xiàn)在運(yùn)行中的問題:
1、Redis運(yùn)行基本穩(wěn)定,從沒有自己中斷過服務(wù),php腳本去set的話大概1秒鐘能設(shè)置1萬條小數(shù)據(jù),并沒有官方給出的數(shù)據(jù)高。但是修改配置后大重啟服務(wù)時大概需要1到2分鐘才能完全將硬盤中的數(shù)據(jù)加載到內(nèi)存中去,在加載完之前,Redis不能提供服務(wù)。
2、Redis的默認(rèn)配置中,每60秒如果紀(jì)錄更改數(shù)達(dá)到1萬條就需要dump到硬盤中去,但實際上由于超過了這個數(shù),我們的Redis幾乎不停地在dump數(shù)據(jù)到硬盤上。dump數(shù)據(jù)到硬盤時,我估計為了達(dá)到一個原子的效應(yīng),避免數(shù)據(jù)丟失,Redis是先把數(shù)據(jù)dump到一個臨時文件,然后重命名為你在配置文件設(shè)定的數(shù)據(jù)文件名。而前面說到,加載數(shù)據(jù)要1到2分鐘,dump數(shù)據(jù)應(yīng)該也在1分鐘左右吧。dump出來的文件差不多1到2個G。這樣,服務(wù)器幾乎一直保持著每分鐘寫一個2G的文件的這種IO的負(fù)載。磁盤基本不閑著。
3、還是在dump中,除開磁盤不閑著以外,CPU也一路飆升:Redis是fork一個子進(jìn)程來dump數(shù)據(jù)到硬盤,原有進(jìn)程占用30%+的CPU,而dump數(shù)據(jù)的子進(jìn)程單獨(dú)享用了一個CPU核心,cpu占用100%。
4、 Redis在dump數(shù)據(jù)的時候,是fork子進(jìn)程,這樣產(chǎn)生一個問題:Redis本向占用了9G的內(nèi)存,在dump數(shù)據(jù)時又fork一個進(jìn)程,子進(jìn)程繼承了內(nèi)存分配,也占用了9G的內(nèi)存…。Redis一下子占用了18G的內(nèi)存了。(NoSQLFan:由于fork調(diào)用的內(nèi)存會采用操作系統(tǒng)的COW機(jī)制,所以內(nèi)存不會馬上加倍,只有在最壞的情況下,也就是在dump的時候主進(jìn)程中的數(shù)據(jù)完全被修改了才COPY出兩倍的內(nèi)存來。)
發(fā)現(xiàn)這些問題后,我修改了Redis的配置文件,設(shè)置為30分鐘內(nèi)只要有一次寫修改就dump數(shù)據(jù),這樣系統(tǒng)負(fù)載大幅減輕了。
處于設(shè)想中的想法:
主Redis并不dump數(shù)據(jù),不管寫多少次都不dump到硬盤,或是這個dump的時間非常長。從Redis則主要承擔(dān)合理地dump數(shù)據(jù)到硬盤以起備份作用。主Redis啟動時先從從Redis中scp或是ftp download數(shù)據(jù)回來。有待后續(xù)驗證。
|