- Kafka概述
是一個(gè)分布式的基于發(fā)布訂閱模式的消息隊(duì)列
2.Kafka幾個(gè)角色
Broker: 每一個(gè)kafka進(jìn)程實(shí)例
Topic:用來對(duì)消息進(jìn)行分類
Partition: 分區(qū)择诈,用于對(duì)某個(gè)topic做發(fā)送的負(fù)載均衡
Leader:生產(chǎn)者和消費(fèi)者對(duì)某一個(gè)topic實(shí)際發(fā)送和消費(fèi)的來源
Follower:對(duì)某一個(gè)topic做冗余備份
Producer:消息生產(chǎn)者
Consumer:消息消費(fèi)者
Topic-》分區(qū)-》 分區(qū)副本
一個(gè)topic可以通過負(fù)載均衡到不同的partition-leader中豪诲。每個(gè)partition-leader又可以有自己的分區(qū)副本partition-follower
Consumergroup-》consumer-》分區(qū)
一個(gè)消費(fèi)者組里面可以有多個(gè)消費(fèi)者商佛,每個(gè)消費(fèi)者對(duì)同一個(gè)topic的不同partition-leader進(jìn)行消費(fèi)。但是不同消費(fèi)者組里面的不同消費(fèi)者可以對(duì)同一個(gè)topic的不同partition-leader進(jìn)行消費(fèi)
Consumergroup可以做消費(fèi)者消費(fèi)的負(fù)載均衡
Zk: 用來管理 kafka集群的元數(shù)據(jù)信息,以及保存消費(fèi)進(jìn)度(跟kafka版本有關(guān)系,0.9之前是存在在zk中。0.9之后存在 kafka本地(topic- counsumer-offsets)的系統(tǒng)topic中)
3.消息的有序性
由于分區(qū)的存在卷谈,每個(gè)topic下的所有分區(qū)都各自維護(hù)了自己的offset。Kafka無法保證topic的全局的有序性霞篡,只能保證區(qū)內(nèi)的有序性
4.Kafka的文件存儲(chǔ)
.Index 和 .log
.Index 存儲(chǔ)偏移量及在.log文件中的偏移量世蔗,消息長(zhǎng)度
.log 存儲(chǔ)topic某一個(gè)分區(qū)下的所有消息,a和消息的偏移量
kafka文件的命名方式朗兵,是以當(dāng)前第一條消息的起始偏移量進(jìn)行命名的凸郑。這樣做是方便消費(fèi)者拉取消息的時(shí)候快速定位到消息所在的index文件。
5.kafka消費(fèi)者是如何找到需要消費(fèi)的消息矛市?
消費(fèi)者通過偏移量和二分查找法找到消息所在的index文件芙沥,在index文件中找到對(duì)應(yīng)的在log文件中的偏移量。 當(dāng)找到偏移量后 去log文件獲取消息內(nèi)容
6.生產(chǎn)者的分區(qū)策略
類似于rocketmq的生產(chǎn)者發(fā)送負(fù)載均衡算法
7.Kafka的ack機(jī)制浊吏,通過生產(chǎn)者acks參數(shù)進(jìn)行配置
0:producer只管發(fā)送數(shù)據(jù)就返回ack而昨,broker掛了或者發(fā)送時(shí)由于網(wǎng)絡(luò)的原因會(huì)導(dǎo)致數(shù)據(jù)丟失
1: leader落盤后發(fā)送ack給發(fā)送者,發(fā)送ack前找田,leader掛了會(huì)導(dǎo)致數(shù)據(jù)丟失
-1: leader和ISR 中的follower都落盤后發(fā)送ack給發(fā)送者歌憨,如果在發(fā)送ack前,leader掛了墩衙,會(huì)導(dǎo)致數(shù)據(jù)重復(fù)
8.Kafka集群數(shù)據(jù)一致性务嫡,hw和leo
每個(gè)副本的 高水位和 最大偏移量
在同一個(gè)分區(qū)內(nèi),取分區(qū)內(nèi)所有副本中最大偏移量最小的那個(gè)偏移量作為高水位漆改,因此同一個(gè)分區(qū)內(nèi)的所有副本的高水位都是相同的心铃。 高水位之前的數(shù)據(jù)是消費(fèi)者可見的數(shù)據(jù)
9.exactly once語義
精準(zhǔn)一次性的將消息發(fā)送到kafka集群,保證不出現(xiàn)數(shù)據(jù)丟失和數(shù)據(jù)重復(fù)的情況
當(dāng)ack為0時(shí)挫剑,可以保證消息最多發(fā)送一次
當(dāng)ack為-1是去扣,可以保證消息至少發(fā)送一次,數(shù)據(jù)不會(huì)丟失
精準(zhǔn)一致性 = 至少一次 + 冪等性
Kafka通過分配給producer的pid 樊破,發(fā)送消息的partition愉棱,每條消息攜帶的seqnum,來對(duì)重復(fù)消息進(jìn)行去重哲戚。 kafka不能保證跨會(huì)話或者跨分區(qū)的冪等性
10.消費(fèi)者的分區(qū)策略
Round robin:按同一消費(fèi)者組中的所有消費(fèi)者訂閱的所有主題的分區(qū)進(jìn)行分配分區(qū)
問題:當(dāng)消費(fèi)者組中的消費(fèi)者消費(fèi)了不同的主題奔滑,會(huì)發(fā)生有一些分區(qū)沒辦法進(jìn)行正常的消費(fèi)數(shù)據(jù)
Range(kafka默認(rèn)): 按同一消費(fèi)者組中的消費(fèi)者訂閱的某一個(gè)主題的分區(qū)進(jìn)行分配分區(qū)
問題:會(huì)出現(xiàn)消費(fèi)不均衡
當(dāng)消費(fèi)者數(shù)目發(fā)生變化,會(huì)觸發(fā)分區(qū)重分配
11.消費(fèi)者的offset的存儲(chǔ)
Consumergroup + topic + partition來確定消費(fèi)者的消費(fèi)進(jìn)度顺少,即使這個(gè)分區(qū)被該消費(fèi)者組下的新的消費(fèi)者進(jìn)行消費(fèi)也可以拿到上一個(gè)消費(fèi)者消費(fèi)的offset
消費(fèi)者每隔1s提交offset到系統(tǒng)主題中__consumer_offset
12.kafka高效讀寫數(shù)據(jù)
順序?qū)懘疟P朋其,零拷貝技術(shù)王浴,分布式
13.Kafka的事務(wù)
生產(chǎn)者事務(wù):
Pid只能保證單分區(qū)和單會(huì)話的精準(zhǔn)一次性。要實(shí)現(xiàn)跨會(huì)話和分區(qū)的精準(zhǔn)一次性就需要用到生產(chǎn)者事務(wù)令宿。那么什么是生產(chǎn)者事務(wù)呢?
生產(chǎn)者客戶端將消息攜帶上Transaction id 和 pid綁定腕窥,交由 kafka的transaction coordinator進(jìn)行維護(hù)
消費(fèi)者事務(wù):
Kafka的消費(fèi)者事務(wù)較弱粒没。因?yàn)橄M(fèi)者是通過offset進(jìn)行消費(fèi)的
14.Kafka的再均衡
再均衡是指當(dāng)分區(qū)的所屬消費(fèi)者個(gè)數(shù)發(fā)生變更的時(shí)候,再均衡發(fā)生期間簇爆,消費(fèi)者無法拉取消息癞松。即使當(dāng)消費(fèi)者個(gè)數(shù)大于分區(qū)數(shù)的時(shí)候,消費(fèi)者個(gè)數(shù)發(fā)生變化了還是會(huì)出發(fā)再均衡
15.Kafka的ISR入蛆,同步副本
Kafka沒有采取半數(shù)同步的機(jī)制(半數(shù)同步機(jī)制在允許N個(gè)節(jié)點(diǎn)掛掉時(shí)候响蓉,需要有2n+1個(gè)節(jié)點(diǎn),最后才能保證有1個(gè)點(diǎn)是已經(jīng)被同步過的)哨毁。kafka采取了全數(shù)同步的機(jī)制(這個(gè)會(huì)有點(diǎn)問題枫甲,當(dāng)進(jìn)行ack的時(shí)候,有一個(gè)節(jié)點(diǎn)掛掉了扼褪,那么這個(gè)時(shí)候就永遠(yuǎn)不可以完成ack了)想幻,因此kafka并且做了一些優(yōu)化,也就是ISR话浇,每一個(gè)分區(qū)都會(huì)有一個(gè)ISR脏毯,里面存放的是該分區(qū)的同步的副本。之后數(shù)據(jù)的同步幔崖,以及l(fā)eader的選舉都是在ISR中進(jìn)行的
16.Kafka的故障處理
hw和leo食店。 hw保證消費(fèi)的一致性和分區(qū)副本存儲(chǔ)的一致性。
消費(fèi)的一致性:超過hw的不可以被消費(fèi)赏寇。假設(shè)如果超過hw的可以被進(jìn)行消費(fèi)吉嫩,那么由于ISR中的leo會(huì)有可能不同,當(dāng)leader出現(xiàn)故障了嗅定,由于已消費(fèi)的offset>新leader的leo率挣,導(dǎo)致后續(xù)消費(fèi)者無法再進(jìn)行消費(fèi)。
存儲(chǔ)的一致性:當(dāng)ISR的leader節(jié)點(diǎn)發(fā)生故障的時(shí)候露戒,為了保證副本之間的一致性椒功,選舉的新的leader會(huì)讓follower高出自己的進(jìn)行截?cái)啵绻鹒ollower高出了hw也進(jìn)行截?cái)嘀鞘玻WC了新的ISR中各副本數(shù)據(jù)的一致性
因此hw只能保證副本之間的數(shù)據(jù)一致性动漾,不能保證數(shù)據(jù)不丟失或者不丟失,數(shù)據(jù)是否丟失應(yīng)該由ack機(jī)制來保證荠锭。
17.分區(qū)策略
RoundRobin:針對(duì)消費(fèi)者組里消費(fèi)者訂閱的所有主題來分旱眯,當(dāng)消費(fèi)者組里的消費(fèi)者訂閱了不同的主題就會(huì)有可能導(dǎo)致錯(cuò)分。所以使用這種方式約定,消費(fèi)者組里的消費(fèi)者訂閱的主題需要相同
Range:默認(rèn)删豺,按照主題的分區(qū)按范圍來分給消費(fèi)者組中的消費(fèi)者
補(bǔ)充分區(qū)分配策略的舉例:(2020-10-21)
兩個(gè)topic共虑,每個(gè)topic10個(gè)分區(qū):
topic1: A1 A2 A3 A4 A5 A6 A7 A8 A9 A10
topic2: B1 B2 B3 B4 B5 B6 B7 B8 B9 B10
消費(fèi)者三個(gè),都訂閱了topic1呀页、topic2:
C1
C2
C3
range:
C1: A1 A2 A3 A4 B1 B2 B3 B4
C2: A5 A6 A7 B5 B6 B7
C3: A8 A9 A10 B7 B8 B9 B10
roundrobin:
C1: A1 A4 A7 A10 B3 B6 B9
C2: A2 A5 A8 B1 B4 B7 B10
C3: A3 A6 A9 B2 B5 B8
sticky:
目標(biāo):分配的更均勻妈拌, 再均衡時(shí)會(huì)盡量避免消費(fèi)者的分區(qū)出現(xiàn)變化
如果訂閱和topic是均勻的,那么分配的結(jié)果和roundrobin是一致