0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Kafka的再平衡機制的三種分區(qū)重分配

汽車玩家 ? 來源:oschina ? 作者:oschina ? 2020-05-03 18:29 ? 次閱讀

什么是再平衡

所謂的再平衡,指的是在kafka consumer所訂閱的topic發(fā)生變化時發(fā)生的一種分區(qū)重分配機制。一般有三種情況會觸發(fā)再平衡:

consumer group中的新增或刪除某個consumer,導(dǎo)致其所消費的分區(qū)需要分配到組內(nèi)其他的consumer上;

consumer訂閱的topic發(fā)生變化,比如訂閱的topic采用的是正則表達式的形式,如test-*此時如果有一個新建了一個topic test-user,那么這個topic的所有分區(qū)也是會自動分配給當前的consumer的,此時就會發(fā)生再平衡;

consumer所訂閱的topic發(fā)生了新增分區(qū)的行為,那么新增的分區(qū)就會分配給當前的consumer,此時就會觸發(fā)再平衡。

Kafka提供的再平衡策略主要有三種:Round Robin,Range和Sticky,默認使用Range。這三種分配策略的主要區(qū)別在于:

Round Robin:會采用輪詢的方式將當前所有的分區(qū)依次分配給所有的consumer;

Range:首先會計算每個consumer可以消費的分區(qū)個數(shù),然后按照順序?qū)⒅付▊€數(shù)范圍的分區(qū)分配給各個consumer;

Sticky:這種分區(qū)策略是最新版本中新增的一種策略,其主要實現(xiàn)了兩個目的:

將現(xiàn)有的分區(qū)盡可能均衡的分配給各個consumer,存在此目的的原因在于Round Robin和Range分配策略實際上都會導(dǎo)致某幾個consumer承載過多的分區(qū),從而導(dǎo)致消費壓力不均衡;

如果發(fā)生再平衡,那么重新分配之后在前一點的基礎(chǔ)上會盡力保證當前未宕機的consumer所消費的分區(qū)不會被分配給其他的consumer上;

本文主要會通過幾個示例來對上面講解的三種分區(qū)重分配策略的基本實現(xiàn)原理進行講解。

Round Robin

關(guān)于Roudn Robin重分配策略,其主要采用的是一種輪詢的方式分配所有的分區(qū),該策略主要實現(xiàn)的步驟如下。這里我們首先假設(shè)有三個topic:t0、t1和t2,這三個topic擁有的分區(qū)數(shù)分別為1、2和3,那么總共有六個分區(qū),這六個分區(qū)分別為:t0-0、t1-0、t1-1、t2-0、t2-1和t2-2。這里假設(shè)我們有三個consumer:C0、C1和C2,它們訂閱情況為:C0訂閱t0,C1訂閱t0和t1,C2訂閱t0、t1和t2。那么這些分區(qū)的分配步驟如下:

1) 首先將所有的partition和consumer按照字典序進行排序,所謂的字典序,就是按照其名稱的字符串順序,那么上面的六個分區(qū)和三個consumer排序之后分別為:

Kafka的再平衡機制的三種分區(qū)重分配

2) 然后依次以按順序輪詢的方式將這六個分區(qū)分配給三個consumer,如果當前consumer沒有訂閱當前分區(qū)所在的topic,則輪詢的判斷下一個consumer:

嘗試將t0-0分配給C0,由于C0訂閱了t0,因而可以分配成功;

嘗試將t1-0分配給C1,由于C1訂閱了t1,因而可以分配成功;

嘗試將t1-1分配給C2,由于C2訂閱了t1,因而可以分配成功;

嘗試將t2-0分配給C0,由于C0沒有訂閱t2,因而會輪詢下一個consumer;

嘗試將t2-0分配給C1,由于C1沒有訂閱t2,因而會輪詢下一個consumer;

嘗試將t2-0分配給C2,由于C2訂閱了t2,因而可以分配成功;

同理由于t2-1和t2-2所在的topic都沒有被C0和C1所訂閱,因而都不會分配成功,最終都會分配給C2。

按照上述的步驟將所有的分區(qū)都分配完畢之后,最終分區(qū)的訂閱情況如下:

Kafka的再平衡機制的三種分區(qū)重分配

從上面的步驟分析可以看出,輪詢的策略就是簡單的將所有的partition和consumer按照字典序進行排序之后,然后依次將partition分配給各個consumer,如果當前的consumer沒有訂閱當前的partition,那么就會輪詢下一個consumer,直至最終將所有的分區(qū)都分配完畢。但是從上面的分配結(jié)果可以看出,輪詢的方式會導(dǎo)致每個consumer所承載的分區(qū)數(shù)量不一致,從而導(dǎo)致各個consumer壓力不均一。

Range

所謂的Range重分配策略,就是首先會計算各個consumer將會承載的分區(qū)數(shù)量,然后將指定數(shù)量的分區(qū)分配給該consumer。這里我們假設(shè)有兩個consumer:C0和C1,兩個topic:t0和t1,這兩個topic分別都有三個分區(qū),那么總共的分區(qū)有六個:t0-0、t0-1、t0-2、t1-0、t1-1和t1-2。那么Range分配策略將會按照如下步驟進行分區(qū)的分配:

需要注意的是,Range策略是按照topic依次進行分配的,比如我們以t0進行講解,其首先會獲取t0的所有分區(qū):t0-0、t0-1和t0-2,以及所有訂閱了該topic的consumer:C0和C1,并且會將這些分區(qū)和consumer按照字典序進行排序;

然后按照平均分配的方式計算每個consumer會得到多少個分區(qū),如果沒有除盡,則會將多出來的分區(qū)依次計算到前面幾個consumer。比如這里是三個分區(qū)和兩個consumer,那么每個consumer至少會得到1個分區(qū),而3除以2后還余1,那么就會將多余的部分依次算到前面幾個consumer,也就是這里的1會分配給第一個consumer,總結(jié)來說,那么C0將會從第0個分區(qū)開始,分配2個分區(qū),而C1將會從第2個分區(qū)開始,分配1個分區(qū);

同理,按照上面的步驟依次進行后面的topic的分配。

最終上面六個分區(qū)的分配情況如下:

Kafka的再平衡機制的三種分區(qū)重分配

可以看到,如果按照Range分區(qū)方式進行分配,其本質(zhì)上是依次遍歷每個topic,然后將這些topic的分區(qū)按照其所訂閱的consumer數(shù)量進行平均的范圍分配。這種方式從計算原理上就會導(dǎo)致排序在前面的consumer分配到更多的分區(qū),從而導(dǎo)致各個consumer的壓力不均衡。

Sticky

Sticky策略是新版本中新增的策略,顧名思義,這種策略會保證再分配時已經(jīng)分配過的分區(qū)盡量保證其能夠繼續(xù)由當前正在消費的consumer繼續(xù)消費,當然,前提是每個consumer所分配的分區(qū)數(shù)量都大致相同,這樣能夠保證每個consumer消費壓力比較均衡。關(guān)于這種分配方式的分配策略,我們分兩種情況進行講解,即初始狀態(tài)的分配和某個consumer宕機時的分配情況。

1 初始分配

初始狀態(tài)分配的特點是,所有的分區(qū)都還未分配到任意一個consumer上。這里我們假設(shè)有三個consumer:C0、C1和C2,三個topic:t0、t1和t2,這三個topic分別有1、2和3個分區(qū),那么總共的分區(qū)為:t0-0、t1-0、t1-1、t2-0、t2-1和t2-2。關(guān)于訂閱情況,這里C0訂閱了t0,C1訂閱了t0和1,C2則訂閱了t0、t1和t2。這里的分區(qū)分配規(guī)則如下:

1) 首先將所有的分區(qū)進行排序,排序方式為:首先按照當前分區(qū)所分配的consumer數(shù)量從低到高進行排序,如果consumer數(shù)量相同,則按照分區(qū)的字典序進行排序。這里六個分區(qū)由于所在的topic的訂閱情況各不相同,因而其排序結(jié)果如下:

Kafka的再平衡機制的三種分區(qū)重分配

2) 然后將所有的consumer進行排序,其排序方式為:首先按照當前consumer已經(jīng)分配的分區(qū)數(shù)量有小到大排序,如果兩個consumer分配的分區(qū)數(shù)量相同,則會按照其名稱的字典序進行排序。由于初始時,這三個consumer都沒有分配任何分區(qū),因而其排序結(jié)果即為其按照字典序進行排序的結(jié)果:

Kafka的再平衡機制的三種分區(qū)重分配

3) 然后將各個分區(qū)依次遍歷分配給各個consumer,首先需要注意的是,這里的遍歷并不是C0分配完了再分配給C1,而是每次分配分區(qū)的時候都整個的對所有的consumer從頭開始遍歷分配,如果當前consumer沒有訂閱當前分區(qū),則會遍歷下一個consumer。然后需要注意的是,在整個分配的過程中,各個consumer所分配的分區(qū)數(shù)是動態(tài)變化的,而這種變化是會體現(xiàn)在各個consumer的排序上的,比如初始時C0是排在第一個的,此時如果分配了一個分區(qū)給C0,那么C0就會排到最后,因為其擁有的分區(qū)數(shù)是最多的。上面的六個分區(qū)整體的分配流程如下:

3.1) 首先將t2-0嘗試分配給C0,由于C0沒有訂閱t2,因而分配不成功,繼續(xù)輪詢下一個consumer;

3.2) 然后將t2-0嘗試分配給C1,由于C1沒有訂閱t2,因而分配不成功,繼續(xù)輪詢下一個consumer;

3.3) 接著將t2-0嘗試分配給C2,由于C2訂閱了t2,因而分配成功,此時由于C2分配的分區(qū)數(shù)發(fā)生變化,各個consumer變更后的排序結(jié)果為:

Kafka的再平衡機制的三種分區(qū)重分配

3.4) 接下來的t2-1和t2-2,由于也只有C2訂閱了t2,因而其最終還是會分配給C2,最終在t2-0、t2-1和t2-2分配完之后,各個consumer的排序以及其分區(qū)分配情況如下:

Kafka的再平衡機制的三種分區(qū)重分配

3.5) 接著繼續(xù)分配t1-0,首先嘗試將其分配給C0,由于C0沒有訂閱t1,因而分配不成功,繼續(xù)輪詢下一個consumer;

3.6) 然后嘗試將t1-0分配給C1,由于C1訂閱了t1,因而分配成功,此時各個consumer以及其分配的分區(qū)情況如下:

Kafka的再平衡機制的三種分區(qū)重分配

3.7) 同理,接下來會分配t1-1,雖然C1和C2都訂閱了t1,但是由于C1排在C2前面,因而該分區(qū)會分配給C1,即:

Kafka的再平衡機制的三種分區(qū)重分配

3.9) 最后,嘗試將t0-0分配給C0,由于C0訂閱了t0,因而分配成功,最終的分配結(jié)果為:

Kafka的再平衡機制的三種分區(qū)重分配

上面的分配過程中,需要始終注意的是,雖然示例中的consumer順序始終沒有變化,但這是由于各個分區(qū)分配之后正好每個consumer所分配的分區(qū)數(shù)量的排序結(jié)果與初始狀態(tài)一致。這里讀者也可以比較一下這種分配方式與前面講解的Round Robin進行對比,可以很明顯的發(fā)現(xiàn),Sticky重分配策略分配得更加均勻一些。

3.2 模擬consumer宕機

由于前一個示例中最終的分區(qū)分配方式模擬宕機的情形比較簡單,因而我們使用另一種訂閱策略。這里我們的示例的consumer有三個:C0、C1和C2,topic有四個:t0、t1、t2和t3,每個topic都有兩個分區(qū),那么總的分區(qū)有:t0-0、t0-1、t1-0、t1-1、t2-0、t2-1、t3-0和t3-1。這里的訂閱情況為三個consumer訂閱所有的主題,那么如果按照Sticky的分區(qū)分配策略,初始狀態(tài)時,分配情況如下,讀者可以按照前一示例講解的方式進行推算:

Kafka的再平衡機制的三種分區(qū)重分配

這里我們假設(shè)在消費的過程中,C1發(fā)生了宕機,此時就會發(fā)生再平衡,而根據(jù)Sticky策略,其再分配步驟如下:

1) 首先會將宕機之后未分配的分區(qū)進行排序,排序方式為:首先按照分區(qū)所擁有的consumer數(shù)量從低到高進行排序,如果consumer數(shù)量相同,則按照分區(qū)的字典序進行排序。這里需要注意的是,由于只有C1宕機,因而未分配的分區(qū)為:t0-1、t2-0和t3-1,排序之后的結(jié)果為:

Kafka的再平衡機制的三種分區(qū)重分配

2) 然后將所有的consumer進行排序,排序方式為:首先將consumer按照其所擁有的consumer數(shù)量從小到大排序,如果數(shù)量相同,則按照consumer名稱的字典序進行排序,排序結(jié)果如下:

Kafka的再平衡機制的三種分區(qū)重分配

3) 接著依次遍歷各個分區(qū),將其分配給各個consumer,需要注意的是,在分配的過程中,consumer所分配的分區(qū)數(shù)量是在變化的,而這種變化是會反應(yīng)在consumer的排序上的:

3.1) 首先嘗試將t0-1分配給C2,由于C2訂閱了t0,因而可以分配成功,此時consumer排序和分區(qū)分配情況如下,需要注意的是,雖然分配之后,C2和C0的分區(qū)數(shù)量相同,但是由于按照字典序,C0在C2前面,因而排序情況還是會發(fā)生變化:

Kafka的再平衡機制的三種分區(qū)重分配

3.2) 然后嘗試將t2-0分配給C0,由于C0訂閱了t2,因而分配可以成功,此時consumer排序和分區(qū)分配情況如下:

Kafka的再平衡機制的三種分區(qū)重分配

3.3) 最后嘗試分配t3-1給C2,由于C2訂閱了t3,因而分配可以成功,此時consumer排序與分區(qū)分配情況如下:

Kafka的再平衡機制的三種分區(qū)重分配

在上面的分區(qū)分配過程中,我們可以看到,由于分區(qū)的不斷分配,各個consumer所擁有的分區(qū)數(shù)量也在不斷變化,因而其排序情況也在變化,但是最終可以看到,各個分區(qū)是均勻的分配到各個consumer的,并且還保證了當前consumer已經(jīng)消費的分區(qū)是不會分配到其他的consumer上的。

小結(jié)

本文首先對kafka的分區(qū)重分配策略進行了講解,然后通過四個示例對各個策略重分配的過程進行了講解。需要說明的是,本文所使用的示例正好是Kafka源碼中所提供了三個分配策略類所演示的幾個示例,只不過其并沒有演示其分配的具體細節(jié),而是只講解了最終的結(jié)果。同樣的,在網(wǎng)上搜索相關(guān)的博文,其也只是將分配的結(jié)果直接展示出來,而并沒有演示具體的細節(jié)。本文則主要對這些示例的具體實現(xiàn)細節(jié)進行了一一講解,以方便讀者朋友能夠更好的理解各個分區(qū)重分配策略。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    567

    瀏覽量

    20439
  • kafka
    +關(guān)注

    關(guān)注

    0

    文章

    50

    瀏覽量

    5200
收藏 人收藏

    評論

    相關(guān)推薦

    Windows管理內(nèi)存的三種主要方式

    Windows操作系統(tǒng)提供了多種方式來管理內(nèi)存,以確保系統(tǒng)資源的有效利用和性能的優(yōu)化。以下是關(guān)于Windows管理內(nèi)存的三種主要方式的詳細闡述,包括堆內(nèi)存管理、虛擬內(nèi)存管理以及共享內(nèi)存管理,每種方式都將從概念、原理、運作機制和應(yīng)用等方面進行介紹。
    的頭像 發(fā)表于 10-12 17:09 ?146次閱讀

    mosfet的三種工作狀態(tài)及工作條件是什么

    的工作狀態(tài)及工作條件對于理解和設(shè)計相關(guān)電路至關(guān)重要。以下是MOSFET的三種主要工作狀態(tài)及其工作條件的介紹。 一、MOSFET的三種工作狀態(tài) MOSFET根據(jù)其柵源電壓(VGS)和漏源電壓(VDS
    的頭像 發(fā)表于 10-06 16:51 ?342次閱讀

    單片機的三種總線結(jié)構(gòu)

    單片機的三種總線結(jié)構(gòu)包括地址總線(Address Bus, AB)、數(shù)據(jù)總線(Data Bus, DB)和控制總線(Control Bus, CB)。這三種總線在單片機內(nèi)部及與外部設(shè)備之間的數(shù)據(jù)傳輸
    的頭像 發(fā)表于 09-10 11:32 ?934次閱讀

    在電路中電阻的連接形式有哪三種

    在電路中,電阻的連接形式主要有三種:串聯(lián)、并聯(lián)和混聯(lián)。這三種連接方式在電路設(shè)計和應(yīng)用中具有重要的作用。本文將介紹這三種連接方式的特點、計算方法和應(yīng)用場景。 1. 串聯(lián)(Series) 串聯(lián)是指將
    的頭像 發(fā)表于 08-20 10:43 ?863次閱讀

    Linux內(nèi)核中的頁面分配機制

    Linux內(nèi)核中是如何分配出頁面的,如果我們站在CPU的角度去看這個問題,CPU能分配出來的頁面是以物理頁面為單位的。也就是我們計算機中常講的分頁機制。本文就看下Linux內(nèi)核是如何管理,釋放和
    的頭像 發(fā)表于 08-07 15:51 ?187次閱讀
    Linux內(nèi)核中的頁面<b class='flag-5'>分配機制</b>

    放大電路的三種組態(tài)可以放大什么

    放大電路是電子學(xué)中非常重要的組成部分,它們可以將輸入信號的幅度放大,以滿足各種應(yīng)用的需求。放大電路的三種基本組態(tài)包括共射放大電路、共集放大電路和共基放大電路。每種組態(tài)都有其特定的應(yīng)用和特點。以下
    的頭像 發(fā)表于 07-09 14:31 ?613次閱讀

    運放的三種應(yīng)用

    運放在電路中主要存在三種應(yīng)用,放大器,濾波器,振蕩器。再這三種應(yīng)用電路中,運放的兩大特點虛短虛斷仍然成立嗎? 在阻尼振蕩器中,工作過程是否按照我描述的這樣,在反相輸入端加一個近似鋸齒波的電流源,正半
    發(fā)表于 01-26 16:18

    運動控制的三種控制方式

    非標項目中有非常多的運動控制,根據(jù)系統(tǒng)配置、電機類型以及精度需求的不同主要有三種控制方式:開環(huán)控制、半閉環(huán)控制、全閉環(huán)控制。
    的頭像 發(fā)表于 01-23 09:48 ?1139次閱讀
    運動控制的<b class='flag-5'>三種</b>控制方式

    針對電平變頻器中點電位平衡模式有哪些優(yōu)缺點?

    電平結(jié)構(gòu)的變頻器有一個問題就是中點電位不平衡,在軟件控制層面有三種平衡模式,默認模式、比例模式和PI模式,或許叫法有所不同,總之是這三種
    發(fā)表于 01-09 16:12

    kafka基本原理詳解

    今天浩道跟大家分享一篇關(guān)于kafka相關(guān)原理的硬核干貨,可以說即使你沒有接觸過kafka,也可以秒懂,一起看看!
    的頭像 發(fā)表于 01-03 09:57 ?829次閱讀
    <b class='flag-5'>kafka</b>基本原理詳解

    用全志R128復(fù)刻自平衡賽車機器人,還實現(xiàn)了三種不同的操控方式

    更上一層樓。 硬件設(shè)計 本項目中的自平衡賽車機器人的硬件設(shè)計結(jié)構(gòu)非常簡單,硬件部分主要由R128開發(fā)板和幾個驅(qū)動模塊組成。 供電模塊 自平衡機器人采用鋰電池供電的方式,并利用mini360航模電池降壓
    發(fā)表于 12-20 10:22

    常見的socket三種類型

    常見的socket三種類型? Socket是計算機網(wǎng)絡(luò)中常用的通信機制,在網(wǎng)絡(luò)編程中起到了非常重要的作用。Socket可以分為三種類型:流套接字(Stream Socket)、數(shù)據(jù)報套接字
    的頭像 發(fā)表于 12-08 11:18 ?2244次閱讀

    電路短路的三種情況

    電路短路的三種情況? 電路短路是指電路中某個部分的導(dǎo)線或元器件出現(xiàn)故障,導(dǎo)致電流繞過原本的路徑,直接通過短路部分。短路會導(dǎo)致電路不正常工作,并可能引起火災(zāi)、電擊等危險。本文將詳細介紹電路短路的三種
    的頭像 發(fā)表于 11-23 10:33 ?4965次閱讀

    修復(fù)鋰電池的三種方法

    電子發(fā)燒友網(wǎng)站提供《修復(fù)鋰電池的三種方法.doc》資料免費下載
    發(fā)表于 11-15 10:40 ?5次下載
    修復(fù)鋰電池的<b class='flag-5'>三種</b>方法

    什么是電池化成?電池化成的三種方式 三種電池化成對比

    什么是電池化成?電池化成的三種方式 三種電池化成對比? 電池化成是指將物體或設(shè)備改造為可以使用電池供電的過程。在電池化成過程中,常見的電源例如燃油、電線甚至是替換掉,以便更高效、便捷地提供
    的頭像 發(fā)表于 11-10 14:49 ?2128次閱讀