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





















