国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

萬字長文解析Kafka分區(qū)工作機制

開發(fā) 架構
分區(qū)的狀態(tài)主要包括NonExistentPartition、NewPartition、OnlinePartition、OfflinePartition四個狀態(tài),只有分區(qū)狀態(tài)為OnlinePartition才能對外提供讀與寫。

Kafka的消息發(fā)送與消息消費與分區(qū)關聯(lián)密切,我們從這篇文章開始講點學習分區(qū)相關的知識,本篇文章將重點介紹分區(qū)內部的工作機制,即分區(qū)狀態(tài)機運轉機制。

1、Kafka分區(qū)狀態(tài)

Kafka內部分區(qū)的運轉機制具體實現(xiàn)為PartitionStateMachine,從這個類的注釋上來看可以得知Kafka分區(qū)的狀態(tài)共有四個,它們分別是:

  • NonExistentPartition 表示分區(qū)不存在,通常是該分區(qū)從未創(chuàng)建過或者創(chuàng)建后被刪除。
  • NewPartition 分區(qū)已創(chuàng)建,即分配完成了副本,但還未進行分區(qū)Leader選舉,即還不存在Leader分區(qū)與ISR集合,前一個有效狀態(tài)為NonExistentPartition。
  • OnlinePartition 分區(qū)處于在線時的狀態(tài),表示已經(jīng)完成了分區(qū)選舉,成功選舉出Leader,此時可以進行消息發(fā)送與消息消費,前一個有效狀態(tài)為NewPartition/OfflinePartition。
  • OfflinePartition分區(qū)處于離線時狀態(tài),表示選舉出來的Leader失效了,例如Leader所在的Broker宕機,前一個有效狀態(tài)為NewPartition/OnlinePartition。

關于分區(qū)的狀態(tài)變如下所示:

圖片

2、Kafka分區(qū)狀態(tài)機

接下來本文的行為思路,將會通過源碼閱讀的方式,深入PartitionStateMachine的實現(xiàn)細節(jié),從而提煉出分區(qū)變更實現(xiàn)要點,幫助我們更好的運維kafka。

2.1 狀態(tài)機啟動流程

狀態(tài)機的啟動流程定義在PartitionStateMachine的startup方法,該方法的調用時機:一個新的Broker通過控制器選舉成為新的Controller時會被調用。

該方法的聲明如下:

圖片

狀態(tài)機的啟動主要包括兩個步驟:

  • 初始化分區(qū)的狀態(tài)
  • 觸發(fā)分區(qū)狀態(tài)向OnlinePartition轉換

接下來將詳細探討實現(xiàn)細節(jié)。

2.1.1 分區(qū)狀態(tài)初始化

首先我們來看一下分區(qū)的初始化流程,具體代碼如下所示:

圖片

該方法的實現(xiàn)要點:

  • 在KafkaController中使用來ControllerContext用來在內存中存儲與控制器相關的數(shù)據(jù)結構,其中Map[String, mutable.Map[Int, Seq[Int]]]  partitionReplicaAssignmentUnderlying存儲了當前集群中所有的分區(qū)信息(主題名稱、分區(qū)編號,副本數(shù)情況),既然是控制器重新選舉,故需要重新初始化所有的分區(qū)。
  • 然后根據(jù) Map[TopicPartition, LeaderIsrAndControllerEpoch] partitionLeadershipInfo中存儲各個分區(qū)當前的運行時狀態(tài),這里分成三種情況:

如果partitionLeadershipInfo中并不存在主題分區(qū)的Leaer和ISR信息,驅動狀態(tài)從NonExistentPartition轉換為NewPartition。

如果partitionLeadershipInfo中存在主題分區(qū)的leader信息,但對應的Broker已經(jīng)為下線狀態(tài),則驅動狀態(tài)從NonExistentPartition轉換為OfflinePartition。

如果partitionLeadershipInfo中存在主題分區(qū)的leader信息,但對應的Broker已經(jīng)為下線狀態(tài),則將狀態(tài)從NonExistentPartition先轉換為OfflinePartition。

值得注意的是,調用changeStateTo方法改變分區(qū)的狀態(tài),僅僅只是在內存中更新狀態(tài),其具體實現(xiàn)如圖所示:

圖片

具體的做好是將需要更新的狀態(tài)存儲到Map[TopicPartition, PartitionState] 中。

2.1.2 分區(qū)狀態(tài)運轉機制

在內存中根據(jù)當前維護的LeaderAndISR信息后將狀態(tài)存儲到本地內存后,接下來就是將分區(qū)狀態(tài)向Online狀態(tài)轉換,具體的代碼實現(xiàn)見PartitionStateMachine的triggerOnlinePartitionStateChange方法,代碼如下所示:

圖片

該方法的實現(xiàn)要點是在內存緩存中(Map[TopicPartition, PartitionState] )挑選出狀態(tài)處于OfflinePartition與NewPartition并且未被刪除的分區(qū),驅動狀態(tài)機,調用handleStateChanges方法嘗試向OnlinePartition分區(qū)轉化。

圖片

該方法主要做如下兩件事情:

  • 調用PartitionStateMachine的doHandleStateChanges的方法,驅動分區(qū)狀態(tài)機的轉換。
  • 然后調用ControllerBrokerRequestBatch的sendRequestsToBrokers方法,實現(xiàn)元信息在其他Broker上的同步

要想清晰而全面的了解分區(qū)狀態(tài)的變更,我還給出了Kafka中所有調用handleStateChanges的調用入口,在后續(xù)深入研究Kafka相關機制時會再次一一提及,調用鏈如下圖所示:

圖片

由于篇幅的問題,分區(qū)信息在其他Broker中的狀態(tài)同步將在下一篇文章中介紹。

PartitionStateMachine的doHandleStateChanges方法在上一篇中已經(jīng)詳細介紹,尷尬,在Kafka生產(chǎn)實踐中又出問題了 中詳細介紹過,在這里我稍微總結提煉一下:

目標狀態(tài)為NewPartition、OfflinePartition、NonExistentPartition 這三個狀態(tài)并沒有什么復雜的實現(xiàn)邏輯,只是更新內存中的狀態(tài),并在state-change.log文件中將輸出狀態(tài)變更日志,只有目標狀態(tài)為OnlinePartition時才會詳細的處理邏輯。

但或許你有一個疑問,狀態(tài)變更為NewPartition,什么時候會向OnlinePartition狀態(tài)轉換呢?其實通過調用doHandleStateChanges將目標方法設置為NewPartition后,會緊接著調用triggerOnlinePartitionStateChange等方法,將狀態(tài)進一步向OnlinePartition狀態(tài)轉化。

由于在尷尬,在Kafka生產(chǎn)實踐中又出問題了 這篇文章中詳細介紹了OfflinePartition向OnlinePartition的轉化流程,故本篇文章就將重點放在了NewPartition狀態(tài)向OnlinePartition的轉化處理邏輯,其實也就是分區(qū)創(chuàng)建的流程,這塊的代碼入口如下所示:

圖片

由于PartitionStateMachine的initializeLeaderAndIsrForPartitions方法比較長,接下來將分步講解。

2.1.3 分區(qū)初始化流程

接下來我們詳細探討PartitionStateMachine的initializeLeaderAndIsrForPartitions方法。

Step1:首先獲取所有分區(qū)對應的在線副本,Seq< Map< TopicPartition, Seq< Int>> > liveReplicasPerPartition 來表示,類比Java的數(shù)據(jù)結構為List< Map< TopicPartition, List< Interger> >,代碼如下所示:

圖片

在Kafka中創(chuàng)建一個主題時,kafka首先會根據(jù)集群節(jié)點的負載情況,根據(jù)主題的分區(qū)數(shù)、副本數(shù),物理機架等信息,生成靜態(tài)負載情況,存儲在/brokers/topics/{topicName},其數(shù)據(jù)如下圖所示:

圖片

而liveReplicasPerPartition是在這個數(shù)據(jù)結構的基礎上篩選出在線的broker,例如如果id為4的broker已下線,那么liveReplicasPerPartition中的值就可能如下所示:

["0":[0,1,2],"1":[1,2],"2":[2,0],"3":[0,1],"4":[0,2],"5":[1,0],"6":[0,2,1],"7":[1,0,2]]

Step2:如果一個分區(qū)所有預分配的分片都不在線,則打印錯誤日志,代碼如下所示:

圖片

Step3:為分區(qū)創(chuàng)建leaderIsrAndControllerEpoch信息,代碼如下所示:

圖片

這里的實現(xiàn)比較簡單,值得注意的是初始化時分區(qū)的Leader則為ISR列表中的第一個分區(qū)。

Step4:將分區(qū)的狀態(tài)信息 leaderIsrAndControllerEpoch(leader,isr,LeaderEpoch、ControllerEpoch)寫入到zookeeper中,具體代碼如下;

圖片

具體就是在zookeeper中創(chuàng)建/broker/topics/{topicName}/partitions/{分區(qū)序號}/state,并將leaderIsrAndControllerEpoch寫入到上述節(jié)點,具體效果如下圖所示:

圖片

Step5:對zookeeper寫入結果進行處理,對應的代碼如下所示:

圖片

如果在zookeeper中創(chuàng)建成功,將leaderIsrAndControllerEpoch信息緩存到內存中(Map< TopicPartition, leaderIsrAndControllerEpoch>)中,并將信息放入到controllerBrokerRequestBatch,Kafka Broker控制將信息同步到集群的其他Broker上,同時會在state-change.log日志文件中記錄狀態(tài)成功變更日志;如果創(chuàng)建失敗,則在state-change.log中輸出對應的錯誤日志。

當然:為了盡量保證上述過程成功創(chuàng)建,Zookeeper的寫入過程引入來重試機制來保證最終執(zhí)行成功,除非一些類似AUTH_FAILED等不可恢復的異常。

分區(qū)的信息寫入到zookeeper的/broker/topics/{topicName}/partitions/{分區(qū)序號}/state文件路徑后,會再次調用changeTo方法,在內存中將分區(qū)的狀態(tài)變更為OnlineParttion。

那在什么時候觸發(fā)真正創(chuàng)建分區(qū)相關的文件夾呢?

原來在將分區(qū)信息寫入到zookeeper指定文件后,由于Kafka Controller訂閱了/broker/topics/{topicName}相關節(jié)點,故節(jié)點的創(chuàng)建會實時告知Kafka Controller,從而執(zhí)行分區(qū)的選擇,具體的代碼如下所示:

圖片

通過Zookeeper的事件監(jiān)聽機制,kafka就這樣巧妙的實現(xiàn)了分區(qū)狀態(tài)機的切換。

3、總結

通過上面的學習,我們對分區(qū)的理解應該更加深刻了,從這里我們至少能得出如下結論:

分區(qū)的狀態(tài)主要包括NonExistentPartition、NewPartition、OnlinePartition、OfflinePartition四個狀態(tài),只有分區(qū)狀態(tài)為OnlinePartition才能對外提供讀與寫。

Kafka啟動時,在選舉好集群的控制器(Kafka Controller)后會啟動分區(qū)狀態(tài)機(PartitionStateMachine),Kafka會根據(jù)/brokers/topics/{topicName}/partitions/{partition_no}/state中的信息,驅動分區(qū)狀態(tài)向OnlineParttion轉換。

當新創(chuàng)建主題時,Kafka會根據(jù)當前集群的負載情況,主題需要創(chuàng)建的分區(qū)數(shù)量、副本數(shù)量,機架信息等,進行負載均衡,生成分區(qū)的意向leader,已經(jīng)分區(qū)副本的分布情況,寫入到/brokers/topics/{topicName}節(jié)點上,此時會觸發(fā)PartitionModifications,從而觸發(fā)分區(qū)創(chuàng)建流程,即從NewPartition向OnlineParttion轉換。

責任編輯:武曉燕 來源: 中間件興趣圈
相關推薦

2020-07-09 07:54:35

ThreadPoolE線程池

2021-10-18 11:58:56

負載均衡虛擬機

2022-09-06 08:02:40

死鎖順序鎖輪詢鎖

2021-01-19 05:49:44

DNS協(xié)議

2022-09-14 09:01:55

shell可視化

2020-07-15 08:57:40

HTTPSTCP協(xié)議

2020-11-16 10:47:14

FreeRTOS應用嵌入式

2022-07-19 16:03:14

KubernetesLinux

2024-03-07 18:11:39

Golang采集鏈接

2024-05-10 12:59:58

PyTorch人工智能

2023-06-12 08:49:12

RocketMQ消費邏輯

2024-01-11 09:53:31

面試C++

2022-09-08 10:14:29

人臉識別算法

2024-01-05 08:30:26

自動駕駛算法

2022-07-15 16:31:49

Postman測試

2021-08-26 05:02:50

分布式設計

2021-06-04 07:27:24

sourcemap前端技術

2022-02-15 18:45:35

Linux進程調度器

2022-04-25 10:56:33

前端優(yōu)化性能

2023-10-19 13:47:58

點贊
收藏

51CTO技術棧公眾號

亚洲视频第一页| 国产成人精品一区二区三区福利| 少妇性bbb搡bbb爽爽爽欧美| 精品一区二区av| 国产精品毛片a∨一区二区三区|国| 日韩黄色碟片| 亚洲精品午夜精品| 色av手机在线| 欧美日韩在线综合| 深夜福利免费在线观看| 亚洲国产日韩一级| 加勒比日本影视| 国产精品日韩成人| 男女视频在线看| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 老太脱裤让老头玩ⅹxxxx| 首页亚洲欧美制服丝腿| 久久久久久99| 日韩精品成人一区二区在线| 精品久久久久久乱码天堂| 午夜天堂精品久久久久| 成人激情av| 国产亚洲一级| 亚洲最新免费视频| 国产91精品露脸国语对白| 国产xxxx振车| 欧美极品少妇xxxxⅹ高跟鞋 | 91精品国产乱码久久久久久| 91精品久久久久久综合乱菊 | 美女一区二区视频| 中文字幕中文字幕在线中一区高清 | 精品精品国产毛片在线看| 久99久在线视频| 久久悠悠精品综合网| 日本视频久久久| 久久久久久久久久久久久久 | 日韩电影免费网址| 国产精品美女久久久久av福利| 国内精品久久久久久久影视蜜臀 | 欧美一级精品大片| 美女网站在线看| 一本一本久久a久久精品综合小说| 自拍偷自拍亚洲精品被多人伦好爽 | 国产免费又粗又猛又爽| 国产精品乱子久久久久| 久草在线在线视频| 色综合视频一区二区三区高清| 91在线视频| 中文字幕一区日韩电影| 亚洲综合影院| 成人av电影免费| 国产白丝精品91爽爽久久| 中文字幕av不卡在线| 色美美综合视频| 免费观看成人性生生活片 | 日本欧美不卡| 高清一区二区三区四区五区 | 久久久久久成人精品| 五月久久久综合一区二区小说| 欧美亚洲免费高清在线观看| 99久久精品免费精品国产| 日韩日韩日韩日韩| 欧美成人女星排名| 欧美有码在线| 相泽南亚洲一区二区在线播放| 久久精品在线免费观看| 成人免费高清在线播放| 久久九九全国免费精品观看| 99久久激情| 婷婷无套内射影院| 色婷婷亚洲婷婷| а天堂中文最新一区二区三区| 91系列在线观看| 床上的激情91.| 亚洲成人天堂| 精品久久国产精品| 伊人影院久久| 嫩草av久久伊人妇女超级a| 欧美老女人在线| 婷婷国产精品| 波多野结衣av一区二区全免费观看| 午夜电影网一区| 91精品视频一区二区| 国产日韩精品久久| 国产精品私房写真福利视频| 成人免费高清| 国产精品电影一区| 成人一级片网址| caoporn97在线视频| 91成人在线视频| 国产91精品露脸国语对白| 一区二区三区高清在线视频| 亚洲韩国欧洲国产日产av| 亚洲欧美经典视频| 免费黄色在线看| 日本黄色三级大片| 欧美日本不卡视频| 亚洲欧美成人vr| 欧美色图另类小说| 欧美一区二区三区喷汁尤物| 亚洲理论电影| 亚洲视频在线a| 在线看日韩av| 久久精品国产一区二区三| 高清国产福利在线观看| 国产福利精品在线| 中文字幕乱码久久午夜不卡| 一区二区精品伦理...| 国产综合 伊人色| 色婷婷精品大视频在线蜜桃视频 | 亚洲最大av| 亚欧黄色av| 欧美激情久久久久| 成人白浆超碰人人人人| 蜜桃视频www网站在线观看| 狠狠色噜噜狠狠狠狠色吗综合| 亚洲伊人伊色伊影伊综合网| 国产中文欧美日韩在线| 国产一级大片免费看| 日韩国产中文字幕| 日韩国产精品久久| av网站免费在线观看| 国产亚洲二区| 精品免费在线视频| 久久国产视频网| 国产呻吟对白刺激无套视频在线| 日韩欧美国产午夜精品| 日韩国产综合| 欧美日韩第二页| 亚洲欧洲免费视频| 久久99精品国产.久久久久| 久久777国产线看观看精品| 成人av免费电影网站| 欧美lavv| 51精品国自产在线| 亚洲在线国产日韩欧美| 国产在线观看免费| 国产精品一区二区免费| 欧洲精品一区二区| 亚洲一级影院| av在线播放观看| 亚洲一区二区精品在线观看| 精品国产免费视频| 国产成人在线视频网址| а天堂中文最新一区二区三区| 成人在线激情网| 国产xxx69麻豆国语对白| 亚洲综合自拍偷拍| 亚洲精品二区三区| 影音先锋在线播放| 成人免费a级片| 欧美疯狂性受xxxxx另类| 国产女主播视频一区二区| 网红女主播少妇精品视频| 日本二区视频| 超碰在线观看97| 日韩视频一区二区三区在线播放| 日韩专区中文字幕一区二区| 男人天堂视频在线观看| 国产91在线视频观看| 欧美在线视频免费播放| 午夜成人免费视频| 日本人妖一区二区| 中文字幕综合| 亚洲1024| 亚洲欧洲另类精品久久综合| 久久激情五月丁香伊人| 亚洲午夜久久久久久久久久久| 亚洲激情午夜| 24小时成人在线视频| 亚洲精品一区视频| 亚洲天堂第一区| 91精品国产色综合| 欧美三级电影一区| 久久99精品久久久久久久久久久久 | 亚洲乱码国产乱码精品精| 久久亚洲精品国产精品紫薇| 国产不卡一二三区| 26uuu亚洲电影在线观看| 精品人妻一区二区三区四区在线| 成人自拍视频网站| 成人性生交大合| 欧洲激情视频| 日韩三区视频| 三区四区不卡| 久久综合电影| 寂寞少妇一区二区三区| 成人激情免费电影网址| 亚洲乱码精品一二三四区日韩在线| 国产精品视频一二| 久久精品欧美一区二区三区麻豆| 欧美久久一二区| 国模私拍一区二区三区| 欧美在线视频免费播放| 免费电影一区| 色黄网站在线观看| 91精品久久久久久久久久不卡| 成人写真视频| 色婷婷久久久久swag精品| 国产精品第一视频|