LinkedIn是如何優化Kafka的
1.LinkedIn在Kafka上的主要關注領域有哪些?
2.如何共享Kafka Broker的?
3.可靠性方面做了哪些增強?
4.LinkedIn在哪些維度保證了叢集的平衡?
5.LinkedIn還支援哪些內部服務?
配額(Quotas)
開發新的Customer
可靠性和可用性的提升
安全性
Kafka監控框架
故障測試
應用延遲監控
保持Kafka叢集平衡
在其他的資料系統中,將Kafka作為核心的組成部分
LinkedIn的Kafka生態系統
2.如何共享Kafka Broker的?
3.可靠性方面做了哪些增強?
4.LinkedIn在哪些維度保證了叢集的平衡?
5.LinkedIn還支援哪些內部服務?
在LinkedIn的資料基礎設施中,Kafka是核心支柱之一。來自LinkedIn的工程師曾經就Kafka寫過一系列的專題文章,包括它的現狀和未來、如何規模化執行、如何適應LinkedIn的開源策略以及如何適應整體的技術棧等。近日,來自LinkedIn的高階工程主管Kartik Paramasivam撰文分享了他們使用和優化Kafka的經驗。
LinkedIn在2011年7月開始大規模使用Kafka,當時Kafka每天大約處理10億條訊息,這一資料在2012年達到了每天200億條,而到了2013年7月,每天處理的訊息達到了2000億條。在幾個月前,他們的最新記錄是每天利用Kafka處理的訊息超過1萬億條,在峰值時每秒鐘會發布超過450萬條訊息,每週處理的資訊是1.34 PB。每條訊息平均會被4個應用處理。在過去的四年中,實現了1200倍的增長。
隨著規模的不斷擴大,LinkedIn更加關注於Kafka的可靠性、成本、安全性、可用性以及其他的基礎指標。在這個過程中,LinkedIn的技術團隊在多個特性和領域都進行了有意義的探索。
LinkedIn在Kafka上的主要關注領域包括:
配額(Quotas)
在LinkedIn,不同的應用使用同一個Kafka叢集,所以如果某個應用濫用Kafka的話,將會對共享叢集的其他應用帶來效能和SLA上的負面影響。有些合理的使用場景有可能也會帶來很壞的影響,比如如果要重新處理整個資料庫的所有資料的話,那資料庫中的所有記錄會迅速推送到Kafka上,即便Kafka效能很高,也會很容易地造成網路飽和和磁碟衝擊。
Kartik Paramasivam繪圖展現了不同的應用是如何共享Kafka Broker的:
為了解決這個問題,LinkedIn的團隊研發了一項特性,如果每秒鐘的位元組數超過了一個閾值,就會降低這些Producer和Customer的速度。對於大多數的應用來講,這個預設的閾值都是可行的。但是有些使用者會要求更高的頻寬,於是他們引入了白名單機制,白名單中的使用者能夠使用更高數量的頻寬。這種配置的變化不會對Kafka Broker的穩定性產生影響。這項特性執行良好,在下一版本的Kafka釋出版中,所有的人就都能使用該特性了。
開發新的Customer
目前的Kafka Customer客戶端依賴於ZooKeeper,這種依賴會產生一些大家所熟知的問題,包括ZooKeeper的使用缺乏安全性以及Customer例項之間可能會出現的腦裂現象(split brain)。因此,LinkedIn與Confluent以及其他的開源社群合作開發了一個新的Customer。這個新的Customer只依賴於Kafka Broker,不再依賴於ZooKeeper。這是一項很複雜的特性,因此需要很長的時間才能完全應用於生產環境中。
在Kafka中,目前有兩個不同型別的Customer。如果Customer希望完全控制使用哪個分割槽上的Topic的話,就要使用低階別的Customer。在高階別的Customer中,Kafka客戶端會自動計算如何在Customer例項之間分配Topic分割槽。這裡的問題在於,如果使用低階別Customer的話,會有許多的基本任務要去完成,比如錯誤處理、重試等等,並且無法使用高階別Customer中的一些特性。在LinkedIn這個新的Customer中,對低階別和高階別的Customer進行了調和。
可靠性和可用性的提升
按照LinkedIn這樣的規模,如果Kafka的新版本中有什麼重要缺陷的話,就會對可靠性產生很大的影響。因此,LinkedIn技術團隊一項很重要的任務就是發現和修正缺陷。他們在可靠性方面所做的增強包括:
Mirror Maker無損的資料傳輸:Mirror Maker是Kafka的一個元件,用來實現Kafka叢集和Kafka Topic之間的資料轉移。LinkedIn廣泛使用了這項技術,但是它在設計的時候存在一個缺陷,在傳輸時可能會丟失資料,尤其是在叢集升級或機器重啟的時候。為了保證所有的訊息都能正常傳輸,他們修改了設計,能夠確保只有訊息成功到達目標Topic時,才會認為已經完全消費掉了。
副本的延遲監控:所有釋出到Kafka上的訊息都會複製副本,以提高永續性。當副本無法“跟上”主版本(master)的話,就認為這個副本處於非健康的狀態。在這裡,“跟上”的標準指的是配置好的位元組數延遲。這裡的問題在於,如果傳送內容很大的訊息或訊息數量不斷增長的話,那麼延遲可能會增加,那麼系統就會認為副本是非健康的。為了解決這個問題,LinkedIn將副本延遲的規則修改為基於時間進行判斷。
實現新的Producer:LinkedIn為Kafka實現了新的Producer,這個新的Producer允許將訊息實現為管道(pipeline),以提升效能。目前該功能尚有部分缺陷,正在處於修復之中。
刪除Topic:作為如此成熟的產品,Kafka在刪除Topic的時候,會出現難以預料的後果或叢集不穩定性,這一點頗令人驚訝。在幾個月前,LinkedIn對其進行了廣泛地測試並修改了很多缺陷。到Kafka的下一個主版本時,就能安全地刪除Topic了。
安全性
在Kafka中,這是參與者最多的特性之一,眾多的公司互相協作來解決這一問題。其成果就是加密、認證和許可權等功能將會新增到Kafka中,在LinkedIn,預期在2015年能使用加密功能,在2016年能使用其他的安全特性。
Kafka監控框架
LinkedIn最近正在致力於以一種標準的方式監控Kafka叢集,他們的想法是執行一組測試應用,這些應用會發布和消費Kafka Topic資料,從而驗證基本的功能(順序、保證送達和資料完整性等)以及端到端釋出和消費訊息的延時。除此之外,這個框架還可以驗證Kafka新版本是否可以用於生產環境,能夠確保新版本的Kafka Broker不會破壞已有的客戶端。
故障測試
當拿到新的Kafka開源版本後,LinkedIn會執行一些故障測試,從而驗證發生失敗時Kafka新版本的質量。針對這項任務,LinkedIn研發了名為Simoorg的故障引導框架,它會產生一些低階別的機器故障,如磁碟寫失敗、關機、殺程式等等。
應用延遲監控
LinkedIn開發了名為Burrow的工具,能夠監控Customer消費訊息的延遲,從而監控應用的健康狀況。
保持Kafka叢集平衡
LinkedIn在如下幾個維度保證了叢集的平衡:
感知機櫃:在進行平衡時,很重要的一點是Kafka分割槽的主版本與副本不要放到同一個資料中心機櫃上。如果不這樣做的話,一旦出現機櫃故障,將會導致所有的分割槽不可用。
確保Topic的分割槽公平地分發到Broker上:在為Kafka釋出和消費訊息確定了配額後,這項功能變得尤為重要。相對於將Topic的分割槽釋出到同一個Broker節點上,如果Topic的分割槽能夠均衡地分發到多個Broker上,那麼相當的它有了更多的頻寬。
確保叢集節點的磁碟和網路容量不會被耗盡:如果幾個Topic的大量分割槽集中到了叢集上的少數幾個節點上,那麼很容易出現磁碟或網路容量耗盡的情況。
在LinkedIn,目前維護站點可靠性的工程師(Site Reliability Enginee,SRE)通過定期轉移分割槽確保叢集的平衡。在分割槽放置和重平衡方面,他們已經做了一些原始設計和原型實現,希望能夠讓系統更加智慧。
在其他的資料系統中,將Kafka作為核心的組成部分
在LinkedIn,使用Espresso作為NoSQL資料庫,目前他們正在將Kafka作為Espresso的備份機制。這將Kafka放到了站點延遲敏感資料路徑的關鍵部分,同時還需要保證更高的訊息傳送可靠性。目前,他們做了很多的效能優化,保證訊息傳輸的低延遲,並且不會影響訊息傳遞的可靠性。
Kafka還會用於非同步上傳資料到Venice之中。除此之外,Kafka是Apache Samza實時流處理的一個重要事件源,同時Samza還使用Kafka作為持久化儲存,儲存應用的狀態。在這個過程中,LinkedIn修改了一些重要的缺陷,並增強了Kafka的日誌壓縮特性。
LinkedIn的Kafka生態系統
除了Apache Kafka Broker、客戶端以及Mirror Maker元件之外,LinkedIn還有一些內部服務,實現通用的訊息功能:
支援非Java客戶端:在LinkedIn,會有一些非Java應用會用到Kafka的REST介面,去年他們重新設計了Kafka的REST服務,因為原始的設計中並不能保證訊息的送達。
訊息的模式:在LinkedIn,有一個成熟的“模式(schema)註冊服務”,當應用傳送訊息到Kafka中的時候,LinkedIn Kafka客戶端會根據訊息註冊一個模式(如果還沒有註冊過的話)。這個模式將會自動在Customer端用於訊息的反序列化。
成本計算:為了統計各個應用對Kafka的使用成本,LinkedIn使用了一個Kafka審計Topic。LinkedIn客戶端會自動將使用情況傳送到這個Topic上,供Kafka審計服務讀取並記錄使用情況,便於後續的分析。
審計系統:LinkedIn的離線報告job會反映每小時和每天的事件情況,而事件從源Kafka Topic/叢集/資料中心,到最後的HDFS儲存是需要時間的。因此,Hadoop job需要有一種機制,保證某個時間視窗能夠獲得所有的事件。LinkedIn Kafka客戶端會生成它們所釋出和消費的訊息數量。審計服務會記錄這個資訊,Hadoop以及其他的服務可以通過REST介面獲取這一資訊。
支援內容較大的訊息:在LinkedIn,將訊息的大小限定為1MB,但是有些場景下,無法滿足這一限制。如果訊息的釋出方和使用方是同一個應用的話,一般會將訊息拆分為片段來處理。對於其他的應用,建議訊息不要超過1MB。如果實在無法滿足該規則的話,訊息的傳送和消費方就需要使用一些通用的API來分割和組裝訊息片段,而在LinkedIn的客戶端SDK中,他們實現了一種特性,能夠自動將一條大的資訊進行分割和重組。
目前,越來越多的國內外公司在使用Kafka,如Yahoo!、Twitter、Netflix和Uber等,所涉及的功能從資料分析到流處理不一而足,希望LinkedIn的經驗也能夠給其他公司一些借鑑。
原文:http://www.infoq.com/cn/articles/linkedIn-improving-kafka
相關文章
- Linkedin工程師是如何優化他們的Java程式碼的工程師優化Java
- LinkedIn Norbert是簡化叢集管理的庫包ORB
- [譯]從LinkedIn,Apache Kafka到Unix哲學ApacheKafka
- Kafka 優秀的架構設計!它的高效能是如何保證的?Kafka架構
- 如何優雅的將Laravel日誌推到Kafka?LaravelKafka
- 我在工作中是如何優化程式碼的優化
- 看Facebook是如何優化React Native效能優化React Native
- 併發的核心:CAS 是什麼?Java8是如何優化 CAS 的?Java優化
- JavaScript是如何工作的:渲染引擎和優化其效能的技巧JavaScript優化
- [譯] JavaScript 是如何工作的:深入網路層 + 如何優化效能和安全JavaScript優化
- 閆燕飛:Kafka的高效能揭祕及優化Kafka優化
- 關鍵詞是如何分類的?哪些適合SEO優化?優化
- Yelp app是如何使用Glide優化圖片載入的APPIDE優化
- Oracle中的等待事件是什麼?如何理解並優化OracleOracle事件優化
- [譯] JavaScript 是如何工作的:CSS 和 JS 動畫背後的原理 + 如何優化效能JavaScriptCSSJS動畫優化
- 如何運用linkedin找工作?
- Kafka入門(3):Sarama生產者是如何工作的Kafka
- 優步是如何用Kafka構建可靠的重試處理保證資料不丟失Kafka
- 從原始碼分析如何優雅的使用 Kafka 生產者原始碼Kafka
- 如何對Kafka 中的訊息實現優先分級?Kafka
- 老闆要調,那就調!思維惰性是如何搞砸留存優化的?優化
- 如何優化tableView優化View
- 如何優化in操作優化
- kafka的優缺點都有那些Kafka
- 如何優化 App 的的包大小?優化APP
- JavaScript是如何工作的: CSS 和 JS 動畫底層原理及如何優化它們的效能JavaScriptCSSJS動畫優化
- 如何優化WindowsOS使SQLServer效能最優化優化WindowsSQLServer
- kafka學習(二)-------- 什麼是KafkaKafka
- MySQL進階【五】—— MySQL查詢優化器是如何選擇索引的MySql優化索引
- Kafka 線上效能調優Kafka
- 如何優化程式效能優化
- 網站如何優化網站優化
- Swift如何優化效能?Swift優化
- 如何優化oracle pga優化Oracle
- MyBatis是如何初始化的?MyBatis
- 「GAN優化」什麼是模式崩潰,以及如何從優化目標上解決這個問題優化模式
- Kafka科普系列 | Kafka中的事務是什麼樣子的?Kafka
- 優步是如何使用Apache Flink和Kafka實現實時Exactly-Once廣告事件處理?ApacheKafka事件