什么是Kafka再平衡機(jī)制

本篇內(nèi)容介紹了“什么是Kafka再平衡機(jī)制”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

我們提供的服務(wù)有:網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、內(nèi)蒙古ssl等。為成百上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的內(nèi)蒙古網(wǎng)站制作公司

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

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

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

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

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

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

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

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

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

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

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

1. Round Robin

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

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

    什么是Kafka再平衡機(jī)制

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

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

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

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

    • 嘗試將t2-0分配給C0,由于C0沒有訂閱t2,因而會(huì)輪詢下一個(gè)consumer;

    • 嘗試將t2-0分配給C1,由于C1沒有訂閱t2,因而會(huì)輪詢下一個(gè)consumer;

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

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

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

    什么是Kafka再平衡機(jī)制

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

2. Range

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

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

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

  • 同理,按照上面的步驟依次進(jìn)行后面的topic的分配。

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

    什么是Kafka再平衡機(jī)制

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

3. Sticky

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

3.1 初始分配

        初始狀態(tài)分配的特點(diǎn)是,所有的分區(qū)都還未分配到任意一個(gè)consumer上。這里我們假設(shè)有三個(gè)consumer:C0、C1和C2,三個(gè)topic:t0、t1和t2,這三個(gè)topic分別有1、2和3個(gè)分區(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ī)則如下:

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

    什么是Kafka再平衡機(jī)制

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

    什么是Kafka再平衡機(jī)制

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

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

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

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

      什么是Kafka再平衡機(jī)制

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

      什么是Kafka再平衡機(jī)制

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

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

      什么是Kafka再平衡機(jī)制

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

      什么是Kafka再平衡機(jī)制

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

      什么是Kafka再平衡機(jī)制

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

3.2 模擬consumer宕機(jī)

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

什么是Kafka再平衡機(jī)制

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

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

    什么是Kafka再平衡機(jī)制

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

    什么是Kafka再平衡機(jī)制

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

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

      什么是Kafka再平衡機(jī)制

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

      什么是Kafka再平衡機(jī)制

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

      什么是Kafka再平衡機(jī)制

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

“什么是Kafka再平衡機(jī)制”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

名稱欄目:什么是Kafka再平衡機(jī)制
文章地址:http://bm7419.com/article28/jdiecp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、全網(wǎng)營銷推廣、網(wǎng)站制作、搜索引擎優(yōu)化動(dòng)態(tài)網(wǎng)站、網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作