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