網(wǎng)站YouPorn使用Redis之經(jīng)驗談
RedisToGo 的賈斯汀(Justin)最近對Manwin集團(YouPorn和Pornhub之類的成人網(wǎng)站背后的公司)的 IT 總監(jiān)埃里克(Eric Pickup)做了一次采訪。在采訪中,埃里克講述他們向 Redis 的遷移過程,為什么要做這樣的遷移,以及遷移后的成效。對 Redis 感興趣的朋友,可看看他的《建立一個易于擴充規(guī)模的網(wǎng)站》(Youtube)視頻。下面是 Justin 對 Eric 訪談的譯文。
賈斯汀:您能否談?wù)勀銈優(yōu)槭裁匆^渡到Redis?
埃里克:基本上,大約兩年前我們收購了這個網(wǎng)站(YouPorn)。當時它是用Perl編寫的,這也是我被招進來的原因之一。雖然我曾經(jīng)用Perl干過活,但是我們很快就認定了用它維護這個網(wǎng)站不可行。Perl的開發(fā)人員不足,尤其是能力強的高級開發(fā)人員更少。所以,如果我們繼續(xù)用Perl維護它,它只能成為一個停滯不前的網(wǎng)站,而這顯然是我們不想做的事情。
很快,我們決定要重構(gòu)網(wǎng)站并開始調(diào)研不同的技術(shù)。其實我們的第一反應(yīng)是PHP,但我們不想太早把自己局限住,所以我們也調(diào)研了基于Java的解決方案。在對我們內(nèi)部實驗過的技術(shù)進行了大量研究分析之后,我們決定堅持用PHP。
以前,我們也實驗過Redis,Varnish和其他一些技術(shù)。有些我們內(nèi)部的網(wǎng)站已經(jīng)開始使用Redis,主要是用來做緩存解決方案。但我們還想知道,我們是否可以把它作為一個真正的數(shù)據(jù)存儲平臺來使用。
我們做了一些早期的測試,并把性能作為主要的決策因素,因為這在當時是(現(xiàn)在也還是)我們的一個大問題。我們對Redis的總體性能感到非常震撼,在經(jīng)過一些討論后,我們決定要使用Redis作為網(wǎng)站的主數(shù)據(jù)庫。
此前該網(wǎng)站使用傳統(tǒng)的LAMP架構(gòu)編寫而成。它用到了Linux,Perl,MySQL和Memcached。過渡過程顯然是有一些難度的。實施過程有個折中:我們在架構(gòu)中保留了MySQL,而且事后對此我真的很高興我們這樣做了。我們的網(wǎng)站并沒有直接去讀取MySQL數(shù)據(jù)庫,但我們可以用它來做類似于填充新的列表或散列之類的事情,以及我們沒有預(yù)見到的一些功能。我們更多地是用MySQL來實現(xiàn)現(xiàn)有的數(shù)據(jù)查詢,Redis則用于網(wǎng)站。
我們開始用它做開發(fā)之后不久,我們很快認為我們做出了正確的決定。然后在開發(fā)了一個月左右的時間后,我們準備重新審視我們的決定,但很快就覺得沒問題。這真的是一個很適合我們應(yīng)用案例的技術(shù)。
賈斯汀:為什么這樣說呢?在評估它是否是一個很好的決定的問題上,你們主要看哪些因素?
埃里克:很明顯,易于開發(fā)是一個重大的因素,尤其是當你像這樣重構(gòu)整個項目的時候。幸運的是,Redis的數(shù)據(jù)結(jié)構(gòu)和我們在做的工作匹配得很好。
YouPorn從根本上來說,主要是視頻和對象的列表,無論是評論、喜歡、最受好評的影片,或觀看次數(shù)最多的視頻。這些都是列表和對象,顯然很容易映射到哈希表里。我們也使用其他的一些數(shù)據(jù)類型,但我不得不說,我們使用的90%左右都會落到有序集合或哈希的結(jié)構(gòu)里。
賈斯汀:決定使用Redis后,需要多久才能真正進行實施并使之生效?
埃里克:說實話,在當時我們還在提升團隊能力。就像我說的,這是一個全新的項目,所以在起始階段主要只有我和另外一個人。
我得說,在大約四個星期之內(nèi),我們就做出了網(wǎng)站原型的相當一部分。我們做好了首頁,所有的主要頁面,以及大部分的視頻頁面。你還可以查看評論 – 盡管那時候你還不可以增加評論 – 很多事只是兩個人在短短的四個星期完成。這個時間表還包括了學(xué)習(xí)新的框架(那時候用了Symphony),所以說我們啟動和運轉(zhuǎn)都是很快的。
賈斯汀:您正在使用的Redis實例有多少個?
埃里克:我沒有具體的數(shù)字,但應(yīng)該不到10個。
賈斯汀:這真是令人印象深刻。你們怎么做到只用這么少的?
埃里克:隨著時間的推移,我們不斷新增功能,Redis實例數(shù)也是不斷增加的,但一般來說,我們用Redis做了很多的緩存工作。我們第一次推出網(wǎng)站的時候,我們沒有做緩存。我們只是依靠Redis本身。
隨著時間的推移,我們發(fā)現(xiàn)以我們的標準來看服務(wù)器運行負擔(dān)過重,所以我們開始添加某些級別的緩存。我們在網(wǎng)站上布署了第二個Redis節(jié)點,它用很短的緩存時間來處理最流行的頁面視圖。
你還必須明白,我們也使用了Varnish,它位于Web服務(wù)器的前端,所以網(wǎng)頁本身也有相當數(shù)量的緩存,所以我們不會通過Redis來緩存每個頁面。
賈斯汀:你去做架構(gòu)上的決策的時候,你能否談?wù)勀闶侨绾螞Q定在哪里使用Redis的,在實施過程中有沒有修正你的決策呢?
埃里克:我想說Redis是我們知道我們是要使用的熱門技術(shù)之一。它和Varnish,他們都是我們早期就決定要用的。我們對它們的測試結(jié)果是相當不錯的,就像我說的,我們公司之前就用過它們,所以它們對我們來說并不是未知的東西。
要說我們有什么修正,最大的變化是增加了Redis二級緩存層。這真的降低了服務(wù)器上每秒的查詢數(shù),并讓我們有更安全的網(wǎng)絡(luò)。
賈斯汀:實施后最大的好處,你覺得是什么?
埃里克:第一,我會說,是Redis帶來的強大的快速創(chuàng)建新功能的能力。其實我的意思是,不只是Redis,而是完整的開發(fā)框架帶來的,但我們已經(jīng)寫了一個基于Redis的基本庫之上的很不錯的庫,這使我們能夠迅速的把新功能融合到一起。這絕對是我們所見過的最大的好處。
(編譯補充:2012年2月份,YouPorn 的技術(shù)人員 Eric Pickup 在 Google 群組宣告他們網(wǎng)站改用 Redis DB 后。扛住了每天1億PV瀏覽量,每秒30萬請求,已經(jīng)堅持 2 周。)
賈斯汀:進行這種遷移的一些障礙或困難是什么?有沒有什么定制化的東西,你必須弄清楚然后自己來做的嗎?
埃里克:這我得想想。實現(xiàn)緩存層花了一些時間。就像我說的,當時服務(wù)器負擔(dān)很重,而我們并不想為了這個問題投入越來越多的服務(wù)器,所以構(gòu)建一個解決方案花了一些時間。
其他花時間的就是需要琢磨一些事情。現(xiàn)在,大多數(shù)使用Linux系統(tǒng)搭建的網(wǎng)站都使用MySQL作為數(shù)據(jù)存儲。 MySQL的確擁有巨大的優(yōu)勢,它有大量的文檔。如果你碰到一個問題,沒準有人在此之前已經(jīng)解決過了,你會找到一堆網(wǎng)站上都提供了相應(yīng)的信息和建議。 Redis根本就還沒有這樣的社區(qū)。如果你想看看其他已經(jīng)設(shè)置好的人寫的東西,比如他們學(xué)到了什么,他們使用哪些設(shè)置,他們的經(jīng)驗是什么,會發(fā)現(xiàn)這樣的信息很少。因為只有很少的提示和技巧,所以學(xué)習(xí)曲線上需要克服的困難就更多了。
相比MySQL,Redis的文檔少得多,所以尋找尋求問題的解決辦法或其他簡單的事情,比如設(shè)置到磁盤的復(fù)制,需要多一點的時間。不過,由于Redis越來越受歡迎,文檔和社區(qū)正在開始形成。
賈斯汀:你有任何提示或技巧想和我們的觀眾分享嗎?
埃里克:我最想說的是最有價值的經(jīng)驗中最重要的一些,可是我懂的也不多。我不是系統(tǒng)管理員,而最重要的很多基本都是系統(tǒng)管理一類的東西。我想說很容易錯過的一招是,當你設(shè)置到磁盤的復(fù)制時,如果你的磁盤是主從的集群,你要確保每個實例之間有足夠的時間差,這樣你就不會碰上所有實例都正好同時決定寫磁盤的局面。
這很容易被忽視。我們起始時的服務(wù)器都運行正常,但后來,當我們添加更多的服務(wù)器的時候,我們保持了默認設(shè)置,而后來不得不去修復(fù)。這是人們可以從中受益很多的經(jīng)驗之一。我是軟件開發(fā)人員,我會說最真實的經(jīng)驗教訓(xùn)是在系統(tǒng)管理層面。可我沒有足夠的信息來真正深入探討這些問題。
賈斯汀:太好了。感謝您給我們這么棒的訪談,希望Manwin集團一切順利!
埃里克:感謝您對我的采訪。