新聞中心
LinkedIn是當今***的專業(yè)社交網(wǎng)站之一,本文描述了LinkedIn是如何管理數(shù)據(jù)的。如你對文中的觀點有異議亦或文中有遺漏的部分請隨時告訴我。

創(chuàng)新互聯(lián)擁有十余年成都網(wǎng)站建設工作經(jīng)驗,為各大企業(yè)提供成都網(wǎng)站設計、成都網(wǎng)站制作服務,對于網(wǎng)頁設計、PC網(wǎng)站建設(電腦版網(wǎng)站建設)、成都app軟件開發(fā)、wap網(wǎng)站建設(手機版網(wǎng)站建設)、程序開發(fā)、網(wǎng)站優(yōu)化(SEO優(yōu)化)、微網(wǎng)站、域名注冊等,憑借多年來在互聯(lián)網(wǎng)的打拼,我們在互聯(lián)網(wǎng)網(wǎng)站建設行業(yè)積累了很多網(wǎng)站制作、網(wǎng)站設計、網(wǎng)絡營銷經(jīng)驗,集策劃、開發(fā)、設計、營銷、管理等網(wǎng)站化運作于一體,具備承接各種規(guī)模類型的網(wǎng)站建設項目的能力。
LinkedIn.com數(shù)據(jù)用例
下面是一些數(shù)據(jù)用例,可能我們在瀏覽LinkedIn網(wǎng)頁時都已經(jīng)看到過了。
- 更新后的個人資料后幾乎可以實時的出現(xiàn)在招聘搜索頁面
- 更新后的個人資料后幾乎可以實時的出現(xiàn)在人脈網(wǎng)頁
- 分享一個更新,可以近實時的出現(xiàn)在新聞feed頁面
- 然后會更新到其他只讀頁面,像”你可能認識的人“、”看過我資料的人“、”相關搜索“等。
令人震驚的是,如果我們使用較好的寬帶,這些頁面可以在數(shù)毫秒內(nèi)完成加載!讓我們向LinkedIn工程師團隊致敬!
早期的LinkedIn數(shù)據(jù)架構
像其它初創(chuàng)公司一樣,LinkedIn 早期也是通過單個的RDBMS (關系型數(shù)據(jù)庫管理系統(tǒng))的幾張表來保存用戶資料和人脈關系。是不是很原始?后來這個RDMBS擴展出兩個額外的數(shù)據(jù)庫系統(tǒng),其中一個用來支撐用戶個人資料的全文搜索,另一個用來實現(xiàn)社交圖。這兩個數(shù)據(jù)庫通過Databus來取得***數(shù)據(jù)。Databus是一個變化捕捉系統(tǒng),它的主要目標就是捕捉那些來至可信源(像Oracle)中數(shù)據(jù)集的變更,并且把這些變化更新到附加數(shù)據(jù)庫系統(tǒng)中。
但是,沒過多久這種架構就已經(jīng)很難滿足網(wǎng)站的數(shù)據(jù)需求了。因為按照Brewerd的CAP理論想要同時滿足下面的條件看似不太可能:
一致性:所有應用在同一時刻看到相同的數(shù)據(jù)
可用性:保證每個請求都能收到應答,無論成功或失敗
分區(qū)容錯性:部分系統(tǒng)的消息丟失或失敗不影響系統(tǒng)系統(tǒng)整體的正常運行
根據(jù)上面的法則,LinkedIn工程師團隊實現(xiàn)了他們稱作為時間線一致性(或者說近線系統(tǒng)的最終一致性,下面會解釋)以及另外兩個特性:可用性和分區(qū)容錯性。下面介紹目前LinkedIn的數(shù)據(jù)架構。
LinkedIn如今的數(shù)據(jù)架構
如果要支撐在不到一秒鐘內(nèi)處理數(shù)百萬用戶的相關事務,上面的數(shù)據(jù)架構已經(jīng)明顯不足了。因此,LinkedIn 工程師團隊提出了三段式(three-phase)數(shù)據(jù)架構,由在線、離線以及近線數(shù)據(jù)系統(tǒng)組成??傮w上講,LinkedIn數(shù)據(jù)被存儲在如下幾種不同形式的數(shù)據(jù)系統(tǒng)中(看下面的圖):
- RDBMS
- Oracle
- MySQL(作為Espresso的底層數(shù)據(jù)存儲)
- RDBMS
- Espresso(LinkedIn自己開發(fā)的文檔型NoSQL數(shù)據(jù)存儲系統(tǒng))
- Voldemart (分布式Key-value存儲系統(tǒng))
- HDFS (存放Hadoop map-reduce任務的數(shù)據(jù))
- Caching
- Memcached
- 基于Lucene的索引
- 存放查詢、關系圖等功能數(shù)據(jù)的Lucene 索引
- Espresso使用的索引
圖:LinkedIn數(shù)據(jù)庫系統(tǒng)包括了DataBus、NoSQL、RDBMS以及Indexes
上面提到的數(shù)據(jù)存儲庫被歸為三種不同類型的系統(tǒng),下面會逐一解釋:
在線數(shù)據(jù)庫系統(tǒng)
在線系統(tǒng)處理用戶的實時互動;主數(shù)據(jù)庫像Oracle就屬于這一類別。主數(shù)據(jù)存儲用來支撐用戶的寫操作和少量的讀操作。以Orcale為例,Oracle master會執(zhí)行所有的寫操作。最近,LinkedIn正在開發(fā)另一個叫做“Espresso”的數(shù)據(jù)系統(tǒng)來滿足日益復雜的數(shù)據(jù)需求,而這些數(shù)據(jù)看似不應從像Oracle這類的RDBMS中獲取。他們能否淘汰所有或大部分的Oracle并將數(shù)據(jù)完全轉移到像Espresso這類的NoSQL數(shù)據(jù)存儲系統(tǒng)中去?讓我們拭目以待。
Espresso是一個支持水平擴展、索引、時間線一致性、基于文檔且高可用的NoSQL數(shù)據(jù)倉庫,
旨在代替支撐公司網(wǎng)頁操作所使用的傳統(tǒng)Oracle數(shù)據(jù)庫。設計它的初衷是為了提高LinkedIn的InMail消息服務的可用性。目前有如下一些應用在使用Espresso作為可信源系統(tǒng)。能夠看到NoSQL數(shù)據(jù)存儲是如果被用來處理如此眾多應用的數(shù)據(jù)需求很是神奇!
- 成員間消息,
- 社交動作,如:更新
- 文章分享
- 用戶個人資料
- 公司資料
- 新聞文章
離線數(shù)據(jù)庫系統(tǒng)
離線系統(tǒng)主要包括Hadoop和一個Teradata數(shù)據(jù)倉庫,用來執(zhí)行批處理和分析類的工作。之所以被稱為離線是因為它對數(shù)據(jù)執(zhí)行的的批處理操作。 Apache Azkaban被用來管理Hadoop和ETL任務,這些任務從主可信源系統(tǒng)獲取數(shù)據(jù)后交由map-reduce處理,處理結果被保存在HDFS,然后通知’消費者‘(例如:Voldemart)通過合適的方式來獲取這些數(shù)據(jù)并切換索引來保證能獲取到***的數(shù)據(jù)。
#p#
近線數(shù)據(jù)庫系統(tǒng)(時間線一致性)
近線系統(tǒng)的目標是為了實現(xiàn)時間線一致性(或最終一致性),它處理類似’你可能認識的人(只讀數(shù)據(jù)集)‘、搜索以及社交圖這些功能,這些功能的數(shù)據(jù)會持續(xù)更新,但它們對延遲性的要求并不像在線系統(tǒng)那樣高。下面是幾種不同類型的近線系統(tǒng):
- Voldemart,一個Key-Value存儲系統(tǒng),為系統(tǒng)中的只讀頁面提供服務。Voldemart的數(shù)據(jù)來源于Hadoop框架(Hadoop Azkaban:編排Hadoop map-reduce任務的執(zhí)行計劃)。這就是近線系統(tǒng),它們從類似Hadoop的離線系統(tǒng)獲取數(shù)據(jù)。下面這些頁面的數(shù)據(jù)都是來自于Voldemart:
- 你可能認識的人
- 看過本頁面的人還在看
- 相關搜索
- 你可能感興趣的工作
- 你可能感興趣的事件
- 下面是幾種不同的索引,這些索引由Databus-一個變化數(shù)據(jù)捕捉系統(tǒng)-來更新的:
- 供SeaS(Search-as-a-Service)使用的’成員搜索索引‘。當你在LinkedIn上搜索不同的成員時,這些數(shù)據(jù)就是來自于搜索索引。通常這個功能對招聘人員的幫助很大。
- 社交圖索引幫助在人們的人脈關系中顯示成員以及關系。通過這個索引用戶幾乎可以實時的得到網(wǎng)絡關系的變化。
- 通過讀復制集獲取到的成員資料數(shù)據(jù)。這些數(shù)據(jù)會被’標準化服務‘訪問。讀復制集是對源數(shù)據(jù)庫的復制,這樣能使源數(shù)據(jù)庫的更新同步到這些復制集上面。增加讀復制集的最主要原因是能夠通過將讀操查詢分散到讀復制集上來減輕源數(shù)據(jù)庫(執(zhí)行用戶發(fā)起的寫操作)的壓力。
下圖展示了數(shù)據(jù)變化捕獲事件是如何利用Databus更新到近線系統(tǒng)的:
用數(shù)據(jù)用例來展示它們是如何工作的
假如你更新了你個人資料中的***技能和職位。你還接受了一個連接請求。那么在系統(tǒng)內(nèi)部到底發(fā)生了什么:
- 將更新寫入Oracle Master數(shù)據(jù)庫
- 然后Databus做了如下一系列奇妙的工作來實現(xiàn)時間線一致性:
- 將資料變更,如***技能和職位信息,更新到標準化服務。
- 將上面提到的變更更新到搜索索引服務。
- 將關系變更更新到圖索引服務。
數(shù)據(jù)架構經(jīng)驗
如果要設計一個像LinkedIn.com一樣的支持數(shù)據(jù)一致性、高擴展性且高可用性的數(shù)據(jù)架構,可以借鑒下面的經(jīng)驗:
- 數(shù)據(jù)庫讀寫分離:你應當計劃兩種數(shù)據(jù)庫,一種用來執(zhí)行寫操作的可以稱為“可信源”系統(tǒng),另一種執(zhí)行讀操作的可以稱為派生數(shù)據(jù)庫系統(tǒng)。這里的經(jīng)驗法則就是將由用戶發(fā)起的寫操作和用戶讀操作使用的數(shù)據(jù)庫區(qū)分開來。
- 派生數(shù)據(jù)庫系統(tǒng):用戶的讀操作應該被分配到派生數(shù)據(jù)庫或者讀復制集上去。而派生數(shù)據(jù)庫系統(tǒng)則可以建立在下面的系統(tǒng)之上:
- Lucene 索引
- NoSQL數(shù)據(jù)存儲,例如:Voldemart、Redis、Cassandra、MongoDB等。
- 對于用戶的讀操作,應該盡量從主可信源數(shù)據(jù)庫系統(tǒng)創(chuàng)建索引或者基于key-value的數(shù)據(jù)(來源于Hadoop map-reduce之類的系統(tǒng)),并且將每次由用戶發(fā)起的被寫入主可信源系統(tǒng)的變更一并更新到這些索引或派生數(shù)據(jù)(key-value)。
- 為確保派生數(shù)據(jù)庫系統(tǒng)的數(shù)據(jù)是***的,你可以選擇應用復寫(application-dual writes),即在應用層同時寫入主數(shù)據(jù)庫和派生數(shù)據(jù)庫系統(tǒng),或日志挖掘(讀取通過批處理任務得到的主數(shù)據(jù)存儲系統(tǒng)的事務提交日志)。
- 創(chuàng)建派生數(shù)據(jù)時,你可以針對主數(shù)據(jù)集或者變更數(shù)據(jù)集執(zhí)行基于Hadoop的map-reduce任務,然后更新HDFS并且通知派生數(shù)據(jù)存儲系統(tǒng)(類似Voldemart的NoSQL存儲)來取走數(shù)據(jù)。
- 對于數(shù)據(jù)一致性來說,你可以以將這些數(shù)據(jù)存儲庫創(chuàng)建為分布式系統(tǒng),集群中的每個節(jié)點又都包含主從節(jié)點。所有節(jié)點都可以創(chuàng)建水平擴展的數(shù)據(jù)Shards。
- 為了保證這些分布式數(shù)據(jù)存儲系統(tǒng)正常運行時間***化,你可以使用像Apache Helix這一類的集群管理工具。
參考文獻
- Siddarth Anand LinkedIn Data Infrastructure paper
- https://github.com/linkedin/databus
- http://gigaom.com/2013/03/03/how-and-why-linkedin-is-becoming-an-engineering-powerhouse/
- http://highscalability.com/blog/2012/3/19/linkedin-creating-a-low-latency-change-data-capture-system-w.html
網(wǎng)站名稱:從LinkedIn的數(shù)據(jù)處理機制學習數(shù)據(jù)架構
標題URL:http://m.5511xx.com/article/ccscsdo.html


咨詢
建站咨詢
