前面我們已經(jīng)分享過(guò)幾篇Kafka的文章檩咱,最近簡(jiǎn)單梳理了下Kafka內(nèi)核相關(guān)的知識(shí)揭措,涵蓋了Kafka架構(gòu)總結(jié),副本機(jī)制刻蚯,控制器绊含,高水位機(jī)制,日志或消息存儲(chǔ)炊汹,消息發(fā)送與消費(fèi)機(jī)制等方面知識(shí)躬充。文末含對(duì)應(yīng)的Kafka內(nèi)核思維導(dǎo)圖,供參考讨便。
1充甚、 架構(gòu)總結(jié)
1)Kafka實(shí)際上也是一個(gè)主從架構(gòu),有一個(gè)Controller角色即控制器霸褒,協(xié)調(diào)管理整個(gè)集群伴找;
2)有幾個(gè)Kafka術(shù)語(yǔ)肯定是不陌生的:broker,topic废菱,partition疆瑰,segment,生產(chǎn)者producer昙啄,消費(fèi)者consumer穆役;
2、消息發(fā)送機(jī)制
1)序列化器:序列化消息對(duì)象轉(zhuǎn)成字節(jié)數(shù)組梳凛,然后通過(guò)網(wǎng)絡(luò)傳輸耿币。
2)分區(qū)器:計(jì)算消息發(fā)往的具體分區(qū);如果顯示指定了partition韧拒,便不會(huì)走分區(qū)器淹接。
3)消息緩沖池:客戶端的消息緩沖池十性,默認(rèn)大小32M,見(jiàn)參數(shù)buffer.memory塑悼。
4)批量發(fā)送:緩沖池中消息會(huì)按batch分批次發(fā)送劲适,默認(rèn)批次大小16KB,見(jiàn)參數(shù)batch.size厢蒜。
3霞势、副本機(jī)制
1)分區(qū)副本默認(rèn)1,見(jiàn)參數(shù)default.replication.factor斑鸦。
2)副本作用(并不提供讀寫(xiě)分離)
- 實(shí)現(xiàn)冗余愕贡,提高消息可靠性;
- 實(shí)現(xiàn)高可用巷屿,參與leader選舉固以,在leader不可用時(shí)提高可用性。
3)leader副本選舉
- 由控制器負(fù)責(zé)嘱巾;
- 選舉機(jī)制或策略:首先要弄明白AR,ISR的概念憨琳,基本策略是從AR中找第一個(gè)存活的副本,且該副本在ISR中旬昭。
4)Unclean leader選舉
參數(shù)unclean.leader.election.enable篙螟,用于控制是否允許非同步副本參與leader 選舉,默認(rèn)false稳懒。如果開(kāi)啟,則當(dāng)ISR為空時(shí)就會(huì)從這些副本中選舉新的leader慢味,這個(gè)過(guò)程就稱為Unclean leader選舉场梆。
4、控制器概述
1)作用:協(xié)調(diào)與管理整個(gè)集群纯路,5個(gè)主要職責(zé):
- 主題增刪改
- 分區(qū)重分配
- leader選舉
- 元數(shù)據(jù)管理
- broker成員管理或油,宕機(jī)或加入
2)控制器選舉:基于zookeeper實(shí)現(xiàn),利用了zookeeper的znode模型與監(jiān)聽(tīng)機(jī)制驰唬。
3)控制器故障轉(zhuǎn)移
- 存在單點(diǎn)故障顶岸,但是每個(gè)broker節(jié)點(diǎn)都可以成為controller;
- 故障轉(zhuǎn)移即failover也是基于zookeeper實(shí)現(xiàn)的叫编,znode模型與監(jiān)聽(tīng)機(jī)制辖佣,/controller節(jié)點(diǎn)。
5搓逾、HW機(jī)制
1)概念
HW即高水位卷谈,是Kafka副本對(duì)象的重要屬性,分區(qū)的高水位由leader副本的高水位表示霞篡,含義是被follower副本同步之后的位置世蔗。
2)作用
- 定義消息可見(jiàn)性端逼,只有分區(qū)高水位以下的消息才能被消費(fèi);
- 幫助kafka完成副本同步污淋,kafka是基于高水位實(shí)現(xiàn)的異步的副本同步機(jī)制顶滩。
3)LEO的概念
含義是日志末端位移(Log End Offset),下一條消息寫(xiě)入的位移寸爆。
6礁鲁、消息消費(fèi)機(jī)制
1)拉取機(jī)制
Kafka生產(chǎn)端是推的機(jī)制即Push,消費(fèi)端是拉的機(jī)制即Pull而昨。
2)Pull的優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn)是消費(fèi)端可以自己控制消息的讀取速度和數(shù)量救氯;
- 缺點(diǎn)是不知道服務(wù)端有沒(méi)有數(shù)據(jù),所以要一直pull或隔一定時(shí)間pull歌憨,可能要pull多次并等待着憨。
3)消息投遞語(yǔ)義:
Kafka默認(rèn)保證at-least-once delivery,容許用戶實(shí)現(xiàn)at-most-once語(yǔ)義务嫡,exactly-once的實(shí)現(xiàn)取決于目的存儲(chǔ)系統(tǒng)甲抖。
4)分區(qū)分配策略
- RangeAssignor:按照分區(qū)范圍分配,當(dāng)前默認(rèn)策略心铃;
- RoundRobinAssignor:輪詢的方式分配准谚;
- StickyAssignor:Kafka 0.11版本引入,根據(jù)更多指標(biāo)比如負(fù)載去扣,盡可能均勻柱衔。
7、日志存儲(chǔ)機(jī)制
1)原理
- 分段存儲(chǔ)愉棱,這里的段segment指的是日志段文件唆铐,Kafka中的日志含義即是消息或數(shù)據(jù),日志回滾受log.segment.bytes控制奔滑,默認(rèn)1G艾岂;
- 索引文件,一個(gè)稀疏格式的索引朋其,受參數(shù)log.index.interval.bytes控制王浴,默認(rèn)4KB。即不是每條數(shù)據(jù)都會(huì)寫(xiě)索引梅猿,默認(rèn)每寫(xiě)4KB數(shù)據(jù)才會(huì)寫(xiě)一條索引氓辣。
$ ll
-rw-r--r-- 1 kafka kafka 1002496 Apr 25 17:08 00000000000051402174.index
-rw-r--r-- 1 kafka kafka 1073741338 Apr 25 17:08 00000000000051402174.log
-rw-r--r-- 1 kafka kafka 10485760 Apr 26 15:03 00000000000051638285.index
-rw-r--r-- 1 kafka kafka 219984088 Apr 26 15:04 00000000000051638285.log
2)日志留存策略Kafka 會(huì)定期檢查是否要?jiǎng)h除舊消息,見(jiàn)參數(shù) log.retention.check.interval.ms袱蚓,默認(rèn)5分鐘筛婉。當(dāng)前有三種日志留存策略:
- 基于空間:log.retention.bytes,默認(rèn)未開(kāi)啟;
- 基于時(shí)間:log.retention.hours(mintues/ms)爽撒,默認(rèn)7天入蛆;
- 基于起始位移:Kafka 0.11.0.0版本引入,解決流處理場(chǎng)景中已處理的中間消息刪除問(wèn)題硕勿。
目前基于時(shí)間的日志留存策略最常使用哨毁。
為了更好的精進(jìn)學(xué)習(xí)Kafka,筆者參考本文制作了的一張思維導(dǎo)圖源武,分享:
關(guān)注本公眾號(hào)扼褪,后臺(tái)回復(fù) kafka2020 即可下載Kafka內(nèi)核高清PDF文檔。
往期推薦
1粱栖、如何快速全面掌握Kafka话浇?5000字吐血整理
2、HBase原理 | HBase Compaction介紹與參數(shù)調(diào)優(yōu)
3闹究、MapReduce Shuffle 和 Spark Shuffle 結(jié)業(yè)篇
4幔崖、實(shí)時(shí)數(shù)倉(cāng) | 你想要的數(shù)倉(cāng)分層設(shè)計(jì)與技術(shù)選型