Kafka學(xué)習(xí)-理論篇(一)

圖示


生產(chǎn)消費(fèi)過(guò)程

Partition Leader 和 Partition Follower之間的關(guān)系


Partition Leader 和 Partition Follower之間的關(guān)系(1)

Partition中消息的追加方式


Partition中消息的追加方式(1)



0. 基礎(chǔ)知識(shí)


0.1 名詞解釋

Cluster(集群)?

Broker(代理) , 每一個(gè)Server叫一個(gè)Broker

Producer(生產(chǎn)者)?

Consumer(消費(fèi)者)?

Topic(邏輯分區(qū)), 每一類消息會(huì)落入不同的topic類中

Partition(物理分區(qū))?

Segment(段),最小分區(qū), 含有index和log文件

Zookeeper(分布式應(yīng)用程序協(xié)調(diào)服務(wù))

Lag(消費(fèi)滯后)?

Rebalance(平衡)?

Append(追加)?

Offset(偏移量)?

Coodinator 協(xié)調(diào)者

HW(high watermark),這是一個(gè)分區(qū)的最后一條消息的offset

ACK(Acknowledgement)接收站發(fā)給發(fā)送站的一種傳輸類控制字符。表示發(fā)來(lái)的數(shù)據(jù)已確認(rèn)接收無(wú)誤

SYN? 同步序列編號(hào)(Synchronize Sequence Numbers)犹菇。是TCP/IP建立連接時(shí)使用的握手信號(hào)

ISR同步副本 (in-sync replicas)揭芍。ISR的副本保持和leader的同步卸例,當(dāng)然leader本身也在ISR中



0.2 消息隊(duì)列

消息隊(duì)列中間件是分布式系統(tǒng)中重要的組件筷转,主要解決應(yīng)用耦合呜舒、異步消息、流量削鋒等問(wèn)題唤殴。實(shí)現(xiàn)高性能朵逝、高可用配名、可伸縮和最終一致性架構(gòu)。是大型分布式系統(tǒng)不可缺少的中間件宇整。?

目前在生產(chǎn)環(huán)境没陡,使用較多的消息隊(duì)列有ActiveMQ索赏、RabbitMQ潜腻、ZeroMQ融涣、Kafka精钮、MetaMQ轨香、RocketMQ等。?


0.3 Kafka存活的條件

1.必須維護(hù)與Zookeeper的session(這個(gè)通過(guò)Zookeeper的Heartbeat機(jī)制來(lái)實(shí)現(xiàn))

2.Follower必須能夠及時(shí)將Leader的消息復(fù)制過(guò)來(lái)科雳,不能“落后太多”

Leader會(huì)跟蹤與其保持同步的Replica列表糟秘,該列表稱為ISR(即in-sync Replica)

//replica.lag.max.messages配置尿赚,其默認(rèn)值是4000? 允許落后的最大值

//replica.lag.time.max.ms來(lái)配置凌净,其默認(rèn)值是10000? 允許的最大超時(shí)時(shí)間



1. Broker


1.1 Leader選舉

Zookeeper 主要用來(lái)跟蹤Kafka 集群中的節(jié)點(diǎn)狀態(tài), 以及Kafka Topic, message 等等其他信息. 同時(shí), Kafka 依賴于Zookeeper, 沒(méi)有Zookeeper 是不能運(yùn)行起來(lái)Kafka 的.?

Kafka 通過(guò) Zookeeper 管理集群配置泻蚊,選舉 leader性雄,以及在 consumer group 發(fā)生變化時(shí)進(jìn)行 rebalance

1.Controller 選舉:?

Controller 是一個(gè)特殊的Broker, 其負(fù)責(zé)所有Partition 的leader/follower 關(guān)系.?

記錄集群中都有哪些活躍著的Broker.?

Zookeeper 負(fù)責(zé)從Broker 中選舉出一個(gè)作為Controller, 并確保其唯一性. 同時(shí), 當(dāng)Controller 宕機(jī)時(shí), 選舉一個(gè)新的.?

當(dāng)broker啟動(dòng)的時(shí)候秒旋,都會(huì)創(chuàng)建KafkaController對(duì)象

這些每個(gè)節(jié)點(diǎn)上的KafkaController會(huì)在指定的zookeeper路徑下創(chuàng)建臨時(shí)節(jié)點(diǎn)迁筛,只有第一個(gè)成功創(chuàng)建的節(jié)點(diǎn)的KafkaController才可以成為leader细卧,其余的都是follower

Broker1=>被選舉為Controller Leader, 這個(gè)Broker1 負(fù)責(zé)管理整個(gè)集群中分區(qū)和副本的狀態(tài)

Broker2 => 其余每個(gè)單獨(dú)的server叫做Replica Manager

Broker3

2.Topic 配置:?

有哪些Topic, Topic 都有哪些Partition, Replica 存放在哪里, Leader 是誰(shuí).?



1.2 Topic

Partition

文件存儲(chǔ)

1.會(huì)根據(jù) partition 規(guī)則選擇被存儲(chǔ)到哪一個(gè) partition蜘犁。?

2.順序追加到log中?

3.每條消息在log文件中的位置成為offset(偏移量)这橙,offset為一個(gè)long型數(shù)字导披,唯一標(biāo)記一條消息,?


文件復(fù)制和同步

1.Producer只將該消息發(fā)送到該P(yáng)artition的Leader , Consumer讀消息也是從Leader讀取

2. partition有n個(gè)副本...?

N 個(gè) replicas 中撩匕,其中一個(gè) replica 為 leader止毕,其他都為 follower?

leader 處理 partition 的所有讀寫(xiě)請(qǐng)求滓技,與此同時(shí),follower 會(huì)被動(dòng)定期地去復(fù)制 leader 上的數(shù)據(jù)

副本個(gè)數(shù)N = leader + follower1 + follower2....?

leader掛了, 會(huì)從follower中 重新選舉一個(gè)leader?

3.Leader =>將消息 =>寫(xiě)入本地Log

4.Follower => pull 消息=> Leader ,? 寫(xiě)入其Log后膝昆,向Leader發(fā)送ACK

//為了提高性能,每個(gè)Follower在接收到數(shù)據(jù)后就立馬向Leader發(fā)送ACK纬朝,而非等到數(shù)據(jù)寫(xiě)入Log中

因此收叶,對(duì)于已經(jīng)commit的消息判没,Kafka只能保證它被存于多個(gè)Replica的內(nèi)存中,而不能保證它們被持久化到磁盤(pán)中

也就不能完全保證異常發(fā)生后該條消息一定能被Consumer消費(fèi)

5.一旦Leader收到了ISR中的所有Replica的ACK嫉沽,該消息就被認(rèn)為已經(jīng)commit了,Leader將增加HW并且向Producer發(fā)送ACK



2. Consumer


2.1 位移管理

1.kafka會(huì)定期把group消費(fèi)情況保存起來(lái)玻佩,做成一個(gè)offset map

2.將offset信息寫(xiě)入 __consumer_offsets topic, 這個(gè)topic 保存了每個(gè)consumer group某一時(shí)刻提交的offset信息



位移管理(1)



位移管理(2)

2.2 Rebalance的概念

1.rebalance本質(zhì)上是一種協(xié)議,規(guī)定了一個(gè)consumer group下的所有consumer如何達(dá)成一致來(lái)分配訂閱topic的每個(gè)分區(qū)酣胀。

比如某個(gè)group下有20個(gè)consumer,它訂閱了一個(gè)具有100個(gè)分區(qū)的topic娶聘。正常情況下闻镶,Kafka平均會(huì)為每個(gè)consumer分配5個(gè)分區(qū)。這個(gè)分配的過(guò)程就叫rebalance丸升。


2.3 Rebalance的時(shí)機(jī)

組成員發(fā)生變更(新consumer加入組铆农、已有consumer主動(dòng)離開(kāi)組或已有consumer崩潰了——這兩者的區(qū)別后面會(huì)談到)

訂閱主題數(shù)發(fā)生變更——這當(dāng)然是可能的,如果你使用了正則表達(dá)式的方式進(jìn)行訂閱狡耻,那么新建匹配正則表達(dá)式的topic就會(huì)觸發(fā)rebalance

訂閱主題的分區(qū)數(shù)發(fā)生變更


2.4 Rebalance的過(guò)程

1.JoinGroup

consumer1 => 發(fā)送訂閱信息,并請(qǐng)求入組 => coordinator => 選擇consumer1作為leader, 并發(fā)送給c1成員信息和訂閱信息, 讓其負(fù)責(zé) "消費(fèi)分配方案的制定"

consumer2 => 發(fā)送訂閱信息,并請(qǐng)求入組 => coordinator => 告訴c2,你們組leader是c1

2.SyncGroup

consumer1 => 發(fā)送分配消費(fèi)的方案 => coordinator => 下發(fā)方案給c1

consumer2 => 發(fā)送分配消費(fèi)的方案(非leader 內(nèi)容為空) => coordinator => 下發(fā)方案給c1


2.5 誰(shuí)來(lái)執(zhí)行rebalance和consumer group管理

1.Coordinator來(lái)執(zhí)行對(duì)于consumer group的管理墩剖。

2.先確定consumer group位移信息寫(xiě)入__consumers_offsets的哪個(gè)分區(qū), 則該分區(qū)leader 所在的broker 就是被選定的coordinator



3. Zookeeper


3.1 組件

KafkaController: 負(fù)責(zé)管理整個(gè)集群中分區(qū)和副本的狀態(tài)

ReplicaManager:負(fù)責(zé)管理當(dāng)前broker所有分區(qū)和副本的信息,會(huì)處理KafkaController發(fā)起的一些請(qǐng)求夷狰,副本狀態(tài)的切換岭皂,添加/讀取消息等

ZookeeperLeaderElector: 主要用于KafkController Leader選舉

ControllerContext: 維護(hù)了controller需要用到的上下文沼头,同時(shí)也緩存一些zookeeper數(shù)據(jù),包括可用的broker,全部的topic,分區(qū)和副本信息

ControllerChannelManager: 維護(hù)Controller Leader與集群中其他broker之間連接解幽,是管理這個(gè)集群的基礎(chǔ)

TopicDeletionManager: 用于刪除指定的topic

PartitionStateMachine: 用于管理集群所有partition狀態(tài)的狀態(tài)機(jī)

ReplicaStateMachine: 用于管理集群中所有副本狀態(tài)的狀態(tài)機(jī)

ControllerBrokerRequestBatch: 實(shí)現(xiàn)了向broker批量發(fā)送請(qǐng)求的功能

PartitionLeaderSelector:選舉leader副本的選舉策略

IzkChildListener:是zookeeper上的監(jiān)聽(tīng)器徘溢,實(shí)現(xiàn)了對(duì)zookeeper上某些節(jié)點(diǎn)數(shù)據(jù),子節(jié)點(diǎn)或者session狀態(tài)的監(jiān)聽(tīng)助被,被處罰后調(diào)用對(duì)應(yīng)的業(yè)務(wù)邏輯











































? ? ? ? ?


?? ?


?? ?


?? ?


??









? ? ? ? ? ? ? ? ? ? ? ? ? ?




? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

li.li1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}ul.ul1 {list-style-type: disc}

li.li1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}ul.ul1 {list-style-type: disc}

li.li1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}ul.ul1 {list-style-type: disc}

li.li1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}ul.ul1 {list-style-type: disc}

li.li1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}ul.ul1 {list-style-type: disc}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)挣郭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人眯搭,你說(shuō)我怎么就攤上這事。” “怎么了业稼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵稽鞭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我琴拧,道長(zhǎng)扔枫,這世上最難降的妖魔是什么短荐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任超升,我火速辦了婚禮,結(jié)果婚禮上宽菜,老公的妹妹穿的比我還像新娘。我一直安慰自己妹卿,他們只是感情好哟忍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布肤寝。 她就那樣靜靜地躺著鲤看,像睡著了一般。 火紅的嫁衣襯著肌膚如雪袖裕。 梳的紋絲不亂的頭發(fā)上谤民,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天吵聪,我揣著相機(jī)與錄音块攒,去河邊找鬼讲逛。 笑死蔚鸥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的许赃。 我是一名探鬼主播止喷,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼混聊!你這毒婦竟也來(lái)了启盛?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤技羔,失蹤者是張志新(化名)和其女友劉穎僵闯,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體藤滥,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鳖粟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拙绊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片向图。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖标沪,靈堂內(nèi)的尸體忽然破棺而出榄攀,到底是詐尸還是另有隱情,我是刑警寧澤金句,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布檩赢,位于F島的核電站,受9級(jí)特大地震影響违寞,放射性物質(zhì)發(fā)生泄漏贞瞒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一趁曼、第九天 我趴在偏房一處隱蔽的房頂上張望军浆。 院中可真熱鬧,春花似錦挡闰、人聲如沸乒融。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赞季。三九已至,卻和暖如春射众,著一層夾襖步出監(jiān)牢的瞬間碟摆,已是汗流浹背晃财。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工叨橱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留典蜕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓罗洗,卻偏偏與公主長(zhǎng)得像愉舔,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子伙菜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355