大數(shù)據(jù)小課堂——深入淺出Kafka
從是否正確出發(fā),而不是從能否接受出發(fā)。
Start with what is right rather than what is acceptable.
弗蘭茲·卡夫卡
1 背景
假設(shè)你意氣風(fēng)發(fā),要開發(fā)新一代的互聯(lián)網(wǎng)應(yīng)用,以期在互聯(lián)網(wǎng)事業(yè)中一展宏圖。借助云計(jì)算,很容易開發(fā)出如下原型系統(tǒng):
1. Web應(yīng)用:部署在云服務(wù)器上,為個(gè)人電腦或者移動(dòng)用戶提供的訪問體驗(yàn)。
2. SQL數(shù)據(jù)庫(kù):為Web應(yīng)用提供數(shù)據(jù)持久化以及數(shù)據(jù)查詢。
這套架構(gòu)簡(jiǎn)潔而高效,很快便能夠部署到百度云等云計(jì)算平臺(tái),以便快速推向市場(chǎng)。互聯(lián)網(wǎng)不就是講究小步快跑嘛!
好景不長(zhǎng)。隨著用戶的迅速增長(zhǎng),所有的訪問都直接通過SQL數(shù)據(jù)庫(kù)使得它不堪重負(fù),不得不加上緩存服務(wù)以降低SQL數(shù)據(jù)庫(kù)的荷載;為了理解用戶行為,開始收集日志并保存到Hadoop上離線處理,同時(shí)把日志放在全文檢索系統(tǒng)中以便快速定位問題;由于需要給投資方看業(yè)務(wù)狀況,也需要把數(shù)據(jù)匯總到數(shù)據(jù)倉(cāng)庫(kù)中以便提供交互式報(bào)表。此時(shí)的系統(tǒng)的架構(gòu)已經(jīng)盤根錯(cuò)節(jié)了,考慮將來還會(huì)加入實(shí)時(shí)模塊以及外部數(shù)據(jù)交互,真是痛并快樂著……
這時(shí)候,應(yīng)該跑慢一些,讓靈魂跟上來。
本質(zhì)上,這是一個(gè)數(shù)據(jù)集成問題。沒有任何一個(gè)系統(tǒng)能夠解決所有的事情,所以業(yè)務(wù)數(shù)據(jù)根據(jù)不同用途存而放在不同的系統(tǒng),比如歸檔、分析、搜索、緩存等。數(shù)據(jù)冗余本身沒有任何問題,但是不同系統(tǒng)之間像意大利面條一樣復(fù)雜的數(shù)據(jù)同步卻是挑戰(zhàn)。
這時(shí)候就輪到Kafka出場(chǎng)了。
Kafka可以讓合適的數(shù)據(jù)以合適的形式出現(xiàn)在合適的地方。Kafka的做法是提供消息隊(duì)列,讓生產(chǎn)者單往隊(duì)列的末尾添加數(shù)據(jù),讓多個(gè)消費(fèi)者從隊(duì)列里面依次讀取數(shù)據(jù)然后自行處理。之前連接的復(fù)雜度是O(N^2),而現(xiàn)在降低到O(N),擴(kuò)展起來方便多了:
在Kafka的幫助下,你的互聯(lián)網(wǎng)應(yīng)用終于能夠支撐飛速增長(zhǎng)的業(yè)務(wù),成為下一個(gè)BAT指日可待。
2 Apache Kafka
Kafka最早由LinkedIn開發(fā),如今已經(jīng)成為Apache基金會(huì)***項(xiàng)目,被Walmart、Netflix、PayPal、Uber、eBay等采用。
在國(guó)內(nèi)互聯(lián)網(wǎng)圈子中Kafka也是大數(shù)據(jù)圈子中必備的社交貨幣,茶余飯后指點(diǎn)江山說起卡夫卡,聯(lián)想到Franz Kafka是文青,聯(lián)想到Apache Kafka的才是大數(shù)據(jù)工程師。
本質(zhì)上Kafka是分布式的流數(shù)據(jù)平臺(tái),因?yàn)橐韵绿匦远?/p>
1. 提供Pub/Sub方式的海量消息處理。
2. 以高容錯(cuò)的方式存儲(chǔ)海量數(shù)據(jù)流。
3. 保證數(shù)據(jù)流的順序。
說起Pub/Sub,熟悉企業(yè)應(yīng)用集成(Enterprise Application Integration,EAI)的朋友不會(huì)陌生,它是一種處理消息的范式,消息的發(fā)布者(Pub)只需要指定消息的類別,而不需要與訂閱者(Sub)打交道。訂閱者對(duì)一個(gè)或多個(gè)類別表達(dá)興趣,于是只接收感興趣的消息,而不需要知道什么樣的發(fā)布者發(fā)布的消息。這種發(fā)布者和訂閱者的解耦可以給應(yīng)用帶來更好的可擴(kuò)展性。
打個(gè)比方,你的公司業(yè)務(wù)蓬勃發(fā)展,前后開發(fā)了多個(gè)互聯(lián)網(wǎng)應(yīng)用都需要做市場(chǎng)推廣。一種方法是通過電話向客戶推廣產(chǎn)品新特性,不但需要找到每個(gè)互聯(lián)網(wǎng)應(yīng)用所對(duì)應(yīng)的客戶名單,還要挨個(gè)電話聯(lián)系,可是,客戶不一定有空接電話或者已經(jīng)在通訊中了,長(zhǎng)長(zhǎng)的客戶名單也會(huì)讓你頭疼不已;另一種方法是為每個(gè)互聯(lián)網(wǎng)應(yīng)用創(chuàng)建一個(gè)微信公眾號(hào)(用公眾號(hào)分割推廣信息),讓客戶訂閱后推送產(chǎn)品新特性的信息(客戶不用關(guān)心到底誰發(fā)的),客戶有空的時(shí)候看一下(客戶不用立等答復(fù)你),信息量太大的話就再加個(gè)同事訂閱(水平擴(kuò)展客戶處理能力),有機(jī)會(huì)還可以介紹給其他潛在用戶訂閱(你也不必特意通知新客戶)。很明顯,電話這種同步消息交換的方式很容易產(chǎn)生瓶頸,而微信公眾號(hào)這類異步消息交換的方式客戶再多也不用擔(dān)心。
Kafka提供的Pub/Sub就是典型的異步消息交換,用戶可以為服務(wù)器日志或者物聯(lián)網(wǎng)設(shè)備創(chuàng)建不同主題(Topic),之后數(shù)據(jù)可以源源不斷地發(fā)送到各個(gè)主題,后端數(shù)據(jù)倉(cāng)庫(kù)、流式分析或者全文檢索等對(duì)接特定主題,服務(wù)器或者物聯(lián)網(wǎng)設(shè)備是無需關(guān)心的。
同時(shí),Kafka可以將主題劃分為多個(gè)分區(qū)(Partition),會(huì)根據(jù)分區(qū)規(guī)則選擇把消息存儲(chǔ)到哪個(gè)分區(qū)中,只要如果分區(qū)規(guī)則設(shè)置的合理,那么所有的消息將會(huì)被均勻的分布到不同的分區(qū)中,這樣就實(shí)現(xiàn)了負(fù)載均衡和水平擴(kuò)展。另外,多個(gè)訂閱者可以從一個(gè)或者多個(gè)分區(qū)中同時(shí)消費(fèi)數(shù)據(jù),以支撐海量數(shù)據(jù)處理能力:
Kafka的設(shè)計(jì)也是源自生活,好比是為公路運(yùn)輸,不同的起始點(diǎn)和目的地需要修不同高速公路(主題),高速公路上可以提供多條車道(分區(qū)),流量大的公路多修幾條車道保證暢通,流量小的公路少修幾條車道避免浪費(fèi)。收費(fèi)站好比消費(fèi)者,車多的時(shí)候多開幾個(gè)一起收費(fèi)避免堵在路上,車少的時(shí)候開幾個(gè)讓汽車并道就好了,嗯……
順便說一句,由于消息是以追加到分區(qū)中的,順序?qū)懘疟P的效率要比隨機(jī)寫內(nèi)存還要高,是Kafka高吞吐率的重要保證之一。
為了保證數(shù)據(jù)的可靠性,Kafka會(huì)給每個(gè)分區(qū)找一個(gè)節(jié)點(diǎn)當(dāng)帶頭大哥(Leader),以及若干個(gè)節(jié)點(diǎn)當(dāng)隨從(Follower)。消息寫入分區(qū)時(shí),帶頭大哥除了自己復(fù)制一份外還會(huì)復(fù)制到多個(gè)隨從。如果隨從掛了,Kafka會(huì)再找一個(gè)隨從從帶頭大哥那里同步歷史消息;如果帶頭大哥掛了,隨從中會(huì)選舉出新一任的帶頭大哥,繼續(xù)笑傲江湖。
***,每個(gè)發(fā)布者發(fā)送到Kafka分區(qū)中的消息是確保順序的,訂閱者可以依賴這個(gè)承諾進(jìn)行后續(xù)處理。
3 百度Kafka
Kafka優(yōu)點(diǎn)種種,但是要把Kafka用好并不容易。開源免費(fèi)是好事情,但是如何能夠保證24x7的運(yùn)維保障業(yè)務(wù)穩(wěn)定運(yùn)行是個(gè)大問題。同時(shí),初期業(yè)務(wù)量小的時(shí)候,閑置Kafka集群又能造成很大的浪費(fèi)。
針對(duì)以上問題,百度云天算大數(shù)據(jù)平臺(tái)推出了百度Kafka服務(wù)。大體上,百度Kafka是社區(qū)版本的多租戶全托管服務(wù),與自行運(yùn)維Kafka集群相比,有以下增強(qiáng):
1. 開箱即用:可以直接創(chuàng)建主題并使用Kafka服務(wù),專注業(yè)務(wù)而不用花費(fèi)精力去安裝、部署、配置、調(diào)試和維護(hù)集群。
2. 低廉價(jià)格:只需為使用的資源而不是虛擬主機(jī)付費(fèi),同時(shí)支持動(dòng)態(tài)擴(kuò)容。
3. 數(shù)據(jù)安全:支持SSL加密,保證數(shù)據(jù)在傳輸?shù)倪^程中不被竊聽或者篡改。
4. 可靠耐用:獨(dú)特的服務(wù)高可用性以及數(shù)據(jù)高可靠性設(shè)計(jì)。
秉承開源開放的宗旨,百度Kafka與社區(qū)的Kafka高度兼容,遷移成本極低且不用擔(dān)心被供應(yīng)商綁定。
附靚照一張:
點(diǎn)擊百度Kafka了解更多,具體玩法請(qǐng)看下集。