如何為Kafka叢集選擇合適的Topics/Partitions數量
這是許多kafka使用者經常會問到的一個問題。本文的目的是介紹與本問題相關的一些重要決策因素,並提供一些簡單的計算公式。
越多的分割槽可以提供更高的吞吐量
首先我們需要明白以下事實:在kafka中,單個patition是kafka並行操作的最小單元。在producer和broker端,向每一個分割槽寫入資料是可以完全並行化的,此時,可以通過加大硬體資源的利用率來提升系統的吞吐量,例如對資料進行壓縮。在consumer段,kafka只允許單個partition的資料被一個consumer執行緒消費。因此,在consumer端,每一個Consumer Group內部的consumer並行度完全依賴於被消費的分割槽數量。綜上所述,通常情況下,在一個Kafka叢集中,partition的數量越多,意味著可以到達的吞吐量越大。
我們可以粗略地通過吞吐量來計算kafka叢集的分割槽數量。假設對於單個partition,producer端的可達吞吐量為p,Consumer端的可達吞吐量為c,期望的目標吞吐量為t,那麼叢集所需要的partition數量至少為max(t/p,t/c)。在producer端,單個分割槽的吞吐量大小會受到批量大小、資料壓縮方法、 確認型別(同步/非同步)、複製因子等配置引數的影響。經過測試,在producer端,單個partition的吞吐量通常是在10MB/s左右。在consumer端,單個partition的吞吐量依賴於consumer端每個訊息的應用邏輯處理速度。因此,我們需要對consumer端的吞吐量進行測量。
雖然隨著時間的推移,我們能夠對分割槽的數量進行新增,但是對於基於Key來生成的這一類訊息需要我們重點關注。當producer向kafka寫入基於key的訊息時,kafka通過key的hash值來確定訊息需要寫入哪個具體的分割槽。通過這樣的方案,kafka能夠確保相同key值的資料可以寫入同一個partition。kafka的這一能力對於一部分應用是極為重要的,例如對於同一個key的所有訊息,consumer需要按訊息的順序進行有序消費。如果partition的數量發生改變,那麼上面的有序性保證將不復存在。為了避免上述情況發生,通常的解決辦法是多分配一些分割槽,以滿足未來的需求。通常情況下,我們需要根據未來1到2年的目標吞吐量來設計kafka的分割槽數量。
一開始,我們可以基於當前的業務吞吐量為kafka叢集分配較小的broker數量,隨著時間的推移,我們可以向叢集中增加更多的broker,然後線上方式將適當比例的partition轉移到新增加的broker中去。通過這樣的方法,我們可以在滿足各種應用場景(包括基於key訊息的場景)的情況下,保持業務吞吐量的擴充套件性。
在設計分割槽數時,除了吞吐量,還有一些其他因素值得考慮。正如我們後面即將看到的,對於一些應用場景,叢集擁有過的分割槽將會帶來負面的影響。
越多的分割槽需要開啟更多地檔案控制代碼
在kafka的broker中,每個分割槽都會對照著檔案系統的一個目錄。在kafka的資料日誌檔案目錄中,每個日誌資料段都會分配兩個檔案,一個索引檔案和一個數據檔案。當前版本的kafka,每個broker會為每個日誌段檔案開啟一個index檔案控制代碼和一個數據檔案控制代碼。因此,隨著partition的增多,需要底層作業系統配置更高的檔案控制代碼數量限制。這更多的是一個配置問題。我們曾經見到過,在生產環境Kafka叢集中,每個broker開啟的檔案控制代碼數量超過30,000。
更多地分割槽會導致更高的不可用性
Kafka通過多副本複製技術,實現kafka叢集的高可用和穩定性。每個partition都會有多個數據副本,每個副本分別存在於不同的broker。所有的資料副本中,有一個數據副本為Leader,其他的資料副本為follower。在kafka叢集內部,所有的資料副本皆採用自動化的方式進行管理,並且確保所有的資料副本的資料皆保持同步狀態。不論是producer端還是consumer端發往partition的請求,皆通過leader資料副本所在的broker進行處理。當broker發生故障時,對於leader資料副本在該broker的所有partition將會變得暫時不可用。Kafka將會自動在其他資料副本中選擇出一個leader,用於接收客戶端的請求。這個過程由kafka controller節點broker自動完成,主要是從Zookeeper讀取和修改受影響partition的一些元資料資訊。在當前的kafka版本實現中,對於zookeeper的所有操作都是由kafka controller來完成的(serially的方式)。
在通常情況下,當一個broker有計劃地停止服務時,那麼controller會在服務停止之前,將該broker上的所有leader一個個地移走。由於單個leader的移動時間大約只需要花費幾毫秒,因此從客戶層面看,有計劃的服務停機只會導致系統在很小時間視窗中不可用。(注:在有計劃地停機時,系統每一個時間視窗只會轉移一個leader,其他leader皆處於可用狀態。)
然而,當broker非計劃地停止服務時(例如,kill -9方式),系統的不可用時間視窗將會與受影響的partition數量有關。假如,一個2節點的kafka叢集中存在2000個partition,每個partition擁有2個數據副本。當其中一個broker非計劃地宕機,所有1000個partition同時變得不可用。假設每一個partition恢復時間是5ms,那麼1000個partition的恢復時間將會花費5秒鐘。因此,在這種情況下,使用者將會觀察到系統存在5秒鐘的不可用時間視窗。
更不幸的情況發生在宕機的broker恰好是controller節點時。在這種情況下,新leader節點的選舉過程在controller節點恢復到新的broker之前不會啟動。Controller節點的錯誤恢復將會自動地進行,但是新的controller節點需要從zookeeper中讀取每一個partition的元資料資訊用於初始化資料。例如,假設一個kafka叢集存在10,000個partition,從zookeeper中恢復元資料時每個partition大約花費2ms,則controller的恢復將會增加約20秒的不可用時間視窗。
通常情況下,非計劃的宕機事件發生的情況是很少的。如果系統可用性無法容忍這些少數情況的場景,我們最好是將每個broker的partition數量限制在2,000到4,000,每個kafka叢集中partition的數量限制在10,000以內。
越多的分割槽可能增加端對端的延遲
Kafka端對端延遲定義為producer端釋出訊息到consumer端接收訊息所需要的時間。即consumer接收訊息的時間減去producer釋出訊息的時間。Kafka只有在訊息提交之後,才會將訊息暴露給消費者。例如,訊息在所有in-sync副本列表同步複製完成之後才暴露。因此,in-sync副本複製所花時間將是kafka端對端延遲的最主要部分。在預設情況下,每個broker從其他broker節點進行資料副本複製時,該broker節點只會為此工作分配一個執行緒,該執行緒需要完成該broker所有partition資料的複製。經驗顯示,將1000個partition從一個broker到另一個broker所帶來的時間延遲約為20ms,這意味著端對端的延遲至少是20ms。這樣的延遲對於一些實時應用需求來說顯得過長。
注意,上述問題可以通過增大kafka叢集來進行緩解。例如,將1000個分割槽leader放到一個broker節點和放到10個broker節點,他們之間的延遲是存在差異的。在10個broker節點的叢集中,每個broker節點平均需要處理100個分割槽的資料複製。此時,端對端的延遲將會從原來的數十毫秒變為僅僅需要幾毫秒。
根據經驗,如果你十分關心訊息延遲問題,限制每個broker節點的partition數量是一個很好的主意:對於b各broker節點和複製因子為r的kafka叢集,整個kafka叢集的partition數量最好不超過100*b*r個,即單個partition的leader數量不超過100.
越多的partition意味著需要客戶端需要更多的記憶體
在最新發布的0.8.2版本的kafka中,我們開發了一個更加高效的Java producer。新版producer擁有一個比較好的特徵,他允許使用者為待接入訊息儲存空間設定記憶體大小上限。在內部實現層面,producer按照每一個partition來快取訊息。在資料積累到一定大小或者足夠的時間時,積累的訊息將會從快取中移除併發往broker節點。
如果partition的數量增加,訊息將會在producer端按更多的partition進行積累。眾多的partition所消耗的記憶體彙集起來,有可能會超過設定的內容大小限制。當這種情況發生時,producer必須通過訊息堵塞或者丟失一些新訊息的方式解決上述問題,但是這兩種做法都不理想。為了避免這種情況發生,我們必須重新將produder的記憶體設定得更大一些。
根據經驗,為了達到較好的吞吐量,我們必須在producer端為每個分割槽分配至少幾十KB的記憶體,並且在分割槽數量顯著增加時調整可以使用的記憶體數量。
類似的事情對於consumer端依然有效。Consumer端每次從kafka按每個分割槽取出一批訊息進行消費。消費的分割槽數越多,需要的記憶體數量越大。儘管如此,上述方式主要運用於非實時的應用場景。
總結
通常情況下,kafka叢集中越多的partition會帶來越高的吞吐量。但是,我們必須意識到叢集的partition總量過大或者單個broker節點partition過多,都會對系統的可用性和訊息延遲帶來潛在的影響。未來,我們計劃對這些限制進行一些改進,讓kafka在分割槽數量方面變得更加可擴充套件。
相關推薦
如何為Kafka叢集選擇合適的Partitions數量
這是許多kafka使用者經常會問到的一個問題。本文的目的是介紹與本問題相關的一些重要決策因素,並提供一些簡單的計算公式。文章目錄 越多的分割槽可以提供更高的吞吐量 首先我們需要明白以下事實:在kafka中,單個patition是kafka並行操作的最小單元。在producer和broker端,向每一個
如何為Kafka叢集選擇合適的Topics/Partitions數量
這是許多kafka使用者經常會問到的一個問題。本文的目的是介紹與本問題相關的一些重要決策因素,並提供一些簡單的計算公式。 越多的分割槽可以提供更高的吞吐量 首先我們需要明白以下事實:在kafka中,單個patition是kafka並行操作的最小單元。在pro
如何為嵌入式應用選擇合適的微控制器
為嵌入式應用選擇合適的微控制器可能是一項至關重要的任務。不僅有各種各樣的技術選擇需要考慮,還有商業案例問題,如價格和交付時間可能會削弱專案。在專案或嵌入式系統應用程式開始時,很有可能在嵌入式系統的細節被刪除之前跳入並開始選擇微控制器。 在對微控制器給予任何考慮之前,軟體和硬體工程師應該計算出
如何為Hadoop叢集選擇正確的硬體
當我們想搭建一個Hadoop大資料平臺時,碰到的第一個問題就是我們到底該如何選擇硬體。 雖然Hadoop被設計為可以執行在標準的X86硬體上,但在選擇具體伺服器配置的時候其實沒那麼簡單。為已知的工作負載或者應用場景選擇硬體時,往往都要綜合考慮效能因素和價效比,才能選擇合
如何選擇合適的Topics、Partitions數量
轉載自:http://blog.csdn.net/xiao_jun_0820/article/details/52573535 越多的分割槽可以提供更高的吞吐量 首先需要明白以下事實:在kafka中,單個patition是kafka並行操作的最小單元。在pro
為基於 x86 的 Android* 遊戲選擇合適的引擎
文章 開源 版本號 操作 ani android uic 摘要 方法 摘要 遊戲開發者知道 Android 中蘊藏著巨大的機遇。 在 Google Play 商店的前 100 款應用中,約一半是遊戲應用(在利潤最高的前 100 款應用中。它們所占的比例超過 90%)
攻略|如何為你的小型企業選擇合適的服務器?
目的 png epo 程序 inter 開源軟件 分配 管理程序 圖形化 很多創業者在創業初期都會發現,很多事情其實都可以很簡單地去處理。比如說,如果團隊之間需要共享文件,通過發送電子郵件或者用U盤分享即可;亦或者如果需要備份數據,則通過插入外部硬盤備份就好;再或者如果在場
歷史性難題——如何為Kafka挑選合適的分割槽數?
作者:朱小廝 來源:朱小廝的部落格 如何為Kafka挑選合適的分割槽數?很多人都為這個問題傷過腦筋。 從吞吐量方面考慮,增加合適的分割槽數可以很大程度上提升整體吞吐量,但是超過對應的閾值之後吞吐量不升反降。如果應用對吞吐量有著一定程度上的要求,建議在投入生產環境之前對同款硬體資源
把kafka資料從hbase遷移到hdfs,並按天載入到hive表(hbase與hadoop為不同叢集)
需求:由於我們用的阿里雲Hbase,按儲存收費,現在需要把kafka的資料直接同步到自己搭建的hadoop叢集上,(kafka和hadoop叢集在同一個區域網),然後對接到hive表中去,表按每天做分割槽 一、首先檢視kafka最小偏移量(offset) /usr/local/kafka/bin/k
為建立Golang GUI程式選擇合適的庫
我認為在Go語言中建立GUI只有兩種相對較好的方式,一是Qt,二則是Electron。 如何選擇? 這要看你的需求。如果你會HTML+CSS+JavaScript,只想使用Go開發對效能沒有多高的程式,那麼使用Electron會更好。如果你不會Web開發,那麼使用Qt Quick會比較好。 之所以要
如何為網站選擇合適的配色方案
可百度搜索 多米諾設計 訪問官網檢視更多精彩內容 www.duomiluo.net 調色盤是網站設計中最重要的元素之一。顏色是情緒調節器,無需文字即可傳達網站的額訊息。除了對網站外觀的直接影響,顏色還可以補充甚至定義你想要在網站設計中表達的意思。 因此,顏色的選擇是
Kafka叢集partitions/replicas預設分配解析
1. Kafka叢集partition replication預設自動分配分析 下面以一個Kafka叢集中4個Broker舉例,建立1個topic包含4個Partition,2 Replication
ASP.NET Core 中文文件 第三章 原理(17)為你的伺服器選擇合適版本的.NET框架
ASP.NET Core基於 .NET Core 專案模型,它支援構建能夠執行在 Windows、Mac和 Linux 上的跨平臺應用程式。當您構建一個 .Net Core 專案的時候,您可以選擇一種 .NET框架來構建您的應用程式,.NET Framework (CLR)、 .NET Core (Core
Hadoop集群選擇合適的硬件配置
hadoop集群選擇合適的硬件配置為Hadoop集群選擇合適的硬件配置 隨著Apache Hadoop的起步,雲客戶的增多面臨的首要問題就是如何為他們新的的Hadoop集群選擇合適的硬件。盡管Hadoop被設計為運行在行業標準的硬件上,提出一個理想的集群配置不想提供硬件規格列表那麽簡單。 選擇硬件,為給定的負
select默認選中項顏色為灰色,選擇後變為黑色(js實現)
pre var select ted col item first round fin <script> var unSelected = "#999"; var selected = "#333"; $(function () {
mysql如何選擇合適的數據類型1:CHAR與VARCHAR
-a 類型 pan table enter 字節 保存 如何 spa CHAR和VARCHAR類型類似,都用來存儲字符串,但它們“保存”和“檢索”的方式不同。CHAR屬於“固定長度”的字符串,而VARCHAR屬於“可變長度”的字符類型。 下表顯示了將各種字符串值保存
迅為iMX6開發板支持單核,雙核,四核處理器,為客戶產品選擇提供靈活性
操作 數據 https 默認 大內存 介紹 采購 用戶需求 tope 本文轉自迅為:http://topeetboard.com 店鋪:https://arm-board.taobao.com 處理器:Freescale Cortex-A9 四核 i.MX6Q 主頻 1.2
怎麽選擇合適靠譜的Java培訓機構-Java該怎麽學?
服務 命令行 講師 狀況 霓虹燈 了解 重要 看書 手冊 選擇java培訓機構三要點 一、到場試聽 java培訓免費試聽,網絡的公開課免費試聽,這些都可以進一步了解到兄弟連的教學水平,熟悉網絡授課環境,還可以咨詢一下其他的學員學習狀況,以此更加了解機構。
IT運維工程師們為什麽選擇使用Linux系統
linuxlinux自誕生之日起,便受到了全世界優秀黑客程序員們的百般寵愛與關註。曾經,linux似乎離我們非常遙遠;而現在,越來越多的人聽說了linux,會去討論linux發行版,會去關註linux內核。而程序員們更是熱衷於使用linux,在linux開發。那麽,究竟linux為什麽吸引著這麽多程序員們的熱
為什麽選擇計算機專業
關於我 如何 電子產品 條件 進入 良好的 事情 自主 大學 一 在上高中的時候無意間了解到了計算機專業,從那時起便對計算機產生了濃厚的興趣。因為經常接觸電子產品 ,學習計算機專業可以讓我更好的去了解計算機專業的發展,並能夠讓我去學著編程,去開發一些自己或者他人