1. 程式人生 > >楊衛華談新浪微博架構

楊衛華談新浪微博架構

在2010年的QCon北京大會上,InfoQ的編輯對楊衛華進行了採訪,其中談到了關於新浪微博系統平臺應對各種問題的解決方案,以及正在開發中的新浪雲。

楊衛華,新浪產品部技術經理,目前工作以新浪微博技術平臺為主,曾負責過新浪IM等通訊服務端架構設計。對網際網路後端技術,分散式,網路程式設計,XMPP即時通訊等領域感興趣。曾組織多次廣州及珠三角技術沙龍活動。個人blog 為:http://timyang.net/。

InfoQ:大家都知道,在美國有一個非常有名的資訊分享平臺叫做Twitter,而在中國,我們也有同樣的方式,就是現在非常流行的新浪微博,它還有個非常溫馨的名字,叫做圍脖。而新浪微博的架構就是楊衛華先生主持開發的。

今天我有幸採訪到楊衛華先生,讓他來給大家談一談,在新浪微博的技術架構方面,他們是如何為使用者提供更好的效能、更好的服務的。

衛華先生你好,我的第一個問題是,在新浪微博上有很多名人,名人的微博一般都是非常熱的,對它們的訪問量也特別高,那麼對於這些微博,您採用了什麼樣的方式來支援這種大資料量的訪問呢?

楊衛華(以下簡稱衛華):
對於這個問題,我們做過專門的分析。因為最近新浪微博有名人扎堆的現象,我們根據這個現象,從以下幾個角度來進行解決。

首先根據中國的網路現狀,比如說網通和電信,之間的網路訪問速度會比較慢,我們考慮讓使用者能夠訪問就近的伺服器,這樣使用體驗、速度都能達到要求。我們根據新浪以往的經驗,在全國部署了大量伺服器,這樣就為微博提供了硬體上的保證。

第二個方面,在程式優化的方面,在產品上線之前,我們進行了全方面的壓力測試,如果系統在某個方面可能會出現瓶頸,比如名人的訪問量比較高的話,我們就從那個角度去優化。比如說Cache是否夠用,資料庫訪問是不是瓶頸,這方面我們預先都有對壓力的估計,然後會針對那些方面去做優化。

第三個方面,對於那些靜態資源,比如圖片、視訊、JS指令碼,我們有專業的CDN來解決的,這樣就能夠保證全國的使用者在訪問新浪微博時都能夠得到比較好的體驗。

InfoQ:現在的伺服器大概都架設在哪幾個部分?覆蓋全國哪幾個地區?


衛華:
全國基本上大部分省份都有伺服器,特別是一些比較核心的節點,比如北京、上海、廣州,在這些核心的節點可能部署了更多的伺服器,而在其它一些二線城市、其它省份也都有部署的。

InfoQ:您也是為這種大資料量做了充分的準備。最近大家都知道,玉樹發生地震,對於這種突發事件,我們也會把微博作為一種資訊交流、資訊分享的平臺,大家的訪問也會造成大資料量訪問,那麼對於這種突發事件,您在技術架構上也做了相應的準備嗎?

衛華:
對,這種突發事件以及訪問峰值,是微博上經常出現的現象。突發事件的訪問峰值有兩種,一種是可以預測的,比如說我們將來要搞的世界盃,比如春節,大家都相互拜年這種;另外一種是不可預測的,比如地震這種。對可以預測的這種,我們事先會做準備,比如說世界盃,我們要增加相關的伺服器來完成。而面對這種不可預測的情況時,我們平時會有個數字,那就是我們平時的平均流量,硬體裝置要比它高一定量,這樣就能夠應對這種峰值的請求。

另外從程式上來說,我們可能有一些專門的機制,比如說使用者發表微博,並不是一發表就存到資料庫中,簡單地理解,他不是這樣操作的。業界中微博之類的產品都有一種機制,叫做非同步機制,也就是說,在發表的時候,我會把這個資訊放到訊息佇列裡面,然後再用另外一個專門的業務處理程式來處理它。當某一時刻發表量非常大,比如說地震了,很多人都會發表,那這個時候系統依然能夠有條不紊的來處理這個業務,這樣子就能讓我們的系統穩定執行,並具有高可用性。

InfoQ:也就是要對整個事務的進行有效的控制?


衛華:
對。

InfoQ:大家應該知道,因為有這麼多的微博,有那麼多名人,而且還有很多平民的、草根的微博,系統的資料量也是非常非常大的,而且還有很多很多的評論,很多很多的留言等等。那麼對於這種海量儲存,是不是也要做技術架構上的準備?

衛華:
對,微博這個產品從技術上來說,有一個很大的特徵,就是每天使用者發表特別容易,這造成每天新增的資料量都是百萬級的、上千萬級的這樣一個量。這樣你經常要面對的一個問題就是增加伺服器,因為一般一臺mySQL伺服器,它可能支撐的規模也就是幾千萬,或者說複雜一點只有幾百萬,這樣,你可能每天都要增加伺服器,從而解決所你面對的這些問題。你要考慮,如果每天要加伺服器,你的程式上、訪問上會不會有問題,會不會間斷。

我們其實有一些優化的方法,比如說我們會考慮熱點資料和冷資料,如果經常要訪問的這個資料,也就是熱資料,而過幾天才會訪問的就是冷資料,我們會把它們合併,這樣就可以按這個時間來分段,也就是把熱資料放在一起,冷資料放在一起,這樣可以解決這個訪問熱點的問題。

另外業界還有種思路,剛才說的用MySQL,我們採用Shade的技術會按時間分片,這是一種解決思路;另外還有一種解決思路,業界特別現在國外流行的一種方法,也就是NoSQL的方法。有一種比較好的產品,現在大家比較關注,叫Cassandra,就可以解決這個問題。如果我們每天要加一臺伺服器的話,那麼我們程式、運維這些能不能跟上呢,是否有一種產品可以讓你程式不需要做絲毫改動呢?Cassandra這個產品就可以幫你來解決這個問題,你只需要把伺服器插進去,那它馬上可以使用,那個產品內部就有這樣的機制。

InfoQ:那樣的話對我們整個產品的維護就比較方便了?

衛華:
對,這個可能就是說以後業界發展的一種方向,使用這種分散式的儲存來解決這種海量增長的問題。

InfoQ:你覺得NoSQL的資料庫和傳統的關係型的資料庫,那種更適合微博這種形式的網站?

衛華:
從長遠來說,NoSQL這個更適合一些,特別是分散式的NoSQL,剛才我也講了,如果能全部下來的話,那可能經常要面對這種擴充的困擾,需要的干擾,可能是說,如果要保證服務不間斷,可能就會面臨一種很大的挑戰,NoSQL,特別是這些分散式的NoSQL產品在內部就解決了這種問題,你不用停機,就可以加伺服器,加裝置。

InfoQ:這會對我們使用者造成很大的方便?

衛華:
對。

InfoQ:那麼在效能方面,還有一種我們常採用的方式就是Cache的方式,那麼在新浪微博系統裡面,Cache方式有什麼樣的特點?

衛華:
在像微博這樣的Web2.0產品裡面,技術界有一種很重要的說法,Cache就是RAM,RAM就是Memory的意思,RAM也就是New Disk,記憶體已經成為新的磁碟,代替磁碟的訪問了。當我們大量使用Cache的時候,可能會存在很多問題,比如很多那種Web2.0的產品,它在Cache的數量已經不是G的概念了,不是幾G、4G、8G的,可能達到一個TB的概念了,一個T相當於1024G,面對這樣海量的資料,那我們訪問的時候可能就會出現很多新的問題,比如我們的頻寬,因為使用者請求我的首頁的時候,他會獲取很多資源,比如有50個人關注你的微博,他需要從Cache裡面把這50個人的資料都聚合起來,同時還會有很多人也在訪問這個伺服器,假如說,有一千個人訪問,這一千個人裡面,每個人都從五十個裡面選,那麼這個Cache的頻寬將是一個比較大的問題,這是以前那種我們使用Cache時沒有遇到過的。然後,為了解決這個頻寬的問題,我們可以使用壓縮的技術,我們保持Cache裡面的資料,經過一種快速的壓縮演算法,比較傳統的我們可以使用GZip,那實際上在這種對時效性要求比較高的技術裡面,我們是要求更快速的演算法,比如說有一些DOZO演算法,它對CPU消耗很小,但它壓縮很快,效果也非常好。

另外的一個新問題,單點故障,我們非常依賴那個Cache,假如某個時候它突然崩潰了,那麼應用訪問可能就會遇到很大的問題,也就是響應速度會出問題,為了解決這個問題,我推薦的做法是,使用一致性的雜湊演算法,就說送我一個業務,他可以用多個Cache伺服器來完成,然後我們使用一致性的雜湊演算法,當一個Cache崩潰之後,它的請求就可以分散到其它的Cache來完成,總體的那個振盪不會太大,也就是說這個延遲會分散開來,讓使用者訪問頁面的時候感覺不到,實際上後臺它可能有一臺伺服器,剛才經歷一次Crash,可能造成一次波動,經過我們這樣改造之後,使用者可能察覺不到這種變化。

InfoQ:用其它的伺服器,同時來彌補這個地方的失誤?

衛華:
對,使用一致性的雜湊演算法,能夠巧妙地達到這個目的。

InfoQ:您剛才提到了NoSQL,另外在最近的業界還有一個流行的詞就是Cloud,雲端計算,我們是不是有計劃以後會把微博系統推廣到雲平臺上,或者說採用雲端計算的方式來處理呢?

衛華:
沒錯,我們微博現在有一部分跟雲端計算結合比較密切,我們現在微博正打算推出一個開放平臺,開放平臺什麼意思呢?就是說,第三方的開發者可以在我們上面寫應用,可以連線到新浪微博,比如說可以獲取資訊,可以發表微博,而這些應用程式,可以放在我們的開發的另外一個服務上,叫新浪雲。這個新浪雲有什麼好處呢?這些第三方開發的應用,可能他剛開發的時候,請求量不大,但有可能因為這個創意很好,忽然訪問量大了。如果你用你自己的解決方案的話,可能就達不到這種要求。比如說最大的問題,可能就是全國訪問不暢,或者訪問量突然增長了,原來的伺服器不夠用,你要自己去加硬體,來不及處理。如果你放在那個新浪雲上面的話,那我們系統自動會幫你解決這個問題,不管你的一個非常小的程式,比如一天只有幾百個訪問,還是一個海量的應用,我們都能夠放在這個平臺裡面。在這個雲應用裡面,你不需要自己操心,系統自動會幫你把這個任務完成。另外它還有一個好處就是,這個雲自動實現了全國分佈,你只要Host在上面,全國的使用者不管從哪裡訪問,他可以訪問一個就近的伺服器,這在速度比自己部署都具有很大的優勢。

InfoQ:那咱們新浪雲現在已經正式推出來,還是正在計劃中?

衛華:
我們現在還處於測試階段,我們採用一種邀請式,希望邀請更多的開發者來試用它,我們根據開發者的反饋來改善它,等到一定程度,我們再去大規模地推廣。

InfoQ:以後對於大家來維護自己的微博、訪問別人微博,是不是也更方便,不一定非要到各種各樣的網頁上,或者是手機等等,可以在自己開發的程式上就可以做這些事了,對吧?

衛華:
對,以後結合這個微博的開放平臺,結合新浪雲,可以形成一個良好的生態圈,第三方的開發者要有一個很好的環境,給微博增加各種創意,增加各種應用。

InfoQ:這應該是對開發者帶來的一個福音。

衛華:
對。

InfoQ:感謝楊衛華先生接受我們的採訪。謝謝!