日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

微博日活躍用戶1.6億+,每日訪問量達百億級,面對龐大用戶群的海量訪問,良好的架構且不斷改進的緩存體系具有非常重要的支撐作用。

本文大綱

1、 微博在運行過程中的數據挑戰
2、 Feed平臺系統架構
3、 Cache架構及演進
3、 總結與展望

數據挑戰

新浪微博應對日訪問量百億級的緩存架構設計

 

數據挑戰

Feed平臺系統架構

新浪微博應對日訪問量百億級的緩存架構設計

 

Feed平臺系統架構

Feed平臺系統架構總共分為五層,最上面是端層,比如web端、客戶端、大家用的IOS或Android/ target=_blank class=infotextkey>安卓的一些客戶端,還有一些開放平臺、第三方接入的一些接口;下一層是平臺接入層,不同的池子,主要是為了把好的資源集中調配給重要的核心接口,這樣遇到突發流量的時候,就有更好的彈性來服務,提高服務穩定性。再下面是平臺服務層,主要是Feed算法、關系等等。接下來是中間層,通過各種中間介質提供一些服務。最下面一層就是存儲層。

1、Feed Timeline

新浪微博應對日訪問量百億級的緩存架構設計

 

大家日常刷微博的時候,比如在主站或客戶端點一下刷新,最新獲得了十到十五條微博,這是怎么構建出來的呢?

刷新之后,首先會獲得用戶的關注關系。比如他有一千個關注,會把這一千個ID拿到,再根據這一千個UID,拿到每個用戶發表的一些微博。同時會獲取這個用戶的Inbox,就是他收到的特殊的一些消息,比如分組的一些微博、群的微博、下面的關注關系、關注人的微博列表。

拿到這一系列微博列表之后進行集合、排序,拿到所需要的那些ID,再對這些ID去取每一條微博ID對應的微博內容。如果這些微博是轉發過來的,它還有一個原微博,會進一步取原微博內容。通過原微博取用戶信息,進一步根據用戶的過濾詞對這些微博進行過濾,過濾掉用戶不想看到的微博。

根據以上步驟留下的微博,會再進一步來看,用戶對這些微博有沒有收藏、點贊,做一些flag設置,還會對這些微博各種計數,轉發、評論、贊數進行組裝,最后才把這十幾條微博返回給用戶的各種端。

這樣看來,用戶一次請求得到的十幾條記錄,后端服務器大概要對幾百甚至幾千條數據進行實時組裝,再返回給用戶,整個過程對Cache體系強度依賴,所以Cache架構設計優劣會直接影響到微博體系表現的好壞。

2、Feed Cache架構

新浪微博應對日訪問量百億級的緩存架構設計

 

接下來我們看一下Cache架構,它主要分為六層。首先第一層是Inbox,主要是分組的一些微博,然后直接對群主的一些微博。Inbox比較少,主要是推的方式。

然后對于第二層的Outbox,每個用戶都會發常規的微博,都會在它的Outbox里面去。根據存的ID數量,實際上分成多個Cache,普通的大概是200多條,如果長的大概是2000條。

第三層是一些關系,它的關注、粉絲、用戶。

第四層是內容,每一條微博一些內容存在這里。

第五層就是一些存在性判斷,比如某條微博我有沒有贊過。之前有一些明星就說我沒有點贊這條微博怎么顯示我點贊了,引發了一些新聞。而這種就是記錄,實際上她有在某個時候點贊過但可能忘記了。

最下面還有比較大的一層——計數,每條微博的評論、轉發等計數,還有用戶的關注數、粉絲數這些數據。

Cache架構及演進

1、簡單KV數據類型

新浪微博應對日訪問量百億級的緩存架構設計

 

接下來我們著重講一下微博的Cache架構演進過程。最開始微博上線時,我們是把它作為一個簡單的KV數據類型來存儲。我們主要采取哈希分片存儲在MC池子里,上線幾個月之后發現一些問題:有一些節點機器宕機或是其它原因,大量的請求會穿透Cache層達到DB上去,導致整個請求變慢,甚至DB僵死。

于是我們很快進行了改造,增加了一個HA層,這樣即便Main層出現某些節點宕機情況或者掛掉之后,這些請求會進一步穿透到HA層,不會穿透到DB層。這樣可以保證在任何情況下,整個系統命中率不會降低,系統服務穩定性有了比較大的提升。

對于這種做法,現在業界用得比較多,然后很多人說我直接用哈希,但這里面也有一些坑。比如我有一個節點,節點3宕機了,Main把它給摘掉,節點3的一些QA分給其他幾個節點,這個業務量還不是很大,穿透DB,DB還可以抗住。但如果這個節點3恢復了,它又加進來之后,節點3的訪問就會回來,稍后節點3因為網絡原因或者機器本身的原因,它又宕機了,一些節點3的請求又會分給其他節點。這個時候就會出現問題,之前分散給其他節點寫回來的數據已經沒有人更新了,如果它沒有被剔除掉就會出現混插數據。

新浪微博應對日訪問量百億級的緩存架構設計

 

實際上微博是一個廣場型的業務,比如突發事件,某明星找個女朋友,瞬間流量就30%了。突發事件后,大量的請求會出現在某一些節點,會導致這些節點非常熱,即便是MC也沒辦法滿足這么大的請求量。這時MC就會變成瓶頸,導致整個系統變慢。

基于這個原因,我們引入了L1層,還是一個Main關系池,每一個L1大概是Main層的N分之一,六分之一、八分之一、十分之一這樣一個內存量,根據請求量我會增加4到8個L1,這樣所有請求來了之后首先會訪問L1。L1命中的話就會直接訪問,如果沒有命中再來訪問Main-HA層,這樣在一些突發流量的時候,可以由L1來抗住大部分熱的請求。對微博本身來說,新的數據就會越熱,只要增加很少一部分內存就會抗住更大的量。

新浪微博應對日訪問量百億級的緩存架構設計

 

簡單總結一下,通過簡單KV數據類型的存儲,我們實際上以MC為主的,層內HASH節點不漂移,Miss穿透到下一層去讀取。通過多組L1讀取性能提升,能夠抗住峰值、突發流量,而且成本會大大降低。對讀寫策略,采取多寫,讀的話采用逐層穿透,如果Miss的話就進行回寫。對存在里面的數據,我們最初采用Json/xml,2012年之后就直接采用Protocol Buffer格式,對一些比較大的用QuickL進行壓縮。

2、集合類數據

新浪微博應對日訪問量百億級的緩存架構設計

 

剛才講到簡單的QA數據,那對于復雜的集合類數據怎么來處理?

比如我關注了2000人,新增一個人,就涉及到部分修改。有一種方式是把2000個ID全部拿下來進行修改,但這種對帶寬、機器壓力會很大。還有一些分頁獲取,我存了2000個,只需要取其中的第幾頁,比如第二頁,也就是第十到第二十個,能不能不要全量把所有數據取回去。還有一些資源的聯動計算,會計算到我關注的某些人里面ABC也關注了用戶D。這種涉及到部分數據的修改、獲取,包括計算,對MC來說實際上是不太擅長的。

各種關注關系都存在redis里面取,通過Hash分布、儲存,一組多存的方式來進行讀寫分離?,F在Redis的內存大概有30個T,每天都有2-3萬億的請求。

新浪微博應對日訪問量百億級的緩存架構設計

 

在使用Redis的過程中,實際上還是遇到其他一些問題。比如從關注關系,我關注了2000個UID,有一種方式是全量存儲,但微博有大量的用戶,有些用戶登陸得比較少,有些用戶特別活躍,這樣全部放在內存里成本開銷是比較大的。所以我們就把Redis使用改成Cache,比如只存活躍的用戶,如果你最近一段時間沒有活躍,會把你從Redis里踢掉,再次有訪問的時候再把你加進來。

這時存在一個問題,因為Redis工作機制是單線程模式,如果它加某一個UV,關注2000個用戶,可能擴展到兩萬個UID,兩萬個UID塞回去基本上Redis就卡住了,沒辦法提供其他服務。所以我們擴展一種新的數據結構,兩萬個UID直接開了端,寫的時候直接依次把它寫到Redis里面去,讀寫的整個效率就會非常高。它的實現是一個long型的開放數組,通過Double Hash進行尋址。

新浪微博應對日訪問量百億級的緩存架構設計

 

我們對Redis進行了一些其他的擴展,大家可能也在網上看到過我們之前的一些分享,把數據放到公共變量里面,整個升級過程,我們測試1G的話加載要10分鐘,10G大概要十幾分鐘以上,現在是毫秒級升級。

對于AOF,我們采用滾動的AOF,每個AOF是帶一個ID的,達到一定的量再滾動到下一個AOF里去。對RDB落地的時候,我們會記錄構建這個RDB時,AOF文件以及它所在的位置,通過新的RDB、AOF擴展模式,實現全增量復制。

3、其他數據類型-計數

新浪微博應對日訪問量百億級的緩存架構設計

 

接下來還有一些其他的數據類型,比如一個計數,實際上計數在每個互聯網公司都可能會遇到,對一些中小型的業務來說,實際上MC和Redis足夠用的,但在微博里計數出現了一些特點:單條Key有多條計數,比如一條微博,有轉發數、評論數,還有點贊;一個用戶有粉絲數、關注數等各種各樣的數字。因為是計數,它的Value size是比較小的,根據它的各種業務場景,大概就是2-8個字節,一般4個字節為多,然后每日新增的微博大概十億條記錄,總記錄就更可觀了,然后一次請求,可能幾百條計數要返回去。

新浪微博應對日訪問量百億級的緩存架構設計

 

4、計數器-Counter Service

最初是可以采取Memcached,但它有個問題,如果計數超過它內容容量時,會導致一些計數的剔除,宕機或重啟后計數就沒有了。另外可能有很多計數它為零,那這個時候怎么存,要不要存,存的話就占很多內存。微博每天上十億的計數,光存0都要占大量的內存,如果不存又會導致穿透到DB里去,對服務的可溶性會存在影響。

2010年之后我們又采用Redis訪問,隨著數據量越來越大之后,發現Redis內存有效負荷還是比較低的,它一條KV大概需要至少65個字節,但實際上我們一個計數需要8個字節,然后Value大概4個字節,所以有效只有12個字節,還有四十多個字節都是被浪費掉的。這還只是單個KV,如果在一條Key有多個計數的情況下,它就浪費得更多了。比如說四個計數,一個Key 8個字節,四個計數每個計數是4個字節,16個字節大概需要26個字節就行了,但是用Redis存大概需要200多個字節。

后來我們通過自己研發的Counter Service,內存降至Redis的五分之一到十五分之一以下,而且進行冷熱分離,熱數據存在內存里,冷數據如果重新變熱,就把它放到LRU里去。落地RDB、AOF,實現全增量復制,通過這種方式,熱數據單機可以存百億級,冷數據可以存千億級。

新浪微博應對日訪問量百億級的緩存架構設計

 

整個存儲架構大概是上圖這樣,上面是內存,下面是SSD,在內存里是預先把它分成N個Table,每個Table根據ID的指針序列,劃出一定范圍。任何一個ID過來先找到它所在的Table,如果有直接對它增增減減,有新的計數過來,發現內存不夠的時候,就會把一個小的Table Dump到SSD里去,留著新的位置放在最上面供新的ID來使用。

有些人疑問說,如果在某個范圍內,我的ID本來設的計數是4個字節,但是微博特別熱,超過了4個字節,變成很大的一個計數怎么處理?對于超過限制的,我們把它放在Aux dict進行存放,對于落在SSD里的Table,我們有專門的IndAux進行訪問,通過RDB方式進行復制。

5、其他數據類型-存在性判斷

新浪微博應對日訪問量百億級的緩存架構設計

 

除了計數,微博還有一些業務,一些存在性判斷。比如一條微博展現的,有沒有點贊、閱讀、推薦,如果這個用戶已經讀過這個微博了,就不要再顯示給他。這種有一個很大的特點,它檢查是否存在,每條記錄非常小,比如Value1個bit就可以了,但總數據量巨大。比如微博每天新發表微博1億左右,讀的可能有上百億、上千億這種總的數據需要判斷。怎么來存儲是個很大的問題,而且這里面很多存在性就是0。還是前面說的,0要不要存?如果存了,每天就存上千億的記錄;如果不存,那大量的請求最終會穿透Cache層到DB層,任何DB都沒辦法抗住那么大的流量。

新浪微博應對日訪問量百億級的緩存架構設計

 

我們也進行了一些選型,首先直接考慮能不能用Redis。單條KV 65個字節,一個KV可以8個字節的話,Value只有1個bit,這樣算下來每日新增內存有效率是非常低的。第二種我們新開發的Counter Service,單條KV Value1個bit,我就存1個byt,總共9個byt就可以了。這樣每日新增內存900G,存的話可能就只能存最新若干天的,存個三天差不多快3個T了,壓力也挺大,但比Redis已經好很多。

新浪微博應對日訪問量百億級的緩存架構設計

 

我們最終方案是自己開發Phantom,先采用把共享內存分段分配,最終使用的內存只用120G就可以。算法很簡單,對每個Key可以進行N次哈希,如果哈希的某一個位它是1,那么進行3次哈希,三個數字把它設為1。把X2也進行三次哈希,后面來判斷X1是否存在的時候,從進行三次哈希來看,如果都為1就認為它是存在的,如果某一個哈希X3,它的位算出來是0,那就百分百肯定是不存在的。

新浪微博應對日訪問量百億級的緩存架構設計

 

它的實現架構比較簡單,把共享內存預先拆分到不同Table里,在里面進行開方式計算,然后讀寫,落地的話采用AOF+RDB的方式進行處理。整個過程因為放在共享內存里面,進程要升級重啟數據也不會丟失。對外訪問的時候,建Redis協議,它直接擴展新的協議就可以訪問我們這個服務了。

6、小結

新浪微博應對日訪問量百億級的緩存架構設計

 

小結一下,到目前為止,我們關注了Cache集群內的高可用、擴展性、組件高性能,還有一個特別重要就是存儲成本,還有一些我們沒有關注到的,比如運維性如何,微博現在已經有幾千差不多上萬臺服務器等。

7、進一步優化

新浪微博應對日訪問量百億級的緩存架構設計

 

8、服務化

新浪微博應對日訪問量百億級的緩存架構設計

 

采取的方案首先就是對整個Cache進行服務化管理,對配置進行服務化管理,避免頻繁重啟,另外如果配置發生變更,直接用一個腳本修改一下。

新浪微博應對日訪問量百億級的緩存架構設計

 


新浪微博應對日訪問量百億級的緩存架構設計

 

服務化還引入Cluster Manager,實現對外部的管理,通過一個界面來進行管理,可以進行服務校驗。服務治理方面,可以做到擴容、縮容,SLA也可以得到很好的保障。另外,對于開發來說,現在就可以屏蔽Cache資源。

總結與展望

新浪微博應對日訪問量百億級的緩存架構設計

 

最后簡單總結一下,對于微博Cache架構來說,我們從它的數據架構、性能、儲存成本、服務化等不同方面進行了優化增強。歡迎對此有研究或有疑問的同行們留言,跟我們一起探討。

如果您覺得文章對您有幫助,動動你的小指頭,點亮一份陪護在你身邊的燈燭,共勉共勵。

分享到:
標簽:緩存 新浪 架構
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定