Kafka是個奇葩!——Linkin論文學習筆記

Kafka是啥?##

是個消息中間件嗎?那和市面上其餘一堆堆的中間件例如ActiveMQ, RabbitMQ有什麼區別?前端

答案只有一個:mysql

Kafka是個集羣的消息中間件+存儲,一個節點能夠存儲幾T的數據!sql

爲啥一箇中間件須要存儲數據呢?mongodb

慢慢道來……

原來,對於Linkin這樣的互聯網企業來講,用戶和網站上產生的數據有三種數據庫

  1. 須要實時響應的交易數據,用戶提交一個表單,輸入一段內容,這種數據最後是存放在關係數據庫(Oracle, MySQL)中的,有些須要事務支持。
  2. 活動流數據,準實時的,例如頁面訪問量、用戶行爲、搜索狀況,這些數據能夠產生啥?廣播、排序、個性化推薦、運營監控等。這種數據通常是前端服務器先寫文件,而後經過批量的方式把文件倒到Hadoop這種大數據分析器裏面慢慢整。
  3. 各個層面程序產生的日誌,例如httpd的日誌、tomcat的日誌、其餘各類程序產生的日誌。碼農專用,這種數據一個是用來監控報警,還有就是用來作分析。

Linkin的牛逼之處,就在於他們發現了原先2,3的數據處理方式有問題,對於2而言,原來動輒一兩個鐘頭批處理一次的方式已經不行了,用戶在一次購買完以後最好立刻就能看到相關的推薦。而對於3而言,傳統的syslog模式等也很差用,並且不少狀況下2和3用的是同一批數據,只是數據消費者不同。tomcat

這2種數據的特色是:安全

  1. 準實時,不須要秒級響應,分鐘級別便可。
  2. 數據量巨大,是交易數據的10倍以上。
  3. 數據消費者衆多,例如評級、投票、排序、個性化推薦、安全、運營監控、程序監控、後期報表等

因而,Linkin就本身開發了一套系統,專門用來處理這種性質的數據,這就是Kafka服務器

那麼,在整個實踐過程當中Linkin作了什麼樣的設計,解決了什麼問題?數據結構

首先看下數據流動圖:架構

數據結構圖

多數據中心怎麼管理數據:

跨數據中心圖

集羣自己的架構圖

Kafka內部架構圖

Kafka內部架構圖,分爲數據產生者(Producer),數據中間者(Broker),數據消費者(Consumer)

顯然,這是一個集羣的發佈/訂閱系統,有以下幾個特色

  1. 生產者是推數據(Push),消費者是拉數據(Pull)。存在數據複用,在Linkin平均生產1條消息會被消費5.5次。
  2. 數據生產者和數據消費者的速度不對等,因此要把數據沉澱在Kafka內慢慢處理,Linkin通常在集羣內放7天的數據。
  3. 性能上追求高吞吐,保證必定的延時性以內。這方面作了大量優化,包括沒有全局hash,批量發送,跨數據中心壓縮等等。
  4. 容錯性上使用的「至少傳輸一次」的語義。不保證強一次,但避免最多傳一次的狀況。
  5. 集羣中數據分區,保證單個數據消費者能夠讀到某話題(topic)的某子話題(例如某用戶的數據)的全部數據,避免全局讀數據
  6. 數據規範性,全部數據分爲數百個話題,而後在數據的源頭——生產者(Producer)這邊就用Schema來規範數據,這種理念使得後期的數據傳輸、序列化、壓縮、消費都有了統一的規範,同時也解決了這個領域很是麻煩的數據版本不兼容問題——生產者一改代碼,消費者就抓瞎。
  7. 用於監控,這個系統的威力在於,前面全部生產系統的數據流向,經過這個系統都能關聯起來,用於平常的運營也好,用於數據審計,用於運維級別的監控也好都是神器啊!

To be continued...##

因此,Kafka的設計基本上目前這個領域的惟一選擇。我也看了不少其餘實現,包括:

scribe(Facebook)          | 2   | C++      | 已中止更新,不建議使用
flume(Apache, Cloudera)   |1    | Java     | 配置較重
chukwa(Hadoop)            |12   | Java     | 2012發佈最後一版,不建議使用
fluentd                   |1    | Ruby     | 比較活躍,看起來不錯
logstash                  |12345| JRuby    | 功能全,聽說有很多小bug
splunk                    |12345| C/Python | 商業閉源,功能強大,可作參考
timetunnel(Alibaba)       | 2   | Java     | 基於thrift,10年左右成熟
kafka(Linkin)             | 2 4 | Scala    | 性能強勁,設計巧妙,能夠做爲基礎設施
Samza(Linkin)             |12345|          | =Kafka+YARN+Hadoop
rabbitmq/activemq/qpid    | 2   | Java     | 傳統消息中間件
Storm(twitter)            |  3  | Clojure  | 實時計算系統
Jstorm(Alibaba)           |  3  | Java     | storm的Java版,聽說更穩定
S4(Yahoo)                 |  3  | Java     | 2013年已中止維護
Streambase(IBM)           |  3  | Java     | 商業產品,做爲參考
HStreaming                |  3  | Java     | 商業產品,做爲參考
spark                     |  3  | Scala    | 基於Hadoop
mongodb                   |   4 | C++      | 比較浪費硬盤
mysql                     |   4 | C++      | 無需多說
hdfs/hbase                |   4 | Java     | 無需多說
  1. 數據採集組件
  2. 數據傳輸組件
  3. 數據實時計算/索引/搜索組件
  4. 數據存儲/持久化組件
  5. 數據展現/查詢/報警界面組件

從數據傳輸這塊的設計理念來講,Kafka是最爲先進的,

在目前的各類實現中,我猜想能夠和Kafka一戰的也就只有Splunk了

後面我會分析一下這個軟件的設計和實現

欲知後事如何,且聽下回分解 ~~

主要參考文章

日誌:每一個軟件工程師都應該知道的有關實時數據的統一律念 —— 這篇比較抽象,高屋建瓴,理論先行

Building LinkedIn’s Real-time Activity Data Pipeline —— 實踐層的論文,把作事情的來龍去脈都寫明白了

分佈式發佈訂閱消息系統 Kafka 架構設計 —— 落地設計

次要參考文章

《分佈式發佈訂閱消息系統 Kafka 架構設計》

《StreamBase簡介》

《Yahoo! s4和Twitter storm的粗略比較》

《最火爆的開源流式系統Storm vs 新星Samza》

《架構之淘寶實時數據傳輸平臺: TimeTunnel介紹》

《Graylog2 簡介》

《logstash 仍是不行》

《日誌收集以及分析:Splunk 》

《LogStash日誌分析系統》

《LogStash,使日誌管理更簡單》

《logstash VS splunk》

《個性化離線實時分析系統pora》

《日誌:每一個軟件工程師都應該知道的有關實時數據的統一律念》

《基於Flume的美團日誌收集系統(二)改進和優化》

《基於Flume的美團日誌收集系統(一)架構和設計》

《對互聯網海量數據實時計算的理解》

《流式日誌系統啓示錄》

《flume-ng+Kafka+Storm+HDFS 實時系統搭建》

相關文章
相關標籤/搜索