新浪架構師談微博架構文章_第1頁
新浪架構師談微博架構文章_第2頁
新浪架構師談微博架構文章_第3頁
新浪架構師談微博架構文章_第4頁
新浪架構師談微博架構文章_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

微博平臺首席架構師楊衛(wèi)華演講新浪科技訊11月16日下午消息,由新浪微博()±辦的中國首屆微博開發(fā)者大會在北京舉行,這是國內微博行業(yè)的首場技術盛宴。作為國內微博市場的絕對領軍者,新浪微博將在此次大會上公布一系列針對開發(fā)者的扶持政策,以期與第三方開發(fā)者聯手推動微博行業(yè)的整體發(fā)展。視頻:中國首屆微博開發(fā)者大會楊衛(wèi)華演講媒體來源:新浪科技以下為演講實錄:大家下午好,在座的大部分都是技術開發(fā)者,技術開發(fā)者往往對微博這個產品非常關心。最晚的一次,是12點多收到一個郵件說想了解一下微博底層是怎么構架的。很多技術人員對微博的構架非常感興趣,就是一個明星他有300萬粉絲,這個技術怎么來實現?今天在這里跟大家分享一下微博的底層機構,讓大家對微博的底層技術有更好的了解。另外不管是做客戶端、Web1.0、Web2.0、論壇、博客都要考慮架構的問題,架構實際上是有一些共性的。今天我通過講解微博里面的一些架構,分析一下架構里面哪些共性大家可以參考。首先給大家介紹一下微博架構發(fā)展的歷程。新浪微博在短短一年時間內從零發(fā)展到五千萬用戶,我們的基層架構也發(fā)展了3個大的版本。第一版就LAMP架構,優(yōu)點是可以非??斓膶崿F我們的系統(tǒng)。我們看一下技術特點,微博這個產品從架構上來分析,它需要解決的是發(fā)表和訂閱的問題。我們第一版采用的是推消息模式,假如說我們一個明星用戶他有10萬個粉絲,那就是說用戶發(fā)表一條微博的時候,我們把這個微博消息存成10萬份,這樣就是很簡單了,第一版的架構實際上就是這兩行字。第一版的技術細節(jié),典型的LAMP架構,是使用MyISAM搜索引擎,它的優(yōu)點就是速度非???。另外一個是MPSS,就是多個端口可以布置在同一服務器上。為什么使用MPSS?假如說我們做一個互聯網應用,這個應用里面有三個單元,我們可以由2種部署方式。我們可以把三個單元分別部署在三臺服務器上,另外一種部署模式就是這三個單元部署在每個服務器上都有。我推薦第2種方法。這個方法解決了兩個問題,一個是負載均衡,因為每一個單元都有多個節(jié)點處理,另外一個是可以防止單點故障。如果我們按照模式1來做的話,任何一個節(jié)點有故障就會影響我們系統(tǒng)服務,如果模式二的話,任何一個結點發(fā)生故障我們的整體都不會受到影響的。我們微博第一版上線之后,用戶非常喜歡這個產品,用戶數增長非常迅速。我們技術上碰到幾個問題。第一個問題是發(fā)表會出現延遲現象,尤其是明星用戶他的粉絲多系統(tǒng)需要處理很長時間。另外系統(tǒng)在處理明星用戶發(fā)表時系統(tǒng)繁忙可能會影響到其他的用戶,因為其他的用戶同一時間發(fā)表的話,也會受到這個系統(tǒng)的影響。我們就考慮這個系統(tǒng)怎么改進。首先是推模式,這肯定是延遲的首要原因,我們要把這個問題解決掉。其次我們的用戶越來越多,這個數據庫表從一百萬到一億,數據規(guī)模不一樣處理方式是有差別的。我們第一版單庫單表的模式,當用戶數量增多的時候,它不能滿足就需要進行拆分。第二個是鎖表的問題,我們考慮的是更改引擎。另外一個是發(fā)表過慢,我們考慮的是異步模式。第二版我們進行了模塊化,我們首先做了一個分層,最底層叫基礎層,首先對數據做了拆分,圖上最右邊是發(fā)表做了異步模式。第二個服務層,我們把微博基礎的單元設計成服務層一個一個模塊,最大改進是對推模式進行了改進。首先看一下投遞模式的優(yōu)化,首先我們要思考推模式,如果我們做一下改進把用戶分成有效和無效的用戶。我們一個用戶比如說有一百個粉絲,我發(fā)一條微博的時候不需要推給一百個粉絲,因為可能有50個粉絲不會馬上來看,這樣同步推送給他們,相當于做無用功。我們把用戶分成有效和無效之后,我們把他們做一下區(qū)分,比如說當天登陸過的人我們分成有效用戶的話,只需要發(fā)送給當天登陸過的粉絲,這樣壓力馬上就減輕了,另外投遞的延遲也減小了。我們再看數據的拆分,數據拆分有很多方式,很多互聯網產品最常用的方法,比如說如可以按照用戶的UID來拆分。但是微博用戶的一個特點就是說大家訪問的都是最近的數據,所以我們考慮微博的數據我們按照時間拆分,比如說一個月放一張表,這樣就解決了我們不同時間的維度可以有不同的拆分方式。第二個考慮就是要把內容和索引分開存放。假如說一條微博發(fā)表的uid,微博id是索引數據,140個字的內容是內容數據。假如我們分開的話,內容就簡單的變成了一種keyvalue的方式,key-value是最容易擴展的一種數據。索引數據的拆分具有挑戰(zhàn),比如說一個用戶發(fā)表了一千條微博,這一千條微博我們接口前端要分頁訪問,比如說用戶需要訪問第五頁,那我們需要迅速定位到這個記錄。假如說我們把這個索引拆分成一個月一張表,我們記錄上很難判斷第五頁在哪張表里,我們需要加載所有的索引表。如果這個地方不能拆分,那我們系統(tǒng)上就會有一個非常大的瓶頸。最后我們想了一個方法,就是索引上做了一個二次索引,把每個月記錄的偏移記下來,就是一個月這個用戶發(fā)表了多少條,ID是哪里,就是按照這些數據迅速把記錄找出來。異步處理,發(fā)表是一個非常繁重的操作,它要入庫、統(tǒng)計索引、進入后臺,如果我們要把所有的索引都做完用戶需要前端等待很長的時間,如果有一個環(huán)節(jié)失敗的話,用戶得到的提示是發(fā)表失敗,但是入庫已經成功,這樣會帶來數據不一致問題。所以我們做了一個異步操作,就是發(fā)表成功我們就提示成功,然后在后臺慢慢的消息隊列慢慢的做完。另外新浪發(fā)表了一個很重要的產品叫做MemcacheQ,我們去年做了一個對大規(guī)模部署非常有利的指令,就是statsqueue,適合大規(guī)模運維。第二版我們做了這些改進之后,微博的用戶和訪問量并沒有停止,還有很多新的問題出現。比如說系統(tǒng)問題,單點故障導致的雪崩,第二個是訪問速度問題因為國內網絡環(huán)境復雜,會有用戶反映說在不同地區(qū)訪問圖片、js這些速度會有問題。另外一個是數據壓力以及峰值,MySql復制延遲、慢查詢,另外就是熱門事件,比如說世界杯,可能會導致用戶每秒發(fā)表的內容達到幾千條。我們考慮如何改進,首先系統(tǒng)方面允許任意模塊失敗。另外靜態(tài)內容,第一步我們用CDN來加速,另外數據的壓力以及峰值,我們需要將數據、功能、部署盡可能的拆分,然后提前進行容量規(guī)劃。另一方面我們還有平臺化的需求,去年11月我們就說要做開放平臺,開放平臺的需求是有差異的,Web系統(tǒng)它有用戶行為才有請求,但是API系統(tǒng)特別是客戶端的應用,只要用戶一開機就會有請求,直到他關閉電腦這種請求一直會不間斷的過來,另外用戶行為很難預測。系統(tǒng)規(guī)模在持續(xù)的增大,另外也有平臺化的需求,我們新架構應該怎么做才能滿足這些需要?我們看一下同行,比如說Google怎么樣考慮這個問題的?Google首席科學家講過一句話,就是一個大的復雜的系統(tǒng),應該要分解成很多小的服務。比如說我們在G執(zhí)行一個搜索查詢的話,實際上這個操作會調動內部一百多個服務。因此,我們第三版的考慮就是先有服務才有接口最后才有應用,我們才能把這個系統(tǒng)做大?,F在我們看一下第三版,首先我們把底層的東西分成基礎服務,基礎服務里面有分布式的存儲,我們做了一些去中心化、自動化的操作。在基礎服務之上有平臺服務,我們把微博常用的應用做成各種小的服務。然后我們還有應用服務,這個是專門考慮平臺各種應用的需求。最上面我們有API,API就是新浪微博各種第三方應用都在上面跑。平臺服務和應用服務是分開的,這樣實現了模塊隔離,即使應用服務訪問量過大的話,平臺服務不會首先影響。另外我們把微博的引擎進行了改進,實現了一個分層關系。用戶的關注關系,我們改成一個多惟度的索引結構,性能極大的提高。第四個層面就是計數器的改進,新版我們改成了基于偏移的思路,就是一個用戶他原來讀的一個ID比如說是10000,系統(tǒng)最系的ID是10002的話,我們很清楚他有兩條未讀。原來的版本是采用絕對計數的,這個用戶有幾條未讀都是用一個存儲結構的話,就容易產生一致性的問題,采用這種偏移的技術基本上不會出錯。另外基礎服務DB冷熱分離多維度拆分,在微博里面我們是按照時間拆分的,但是一個大型的系統(tǒng)里面有很多業(yè)務需要有不同的考慮。比如說私信這個就不能按照時間來拆分,這個按照UID來拆分可能更簡單。然后我們突出存儲還做了一個去中心化,就是用戶上傳圖片的速度會極大的提高,另外察看其他用戶的圖片速度也會極大的提高。另外是動態(tài)內容支持多IDC同時更新,這個是在國內比較新穎的。下面給大家介紹一下新浪微博怎么樣打造一個高性能架構。到目前為止有五千萬用戶使用新浪微博,最高發(fā)表3000條以上每秒,然后一個明星用戶發(fā)表的話,會被幾百萬用戶同時讀到。這些問題的本質是我們架構需要考慮高訪問量、海量數據的情況下三個問題。易于擴展、低延遲、高可用和異地分布。我們每天有數十億次外部網頁以及API接口的需求,我們知道微博的特點是用戶請求是無法cache的。因此面對這個需求我們怎么樣擴展?幾點思路。第一我們的模塊設計上要去狀態(tài),我們任意一個單元可以支持任意節(jié)點。另外是去中心化,避免單點及瓶頸。另外是可線性擴展。最后一個是減少模塊。我們要做一個高性能的系統(tǒng),要具備一個低延遲、高實時性,微博要做到高實時性這是核心的價值,實時性的核心就是讓數據離CPU最近,避免磁盤的IO。我們看淘寶核心系統(tǒng)專家余鋒說過的一句話“CPU訪問L1就像從書桌拿一本書,L2是從書架拿一本書,L3是從客廳桌子上拿一本書,訪問主存就像騎車去社區(qū)圖書館拿一書”。我們微博如果要做到非常實時的話,我們就需要把數據盡量離CPU節(jié)點最近。所以我們看一下cache設計里面怎么達到這個目標。首先INBOX,這個數據我們需要放再一個最快的地方,因為用戶隨時訪問。OutBOX里面的最近發(fā)表就是Llcache,還有一個是中期的,這個因為訪問少一點,它可以被踢。最后一部分內容體有三部分。L0是本地的,我們需要把一些經常訪問的,比如說明星發(fā)表微博的內容體本地化,因為它被訪問的概率非常大。然后L1里面存放著最近發(fā)表的,還有一個是中期的。我們通常用L2就可以了,L1我們可以理解成它就是一個RAM存儲。一個好的架構還需要舉行高可用性。我們看一下業(yè)界的指標,S3是99.9%,EC2是99.5%,我們另外一個同行Facebook在這方面它是沒有承諾的,就是接口可用寫。微博平臺目前承諾的是99.95%,就是說一天365天故障率應該小于9小時。這個怎么達到?第一我們要做容量規(guī)劃,要做好監(jiān)控以及入口的管理,就是說有些服務如果訪問量過了的話,我們要有一個開關可以攔住他。我們通過這個圖表可以清楚的看到,比如說我們要做L1的cache,我們剩余空間有多少,比如說80%,就說明這個數據有可能會丟失,有可能會對我們的系統(tǒng)造成影響。另外一個層面就是接口監(jiān)控,我們目前有Google維度的接口監(jiān)控,包括訪問錯誤失敗率。然后要做架構,給大家一個很重要的經驗分享,就是說監(jiān)控的指標盡量量化。比如說他延遲30秒是小問題,如果是延遲10分鐘我們就要立即采取措施了,就是所有可以量化的指標都要量化。然后我們看監(jiān)控怎么樣更好的做?我們看亞馬遜的VP說過的一句話,就是說監(jiān)控系統(tǒng)確實特別好,可以立即告訴我們哪里有故障,但是有20%的概率我們人是會出錯的。所以我們一個大型系統(tǒng)就應該要為自動化設計,就是說盡可能的將一些運作自動化。比如說發(fā)布安裝、服務、啟用、停止。我們再看另外一句,Google的工程師是怎么做的。他是這么做的,比如說第一周是處理線上的業(yè)務,這一周他處理了很多事情,處理了很多系統(tǒng)的情況,剩下幾周時間沒有別的工作,他只要把這一周碰到的情況用程序的方法來解決,下次再碰到這種情況很簡單的一個按鈕就可以處理了。我們目前也在向自動化這方面努力,就是我們的工具在持續(xù)增加。另外一個異地分布,在國內網絡環(huán)境下,比如說IDC災難,機房檢修甚至是機房掉電,我們也碰到過中國最好的機房也會掉電,所以要每個服務單元都能支持多機房部署。另外做多機房部署有一個好處,就是用戶的訪問速度會提高。多IDC分布靜態(tài)內容就不說了,基本上大的互聯網公司都會做,它非常成熟基本上沒有什么問題,比如說圖片等等的靜態(tài)內容。動態(tài)內容的CDN分布是業(yè)內的難點,國內很少有公司能夠做到非常成熟的多機房動態(tài)內容發(fā)布的成熟方案,它的核心就是分布式存儲。一款理想的分布式存儲產品它有哪些需求呢?首先它要支持海量規(guī)模、可擴展、高性能、低延遲、高可用。第二個是需要多機房分布,能夠滿足國內負責的網絡環(huán)境,還要具備異地容災能力。第三個就是要調用簡單,具備豐富數據庫特性。因此分布式存儲需要解決一個多對多的數據復制。如果要做復制無非是三種策略,第一個是Master/Slave,但是它也兩個缺點,第一個是Master是中心化的,如果Master在北京那廣州訪問就非常慢。第二個缺點是有單點風險的,比如說Master在北京,能立即遷到廣州嗎?這樣有個時間窗口的數據就丟失了,而且需要人工的干預,而且日常廣州的用戶訪問北京的Master是有很大延遲問題的,所以一般來說要做的非常優(yōu)秀是不會考慮第一種方案的。第二種就是Multi-Master方案,它需要應用避免沖突,就是我們不能多處改變。這個對于微博來說不會特別難,我們的用戶通常只會再一個地方發(fā)表微博,用戶不會同時在廣州又在北京發(fā)表或者是修改自己的資料,這樣的話我們應用上就已經避免了這種情況。第三個就是Paxos就是可以達到強一致寫,就是一條數據如果成功肯定是多個機房都成功了,這個也顯而易見就是延遲性非常大。因此總結一下Multi-Master是最成熟的策略,但是它現在沒有成熟的產品,因為確實沒有。我們再來看微博的方案,所以我們自己實現了一個多機房同步的方案。就是我們前端應用將數據寫到數據庫,再通過一個消息代理,相當于通過我們自己開發(fā)的一個技術,將數據廣播到多個機房。這個不但可以做到兩個機房,而且可以做到三個、四個。具體的方式就是通過消息廣播方式將數據多點分布,就是說我們的數據提交給一個代理,這個代理幫我們把這些數據同步到多個機房,那我們應用不需要關心這個數據是怎么樣同步過去的。用這種消息代理方式有什么好處呢?可以看一下Yahoo是怎么來做的?第一個是數據提供之后沒有寫到db之后是不會消失的,我只要把數據提交成功就可以了,不需要關心數據怎么到達機房。第二個特點YMB是一款消息代理的產品,但是它唯一神奇的地方是為廣域網設計的,它可以把多機房應用歸到內部,我們應用不需要關注這個問題。這個原理跟我們目前自己開發(fā)的技術相似。然后我們再看一下目前即將推出的微博平臺的新架構。我們知道API大部分的請求都為了獲取最新的數據。API請求有一個特點,它大目前調用都是空返回的,比如說一款手機的客戶端每隔一分鐘它都要調用服務器一下,就是有沒有新數據,大目前的調用都是空返回,就是說不管服務器有沒有數據都要調用一次。這次詢問到下一次詢問中間,如果有新的數據來了,你是不會馬上知道的。因此我們想API能不能改用推的方式,就是客戶端不需要持續(xù)的調用,如果有新數據就會推過去。技術特點,顯而易見低延遲,就是從發(fā)表到接受1秒內完成,實際上可能用不了1秒。然后服務端的連接就是高并發(fā)長連接服務,就是多點都連接在我們的服務器上,這個比傳統(tǒng)的API要大很多。我們看一下推送架構怎么從架構底層做到實時性的。從左上角的一條微博在我們系統(tǒng)發(fā)布之后,我們把它放在一個消息隊列里面,然后會有一個消息隊列的處理程序把它拿過來,處理以后放到db里面。假如說我們不做持久化,因為我們推送數據也不能丟失,我們就要寫一個很復雜的程序,將數據異步去存,這樣就會非常復雜,而且系統(tǒng)也會有不穩(wěn)定的因素。從另外一個角度來說,我們做持久化也是做過測試的。我們推送整個流程可以做到100毫秒和200毫秒之間,就是說我們在這個時間能把數據推送出去。我們再看一下內部細節(jié),就是我們收到數據之后首先要經過最上面RECEIVER。然后推到我們的引擎里面,這個引擎會做兩個事情,首先會把用戶的關系拿過來,然后按照用戶關系馬上推送給他相應的粉絲。所以我們調用方已經在那兒等待了,我們需要有一個喚醒操作,就是說在接口這兒把它喚醒,然后把它發(fā)送過去。最后是一個高并發(fā)的長連服務器,就是一臺服務器支持10萬以上的并發(fā)連接。最右邊中間有一個圓圈叫做StreamBuffer,我們需要StreamBuffer是要保存用戶最近的數據。因為用戶可能會有斷線的,比如說他發(fā)送數據的時候斷線半分鐘,我們需要把這

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論