KAFKA分布式消息系統

Kafka[1]linkedin用于日志處理的分布式消息隊列,linkedin的日志數據容量大,但對可靠性要求不高,其日志數據主要包括用戶行為(登錄、瀏覽、點擊、分享、喜歡)以及系統運行日志(CPU、內存、磁盤、網絡、系統及進程狀態)。

?

當前很多的消息隊列服務提供可靠交付保證,并默認是即時消費(不適合離線)。高可靠交付對linkedin的日志不是必須的,故可通過降低可靠性來提高性能,同時通過構建分布式的集群,允許消息在系統中累積,使得kafka同時支持離線和在線日志處理。

?

注:本文中發布者(publisher)與生產者(producer)可以互換,訂閱者(subscriber)與消費者(consumer)可以互換。

?

Kafka的架構如下圖所示:

20196318_1314527613UU4v.png

Kafka存儲策略

1.??kafkatopic來進行消息管理,每個topic包含多個partition),每個part對應一個邏輯log,有多個segment組成。

2.??每個segment中存儲多條消息(見下圖),消息id由其邏輯位置決定,即從消息id可直接定位到消息的存儲位置,避免id到位置的額外映射。

3.??每個part在內存中對應一個index,記錄每個segment中的第一條消息偏移。

4.??發布者發到某個topic的消息會被均勻的分布到多個part上(隨機或根據用戶指定的回調函數進行分布),broker收到發布消息往對應part的最后一個segment上添加該消息,當某個segment上的消息條數達到配置值或消息發布時間超過閾值時,segment上的消息會被flush到磁盤,只有flush到磁盤上的消息訂閱者才能訂閱到,segment達到一定的大小后將不會再往該segment寫數據,broker會創建新的segment

20196318_1314527666TOFm.png

發布與訂閱接口


20196318_1314527750K25z.jpg

發布消息時,kafka client先構造一條消息,將消息加入到消息集set中(kafka支持批量發布,可以往消息集合中添加多條消息,一次行發布),send消息時,client需指定消息所屬的topic

20196318_13145277628111.jpg

訂閱消息時,kafka client需指定topic以及partition num(每個partition對應一個邏輯日志流,如topic代表某個產品線,partition代表產品線的日志按天切分的結果),client訂閱后,就可迭代讀取消息,如果沒有消息,client會阻塞直到有新的消息發布。consumer可以累積確認接收到的消息,當其確認了某個offset的消息,意味著之前的消息也都已成功接收到,此時broker會更新zookeeper上地offset registry(后面會講到)。

?

高效的數據傳輸

1.??發布者每次可發布多條消息(將消息加到一個消息集合中發布), sub每次迭代一條消息。

2.??不創建單獨的cache,使用系統的page cache。發布者順序發布,訂閱者通常比發布者滯后一點點,直接使用linuxpage cache效果也比較后,同時減少了cache管理及垃圾收集的開銷。

3.??使用sendfile優化網絡傳輸,減少一次內存拷貝。

?

無狀態broker

1.??Broker沒有副本機制,一旦broker宕機,該broker的消息將都不可用。

2.??Broker不保存訂閱者的狀態,由訂閱者自己保存。

3.??無狀態導致消息的刪除成為難題(可能刪除的消息正在被訂閱),kafka采用基于時間的SLA(服務水平保證),消息保存一定時間(通常為7天)后會被刪除。

4.??消息訂閱者可以rewind back到任意位置重新進行消費,當訂閱者故障時,可以選擇最小的offset進行重新讀取消費消息。

?

Consumer group

1.?允許consumer group(包含多個consumer,如一個集群同時消費)對一個topic進行消費,不同的consumer group之間獨立訂閱。

2.?為了對減小一個consumer group中不同consumer之間的分布式協調開銷,指定partition為最小的并行消費單位,即一個group內的consumer只能消費不同的partition

?

Zookeeper 協調控制

1.?管理brokerconsumer的動態加入與離開。

2.?觸發負載均衡,當brokerconsumer加入或離開時會觸發負載均衡算法,使得一

? ?個consumer group內的多個consumer的訂閱負載平衡。

3.? 維護消費關系及每個partion的消費信息。


Zookeeper上的細節:

1.?每個broker啟動后會在zookeeper上注冊一個臨時的broker registry,包含brokerip地址和端口號,所存儲的topicspartitions信息。

2.?每個consumer啟動后會在zookeeper上注冊一個臨時的consumer registry:包含consumer所屬的consumer group以及訂閱的topics

3.?每個consumer group關聯一個臨時的owner registry和一個持久的offset registry。對于被訂閱的每個partition包含一個owner registry,內容為訂閱這個partitionconsumer id;同時包含一個offset registry,內容為上一次訂閱的offset

?

消息交付保證

1.?kafka對消息的重復、丟失、錯誤以及順序型沒有嚴格的要求。

2.?kafka提供at-least-once delivery,即當consumer宕機后,有些消息可能會被重復delivery

3.?因每個partition只會被consumer group內的一個consumer消費,故kafka保證每個partition內的消息會被順序的訂閱。

4.?Kafka為每條消息為每條消息計算CRC校驗,用于錯誤檢測,crc校驗不通過的消息會直接被丟棄掉。

?

Linkedin的應用環境

如下圖,左邊的應用于日志數據的在線實時處理,右邊的應用于日志數據的離線分析(現將日志pullhadoopDWH中)。

20196318_13145278267LUq.png

?

?

Kafka的性能

?

測試環境: 2 Linux machines, each with 8 2GHz cores,? 16GB? of? memory,? 6? disks? with? RAID? 10.? The? two machines? are? connected? with? a? 1Gb? network? link.? One? of? the machines was used as the broker and the other machine was used as the producer or the consumer.

?

測試評價(by me):(1)環境過于簡單,不足以說明問題。(2)對于producer持續的波動沒有進行分析。(3)只有兩臺機器zookeeper都省了??

?

測試結果:如下圖,完勝其他的message queue,單條消息發送(每條200bytes,能到50000messages/sec50batch方式發送,平均為400000messages/sec.

20196318_1314527856S4tS.jpg

Kafka未來研究方向

1. 數據壓縮(節省網絡帶寬及存儲空間)

2. Broker多副本

3. 流式處理應用


參考資料

【1】??http://research.microsoft.com/en-us/um/people/srikanth/netdb11/netdb11papers/netdb11-final12.pdf

【2】??https://cwiki.apache.org/KAFKA/kafka-papers-and-presentations.data/Kafka-netdb-06-2011.pdf

轉載于:https://www.cnblogs.com/yunnotes/archive/2013/04/19/3032352.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259831.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259831.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259831.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

jar打包 剔除第三方依賴以及它的依賴_面試官:為什么Spring Boot的jar可以直接運行?...

來源:Gormats Notesfangjian0423.github.io/2017/05/31/springboot-executable-jar/Spring Boot Loader抽象的一些類JarLauncher的執行過程關于自定義的類加載器LaunchedURLClassLoaderSpring Boot Loader的作用SpringBoot提供了一個插件spring-boot-maven-plugin用…

CQRS架構圖

2019獨角獸企業重金招聘Python工程師標準>>> 轉載于:https://my.oschina.net/darkness/blog/814243

SQLite中不支持的sql語法

今天很自然的在寫Sql語句的時候用了Top,一開始沒發現問題,因為我從數據庫讀出的值正好是0,而我習慣變量定義的時候也都賦值0,可是到我不要0的時候我就發現問題了。后來才知道,可愛的小sqlite竟然有不支持的sql語法。 看…

Analyzer普通用戶登錄不了[從網絡訪問此計算機]

問題: 最近客戶諾奇反映說Analyzer普通用戶登錄不了,但是發現管理員又可以登錄,幾經周折發現原來是系統的本地安全策略設置了不讓遠程使用本地賬戶密碼登錄系統導致。解決方案: 修改本地安全策略的“從遠程訪問此計算機”中的用戶…

金蝶系統服務器要求,金蝶服務器安裝及其相關要求.doc

K/3WISE創新管理平臺 V12.2標準部署環境說明目錄1. 多語言部署規則21.1 客戶端多語言部署規則21.2 中間層多語言部署規則31.3 數據庫多語言部署規則31.4 人力資源、管理門戶、CRM多語言部署規則41.5 Citrix遠程接入多語言部署規則42. 多語言部署架構圖52.1 簡體中間層52.2 繁體…

源碼 移植_FreeModbus移植總結

modbus是一項工業上經常用到的通訊協議,而freemodbus是一款開源的從機協議棧。關于它的移植網上已經有了很多的文章,但是大多都只是針對其中部分問題的表述。本文將會把自己在移植freemodbus過程中遇到的問題以及freemodbus的源碼分析盡量表述清楚。&…

expect腳本的簡單應用

expect是一個用來處理交互的命令。借助于expect我們可以把交互過程寫在一個腳本上,使之自動化完成。expect最核心的四個命令:send:用于向進程發送字符串 except:從進程接收字符串 spawn:打開一個新的進程 interact:保持交互的狀態首先一個簡單…

ajax中datatype是json,dataType:'json'vs data:$ .ajax中的JSON.stringify(obj)

我有這個數據結構:var formValues {TemporaryToken: a.userStatus.get("TemporaryToken"),MemorableWordPositionAndValues:[{Position: a.userStatus.get("MemorableWordPositions")[0],Value: this.$([name"login-memorable-character-…

sqlserver 查詢中使用Union或Union All

在 程序人生網站上 看到了 這篇文章 就收藏了 哈 http://www.ourcodelife.com/article-415-1.html 首先,在程序人生網站上,需要負責任的指出的是在SQL Server查詢中使用Union或Union All后Order by排序無效,我不確認是不是微軟的bug&#xf…

word標題大綱級別_快速按標題層級把Word轉Excel—附詳細操作步驟

如何快速把層級分明的word文檔轉換成橫向從屬結構的excel表格一、問題描述文檔如下圖所示。文檔一共三個層次,大綱級別分別是1、2、3級,左則是其文檔結構圖,可以看出文檔層級分明。最終要將文檔轉換成如下橫向從屬結構的表格。一個層次的內容…

生成GUID唯一值的方法匯總(dotnet/javascript/sqlserver)

一、在 .NET 中生成1、直接用.NET Framework 提供的 Guid() 函數,此種方法使用非常廣泛。GUID(全局統一標識符)是指在一臺機器上生成的數字,它保證對在同一時空中的任何兩臺計算機都不會生成重復的 GUID 值(即保證所有…

Thread.CurrentPrincipal HttpContext.Current.User

據說要這樣寫才穩妥 // This principal will flow throughout the request.VoyagerPrincipal principal new VoyagerPrincipal(yada, yada, yada); // Attach the new principal object to the current HttpContext objectHttpContext.Current.User principal; // Make sure …

江森系統設置服務器日期,江森自控METASYS操作手冊

? Alarm? Trend顯示窗口中的按鈕編號 A B按鈕說明允許您編輯所示項目的屬性。選擇Save按鈕可保存修改。 顯示這個窗口中以前顯示過的內容。每個窗口最多可顯示5個歷史項目。顯示已保存的下一個窗口中的內容。鎖定選中的顯示窗口(防止被其他拖拽來的項目覆蓋)。您可調整被鎖定…

servlet中getWriter和getOutputStream的區別

getWriter();getOutputStream();區別:1、getWriter()用于向客戶機回送字符數據2、getOutputStream()返回的對象,可以回送字符數據,也可以回送字節數據(二進制數據)如何選擇:若果我們回送字符數據&#xff0…

execve系統調用_張凱捷—系統調用分析(3) (基于最新Linux5.0版本系統調用日志收集系統)...

在上一篇文章《系統調用分析(2)》中介紹和分析了32位和64位的快速系統調用指令——sysenter/sysexit和syscall/sysret,以及內核對快速系統調用部分的相關代碼,并追蹤了一個用戶態下的系統調用程序運行過程。本篇中將基于最新的Linux-5.0內核,…

批量下載小說網站上的小說(python爬蟲)

隨便說點什么 因為在學python,所有自然而然的就掉進了爬蟲這個坑里,好吧,主要是因為我覺得爬蟲比較酷,才入坑的。 想想看,你可以批量自動的采集互聯網上海量的資料數據,是多么令人激動啊! 所以我…

Playground

題意 :求被兩點分割的凸包面積的較小值 題意已經給出順時針啦 就是求以某一個點 和其他所有相鄰點組成三角形的面積,然后sum存和求兩點的時候就求出那兩點的之間所有三角形的和再減掉0點和那兩點的面積一減就是其中一個三角形的面積。轉載于:https://…

華為歐拉系統服務器開接口,華為操作系統 euleros

華為操作系統 euleros 內容精選換一換Atlas 900 AI集群安裝上架、服務器基礎參數配置、安裝操作系統等操作,請根據集群配置參見對應的手冊:《Atlas 900 PoD 用戶指南 (型號9000, 直流)》《Atlas 900 PoD 用戶指南 (型號9000, 交流)》《Atlas 900 計算節點…

對勾函數_對勾函數?2020福建省中考壓軸題分析

訓練營機密視頻大公開歡迎轉發、分享傳播知識,傳播力量!福建也是全省統一考選擇題:這題考的是二次函數的性質,先求出對稱軸就好了填空題:這題看似有反比例,確實會用到反比例函數的對稱性。但其實重點是考察…

這個textview有問題嗎 為什么一使用就崩潰

問題描述<TextViewandroid:id"id/textview1"android:layout_columnSpan"4"android:layout_gravity"fill"android:gravity"right"android:text"0" />public class MainActivity extends Activity {Button one;TextView…