在2010年的QCon北京大會(huì)上,記者對楊衛(wèi)華進(jìn)行了采訪,其中談到了關(guān)于新浪微博系統(tǒng)平臺(tái)應(yīng)對各種問題的解決方案,以及正在開發(fā)中的新浪云。
楊衛(wèi)華,新浪產(chǎn)品部技術(shù)經(jīng)理,目前工作以新浪微博技術(shù)平臺(tái)為主,曾負(fù)責(zé)過新浪IM等通訊服務(wù)端架構(gòu)設(shè)計(jì)。對互聯(lián)網(wǎng)后端技術(shù),分布式,網(wǎng)絡(luò)編程,XMPP即時(shí)通訊等領(lǐng)域感興趣。曾組織多次廣州及珠三角技術(shù)沙龍活動(dòng)。個(gè)人blog 為:http://timyang.net/。
記者:大家都知道,在美國有一個(gè)非常有名的信息分享平臺(tái)叫做Twitter,而在中國,我們也有同樣的方式,就是現(xiàn)在非常流行的新浪微博,它還有個(gè)非常溫馨的名字,叫做圍脖。而新浪微博的架構(gòu)就是楊衛(wèi)華先生主持開發(fā)的。
今天我有幸采訪到楊衛(wèi)華先生,讓他來給大家談一談,在新浪微博的技術(shù)架構(gòu)方面,他們是如何為用戶提供更好的性能、更好的服務(wù)的。
衛(wèi)華先生你好,我的第一個(gè)問題是,在新浪微博上有很多名人,名人的微博一般都是非常熱的,對它們的訪問量也特別高,那么對于這些微博,您采用了什么樣的方式來支持這種大數(shù)據(jù)量的訪問呢?
楊衛(wèi)華(以下簡稱衛(wèi)華):對于這個(gè)問題,我們做過專門的分析。因?yàn)樽罱吕宋⒉┯忻嗽训默F(xiàn)象,我們根據(jù)這個(gè)現(xiàn)象,從以下幾個(gè)角度來進(jìn)行解決。
首先根據(jù)中國的網(wǎng)絡(luò)現(xiàn)狀,比如說網(wǎng)通和電信,之間的網(wǎng)絡(luò)訪問速度會(huì)比較慢,我們考慮讓用戶能夠訪問就近的服務(wù)器,這樣使用體驗(yàn)、速度都能達(dá)到要求。我們根據(jù)新浪以往的經(jīng)驗(yàn),在全國部署了大量服務(wù)器,這樣就為微博提供了硬件上的保證。
第二個(gè)方面,在程序優(yōu)化的方面,在產(chǎn)品上線之前,我們進(jìn)行了全方面的壓力測試,如果系統(tǒng)在某個(gè)方面可能會(huì)出現(xiàn)瓶頸,比如名人的訪問量比較高的話,我們就從那個(gè)角度去優(yōu)化。比如說Cache是否夠用,數(shù)據(jù)庫訪問是不是瓶頸,這方面我們預(yù)先都有對壓力的估計(jì),然后會(huì)針對那些方面去做優(yōu)化。
第三個(gè)方面,對于那些靜態(tài)資源,比如圖片、視頻、JS腳本,我們有專業(yè)的CDN來解決的,這樣就能夠保證全國的用戶在訪問新浪微博時(shí)都能夠得到比較好的體驗(yàn)。
記者:現(xiàn)在的服務(wù)器大概都架設(shè)在哪幾個(gè)部分?覆蓋全國哪幾個(gè)地區(qū)?
衛(wèi)華:全國基本上大部分省份都有服務(wù)器,特別是一些比較核心的節(jié)點(diǎn),比如北京、上海、廣州,在這些核心的節(jié)點(diǎn)可能部署了更多的服務(wù)器,而在其它一些二線城市、其它省份也都有部署的。
記者:您也是為這種大數(shù)據(jù)量做了充分的準(zhǔn)備。最近大家都知道,玉樹發(fā)生地震,對于這種突發(fā)事件,我們也會(huì)把微博作為一種信息交流、信息分享的平臺(tái),大家的訪問也會(huì)造成大數(shù)據(jù)量訪問,那么對于這種突發(fā)事件,您在技術(shù)架構(gòu)上也做了相應(yīng)的準(zhǔn)備嗎?
衛(wèi)華:對,這種突發(fā)事件以及訪問峰值,是微博上經(jīng)常出現(xiàn)的現(xiàn)象。突發(fā)事件的訪問峰值有兩種,一種是可以預(yù)測的,比如說我們將來要搞的世界杯,比如春節(jié),大家都相互拜年這種;另外一種是不可預(yù)測的,比如地震這種。對可以預(yù)測的這種,我們事先會(huì)做準(zhǔn)備,比如說世界杯,我們要增加相關(guān)的服務(wù)器來完成。而面對這種不可預(yù)測的情況時(shí),我們平時(shí)會(huì)有個(gè)數(shù)字,那就是我們平時(shí)的平均流量,硬件設(shè)備要比它高一定量,這樣就能夠應(yīng)對這種峰值的請求。
另外從程序上來說,我們可能有一些專門的機(jī)制,比如說用戶發(fā)表微博,并不是一發(fā)表就存到數(shù)據(jù)庫中,簡單地理解,他不是這樣操作的。業(yè)界中微博之類的產(chǎn)品都有一種機(jī)制,叫做異步機(jī)制,也就是說,在發(fā)表的時(shí)候,我會(huì)把這個(gè)信息放到消息隊(duì)列里面,然后再用另外一個(gè)專門的業(yè)務(wù)處理程序來處理它。當(dāng)某一時(shí)刻發(fā)表量非常大,比如說地震了,很多人都會(huì)發(fā)表,那這個(gè)時(shí)候系統(tǒng)依然能夠有條不紊的來處理這個(gè)業(yè)務(wù),這樣子就能讓我們的系統(tǒng)穩(wěn)定運(yùn)行,并具有高可用性。
記者:也就是要對整個(gè)事務(wù)的進(jìn)行有效的控制?
衛(wèi)華:對。
記者:大家應(yīng)該知道,因?yàn)橛羞@么多的微博,有那么多名人,而且還有很多平民的、草根的微博,系統(tǒng)的數(shù)據(jù)量也是非常非常大的,而且還有很多很多的評論,很多很多的留言等等。那么對于這種海量存儲(chǔ),是不是也要做技術(shù)架構(gòu)上的準(zhǔn)備?
衛(wèi)華:對,微博這個(gè)產(chǎn)品從技術(shù)上來說,有一個(gè)很大的特征,就是每天用戶發(fā)表特別容易,這造成每天新增的數(shù)據(jù)量都是百萬級(jí)的、上千萬級(jí)的這樣一個(gè)量。這樣你經(jīng)常要面對的一個(gè)問題就是增加服務(wù)器,因?yàn)橐话阋慌_(tái)mySQL服務(wù)器,它可能支撐的規(guī)模也就是幾千萬,或者說復(fù)雜一點(diǎn)只有幾百萬,這樣,你可能每天都要增加服務(wù)器,從而解決所你面對的這些問題。你要考慮,如果每天要加服務(wù)器,你的程序上、訪問上會(huì)不會(huì)有問題,會(huì)不會(huì)間斷。
我們其實(shí)有一些優(yōu)化的方法,比如說我們會(huì)考慮熱點(diǎn)數(shù)據(jù)和冷數(shù)據(jù),如果經(jīng)常要訪問的這個(gè)數(shù)據(jù),也就是熱數(shù)據(jù),而過幾天才會(huì)訪問的就是冷數(shù)據(jù),我們會(huì)把它們合并,這樣就可以按這個(gè)時(shí)間來分段,也就是把熱數(shù)據(jù)放在一起,冷數(shù)據(jù)放在一起,這樣可以解決這個(gè)訪問熱點(diǎn)的問題。
另外業(yè)界還有種思路,剛才說的用MySQL,我們采用Shade的技術(shù)會(huì)按時(shí)間分片,這是一種解決思路;另外還有一種解決思路,業(yè)界特別現(xiàn)在國外流行的一種方法,也就是NoSQL的方法。有一種比較好的產(chǎn)品,現(xiàn)在大家比較關(guān)注,叫Cassandra,就可以解決這個(gè)問題。如果我們每天要加一臺(tái)服務(wù)器的話,那么我們程序、運(yùn)維這些能不能跟上呢,是否有一種產(chǎn)品可以讓你程序不需要做絲毫改動(dòng)呢?Cassandra這個(gè)產(chǎn)品就可以幫你來解決這個(gè)問題,你只需要把服務(wù)器插進(jìn)去,那它馬上可以使用,那個(gè)產(chǎn)品內(nèi)部就有這樣的機(jī)制。
記者:那樣的話對我們整個(gè)產(chǎn)品的維護(hù)就比較方便了?
衛(wèi)華:對,這個(gè)可能就是說以后業(yè)界發(fā)展的一種方向,使用這種分布式的存儲(chǔ)來解決這種海量增長的問題。
記者:你覺得NoSQL的數(shù)據(jù)庫和傳統(tǒng)的關(guān)系型的數(shù)據(jù)庫,那種更適合微博這種形式的網(wǎng)站?
衛(wèi)華:從長遠(yuǎn)來說,NoSQL這個(gè)更適合一些,特別是分布式的NoSQL,剛才我也講了,如果能全部下來的話,那可能經(jīng)常要面對這種擴(kuò)充的困擾,需要的干擾,可能是說,如果要保證服務(wù)不間斷,可能就會(huì)面臨一種很大的挑戰(zhàn),NoSQL,特別是這些分布式的NoSQL產(chǎn)品在內(nèi)部就解決了這種問題,你不用停機(jī),就可以加服務(wù)器,加設(shè)備。
記者:這會(huì)對我們用戶造成很大的方便?
衛(wèi)華:對。
記者:那么在性能方面,還有一種我們常采用的方式就是Cache的方式,那么在新浪微博系統(tǒng)里面,Cache方式有什么樣的特點(diǎn)?
衛(wèi)華:在像微博這樣的Web2.0產(chǎn)品里面,技術(shù)界有一種很重要的說法,Cache就是RAM,RAM就是Memory的意思,RAM也就是New Disk,內(nèi)存已經(jīng)成為新的磁盤,代替磁盤的訪問了。當(dāng)我們大量使用Cache的時(shí)候,可能會(huì)存在很多問題,比如很多那種Web2.0的產(chǎn)品,它在Cache的數(shù)量已經(jīng)不是G的概念了,不是幾G、4G、8G的,可能達(dá)到一個(gè)TB的概念了,一個(gè)T相當(dāng)于1024G,面對這樣海量的數(shù)據(jù),那我們訪問的時(shí)候可能就會(huì)出現(xiàn)很多新的問題,比如我們的帶寬,因?yàn)橛脩粽埱笪业氖醉摰臅r(shí)候,他會(huì)獲取很多資源,比如有50個(gè)人關(guān)注你的微博,他需要從Cache里面把這50個(gè)人的數(shù)據(jù)都聚合起來,同時(shí)還會(huì)有很多人也在訪問這個(gè)服務(wù)器,假如說,有一千個(gè)人訪問,這一千個(gè)人里面,每個(gè)人都從五十個(gè)里面選,那么這個(gè)Cache的帶寬將是一個(gè)比較大的問題,這是以前那種我們使用Cache時(shí)沒有遇到過的。然后,為了解決這個(gè)帶寬的問題,我們可以使用壓縮的技術(shù),我們保持Cache里面的數(shù)據(jù),經(jīng)過一種快速的壓縮算法,比較傳統(tǒng)的我們可以使用GZip,那實(shí)際上在這種對時(shí)效性要求比較高的技術(shù)里面,我們是要求更快速的算法,比如說有一些DOZO算法,它對CPU消耗很小,但它壓縮很快,效果也非常好。
另外的一個(gè)新問題,單點(diǎn)故障,我們非常依賴那個(gè)Cache,假如某個(gè)時(shí)候它突然崩潰了,那么應(yīng)用訪問可能就會(huì)遇到很大的問題,也就是響應(yīng)速度會(huì)出問題,為了解決這個(gè)問題,我推薦的做法是,使用一致性的哈希算法,就說送我一個(gè)業(yè)務(wù),他可以用多個(gè)Cache服務(wù)器來完成,然后我們使用一致性的哈希算法,當(dāng)一個(gè)Cache崩潰之后,它的請求就可以分散到其它的Cache來完成,總體的那個(gè)振蕩不會(huì)太大,也就是說這個(gè)延遲會(huì)分散開來,讓用戶訪問頁面的時(shí)候感覺不到,實(shí)際上后臺(tái)它可能有一臺(tái)服務(wù)器,剛才經(jīng)歷一次Crash,可能造成一次波動(dòng),經(jīng)過我們這樣改造之后,用戶可能察覺不到這種變化。
記者:用其它的服務(wù)器,同時(shí)來彌補(bǔ)這個(gè)地方的失誤?
衛(wèi)華:對,使用一致性的哈希算法,能夠巧妙地達(dá)到這個(gè)目的。
記者:您剛才提到了NoSQL,另外在最近的業(yè)界還有一個(gè)流行的詞就是Cloud,云計(jì)算,我們是不是有計(jì)劃以后會(huì)把微博系統(tǒng)推廣到云平臺(tái)上,或者說采用云計(jì)算的方式來處理呢?
衛(wèi)華:沒錯(cuò),我們微博現(xiàn)在有一部分跟云計(jì)算結(jié)合比較密切,我們現(xiàn)在微博正打算推出一個(gè)開放平臺(tái),開放平臺(tái)什么意思呢?就是說,第三方的開發(fā)者可以在我們上面寫應(yīng)用,可以連接到新浪微博,比如說可以獲取信息,可以發(fā)表微博,而這些應(yīng)用程序,可以放在我們的開發(fā)的另外一個(gè)服務(wù)上,叫新浪云。這個(gè)新浪云有什么好處呢?這些第三方開發(fā)的應(yīng)用,可能他剛開發(fā)的時(shí)候,請求量不大,但有可能因?yàn)檫@個(gè)創(chuàng)意很好,忽然訪問量大了。如果你用你自己的解決方案的話,可能就達(dá)不到這種要求。比如說最大的問題,可能就是全國訪問不暢,或者訪問量突然增長了,原來的服務(wù)器不夠用,你要自己去加硬件,來不及處理。如果你放在那個(gè)新浪云上面的話,那我們系統(tǒng)自動(dòng)會(huì)幫你解決這個(gè)問題,不管你的一個(gè)非常小的程序,比如一天只有幾百個(gè)訪問,還是一個(gè)海量的應(yīng)用,我們都能夠放在這個(gè)平臺(tái)里面。在這個(gè)云應(yīng)用里面,你不需要自己操心,系統(tǒng)自動(dòng)會(huì)幫你把這個(gè)任務(wù)完成。另外它還有一個(gè)好處就是,這個(gè)云自動(dòng)實(shí)現(xiàn)了全國分布,你只要Host在上面,全國的用戶不管從哪里訪問,他可以訪問一個(gè)就近的服務(wù)器,這在速度比自己部署都具有很大的優(yōu)勢。
記者:那咱們新浪云現(xiàn)在已經(jīng)正式推出來,還是正在計(jì)劃中?
衛(wèi)華:我們現(xiàn)在還處于測試階段,我們采用一種邀請式,希望邀請更多的開發(fā)者來試用它,我們根據(jù)開發(fā)者的反饋來改善它,等到一定程度,我們再去大規(guī)模地推廣。
記者:以后對于大家來維護(hù)自己的微博、訪問別人微博,是不是也更方便,不一定非要到各種各樣的網(wǎng)頁上,或者是手機(jī)等等,可以在自己開發(fā)的程序上就可以做這些事了,對吧?
衛(wèi)華:對,以后結(jié)合這個(gè)微博的開放平臺(tái),結(jié)合新浪云,可以形成一個(gè)良好的生態(tài)圈,第三方的開發(fā)者要有一個(gè)很好的環(huán)境,給微博增加各種創(chuàng)意,增加各種應(yīng)用。
記者:這應(yīng)該是對開發(fā)者帶來的一個(gè)福音。
衛(wèi)華:對。
記者:感謝楊衛(wèi)華先生接受我們的采訪。謝謝!