LinkedIn 實時低延遲數據抓取系統 Databus 開源

jopen 11年前發布 | 10K 次閱讀 LinkedIn

去年的架構師峰會上,來自LinkedIn的高級軟件工程師Lei Gao做了一場名為《LinkedIn的數據處理架構》的演講,著重介紹LinkedIn內部的數據基礎設施的演變,其中提到Databus數據總線項目,當時就引起大家諸多好奇。前不久,LinkedIn工程團隊官方博客發布消息:Databus項目開源。

在互聯網架構中,數據系統通常分為真實數據(source-of-truth)系統,作為基礎數據庫,存儲用戶產生的寫操作;以及衍生數據庫或索 引,提供讀取和其他復雜查詢操作。后者常常衍生自主數據存儲,會對其中的數據做轉換,有時還要包括復雜的業務邏輯處理。緩存中的數據也來自主數據存儲,當 主數據存儲發生變化,緩存中的數據就需要刷新,或是轉為無效。

LinkedIn內部有很多專用的數據存儲和服務系統,足以構成一個多種多樣的生態系統。基礎的OLTP數據存儲用來處理面向用戶的寫操作和部分 讀操作。其他專用系統提供負責查詢,或者通過緩存用來加速查詢結果。因此,整個生態系統中就需要一個可靠的、支持事務的、保持一致性的數據變更抓取系統。

Databus是一個實時的低延遲數據抓取系統。從2005年就已經開始開發,正式在LinkedIn投入生產系統,是在2011年。

在Databus的Github頁面上,介紹了他們選擇目前解決方案的決策過程。

處理這種需求有兩種常用方式:

應用驅動雙向寫:這種模式下,應用層同時向數據庫和另一個消息系統發起寫操作。這種實現看起來簡單,因為可以控制向數據庫寫的應用代碼。但是, 它會引入一致性問題,因為沒有復雜的協調協議(比如兩階段提交協議或者paxos算法),所以當出現問題時,很難保證數據庫和消息系統完全處于相同的鎖定 狀態。兩個系統需要精確完成同樣的寫操作,并以同樣的順序完成序列化。如果寫操作是有條件的或是有部分更新的語義,那么事情就會變得更麻煩。

數據庫日志挖掘:將數據庫作為唯一真實數據來源,并將變更從事務或提交日志中提取出來。這可以解決一致性問題,但是很難實現,因為Oracle 和MySQL這樣的數據庫有私有的交易日志格式和冗余解決方案,難以保證版本升級之后的可用性。由于要解決的是處理應用代碼發起的數據變更,然后寫入到另 一個數據庫中,冗余系統就得是用戶層面的,而且要與來源無關。對于快速變化的技術公司,這種與數據來源的獨立性非常重要,可以避免應用棧的技術鎖定,或是 綁死在二進制格式上。

在評估了兩種方式的優劣之后,我們決定選擇日志挖掘,將一致性和單一真實數據來源作為最高優先級,而不是易于實現。

Databus的傳輸層端到端延遲是微秒級的,每臺服務器每秒可以處理數千次數據吞吐變更事件,同時還支持無限回溯能力和豐富的變更訂閱功能。概要結構如下圖。

LinkedIn 實時低延遲數據抓取系統 Databus 開源

圖中顯示:Search Index和Read Replicas等系統是Databus的消費者。當主OLTP數據庫發生寫操作時,連接其上的中繼系統會將數據拉到中繼中。簽入在Search Index或是緩存中的Databus消費者客戶端,就會從中繼中拉出數據,并更新索引或緩存。

Databus提供如下功能:

  • 來源獨立:Databus支持多種數據來源的變更抓取,包括Oracle和MySQL。Oracle適配器在開源版本中有提供,MySQL適配器將在以后提供。
  • 可擴展、高度可用:Databus能擴展到支持數千消費者和事務數據來源,同時保持高度可用性。
  • 事務按序提交:Databus能保持來源數據庫中的事務完整性,并按照事務分組和來源的提交順尋交付變更事件。
  • 低延遲、支持多種訂閱機制:數據源變更完成后,Databus能在微秒級內將事務提交給消費者。同時,消費者使用Databus中的服務器端過濾功能,可以只獲取自己需要的特定數據。
  • 無限回溯:這是Databus最具創新性的組件之一,對消費者支持無限回溯能力。當消費者需要產生數據的完整拷貝時(比如新的搜索索引),它不會對主OLTP數據庫產生任何額外負擔,就可以達成目的。當消費者的數據大大落后于來源數據庫時,也可以使用該功能。

LinkedIn 實時低延遲數據抓取系統 Databus 開源

上圖中介紹了Databus系統的構成,包括中繼Relay、bootstrap服務和客戶端庫。Bootstrap服務中包括 Bootstrap Producer和Bootstrap Server。快速變化的消費者直接從Relay中取事件。如果一個消費者大幅落后,它要的數據就不在Relay的日志中,而是在Bootstrap Producer里面,提交給它的,將會是自消費者上次處理變更之后的所有數據變更快照。

Databus Relay中繼的功能主要包括:

  1. 從Databus來源讀取變更行,并在內存緩存內將其序列化為Databus變更事件
  2. 監聽來自Databus客戶端(包括Bootstrap Producer)的請求,并傳輸新的Databus數據變更事件

Databus客戶端的功能主要包括:

  1. 檢查Relay上新的數據變更事件,并執行特定業務邏輯的回調
  2. 如果落后Relay太多,向Bootstrap Server發起查詢
  3. 新Databus客戶端會向Bootstrap Server發起bootstrap啟動查詢,然后切換到向中繼發起查詢,以完成最新的數據變更事件
  4. 單一客戶端可以處理整個Databus數據流,或者可以成為消費者集群的一部分,其中每個消費者只處理一部分流數據

Databus Bootstrap Producer只是一種特定的Databus客戶端,它的功能有:

  1. 檢查中繼上的新數據變更事件
  2. 將變更存儲在MySQL數據庫中
  3. MySQL數據庫供Bootstrap和客戶端使用

Databus Bootstrap Server的主要功能,就是監聽來自Databus客戶端的請求,并返回長期回溯數據變更事件。

在LinkedIn,Databus支持的系統有:

  • 社會化圖譜索引(Social Graph Index),服務LinkedIn所有圖譜查詢
  • 人員搜索索引(People Search Index),支持搜素所有LinkedIn用戶
  • 用戶檔案數據(Member Profile)多個冗余的讀取查詢

對Databus項目感興趣的同學,可以去Github上查看更多信息和相關源碼。

載自: http://www.infoq.com/cn/news/2013/03/linkedin-databus

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!