目錄
- kafka producer
- kafka 分區(qū)策略
- kafka 數(shù)據(jù)可靠性保證 - ack
- kafka 數(shù)據(jù)一致性保證 - Hw
- 消費(fèi)一致性
- 存儲一致性 同少同重復(fù)
1 kafka producer
1.1 分區(qū)策略
1.1.1 分區(qū)的原因
提高并發(fā)或渤,以分區(qū) partition 為單位進(jìn)行讀寫操作
1.1.2 生產(chǎn)者生產(chǎn)消息進(jìn)入的分區(qū)3種策略
這三種策略的前提都是明確知道具體的topic
1. 明確知道partition index饰剥,則直接進(jìn)入指定partition中
2. 不知道partition index,給出了消息對應(yīng)的key,則 hash(key)mod(num(partitions)) 獲取對應(yīng)的分區(qū)partition編號
3. 不知道partition index, 但給出了消息的value蛾洛,第一次調(diào)用時生成一個整數(shù),并記錄下來饺蔑,后面每次調(diào)用在這個整數(shù)上自增变泄,將這個值與topic 可用
的partition 總數(shù)取余 得到partition值,也是常說的 round-robin 算法
1.2 數(shù)據(jù)可靠性保證(非常重要心傀,強(qiáng)烈建議深刻理解)
kafka 通過 leader partition 發(fā)送ack
機(jī)制實(shí)現(xiàn)消息的可靠傳輸屈暗;
1.2.1 leader partition 發(fā)送ack給producer的充要條件:
-
確保有follower 與 leader 同步完成
,leader 再發(fā)送ack, 這樣能保證leader掛掉之后脂男,follower可以容災(zāi)养叛,并從follower中選舉出新的leader; -
與leader 同步的follower 個數(shù)也有兩種不同的策略
:- 2.1 半數(shù)以上的follower同步完成,即可發(fā)送ack
優(yōu)點(diǎn): 延遲比較低
缺點(diǎn): 選舉新leader時宰翅,容忍n臺節(jié)點(diǎn)故障弃甥,需要2n+1個副本 - 2.2 全部follower完成同步,才發(fā)送ack
優(yōu)點(diǎn): 容忍n臺節(jié)點(diǎn)故障汁讼,需要n+1個副本
缺點(diǎn)淆攻,延遲比較高
kafka 選用全量同步阔墩,雖然延遲高,但是數(shù)據(jù)副本量比較少
- 2.1 半數(shù)以上的follower同步完成,即可發(fā)送ack
1.2.2 kafka the ISR of leader partition - 解決全量同步過程中follower副本掛掉瓶珊,leader長時間等待的場景
問題1
如果 follower 副本在同步leader 數(shù)據(jù)的過程中啸箫,有一個副本掛掉了,長時間不能跟leader同步艰毒,那么leader就要一直等下去筐高,直到掛掉的follower也同步了
leader 的數(shù)據(jù),才發(fā)送ack丑瞧,這個問題該如何解決?
kafka 通過在leader partition 維護(hù)一個動態(tài)的ISR即同步副本
(是個set),來保存與leader保持同步的follower集合柑土。
follower如何被選定為ISR?
older version: 同步時間快慢 + 與leader 差異的數(shù)據(jù)條數(shù) (盡最大努力同步)
0.9 版本 new version 去掉了與leader 差異的數(shù)據(jù)條數(shù)因?yàn)闀l繁操作zk(想象一下 batch_size > 差異數(shù)據(jù)num策略),保留了同步時間策略,用來作為選取follower作為ISR元素的依據(jù)绊汹;
默認(rèn)10s
1.2.3 ack 應(yīng)答機(jī)制
為什么需要ack應(yīng)答機(jī)制
在某些場景下可以容忍數(shù)據(jù)丟失的情況稽屏,對數(shù)據(jù)的可靠性要求不高,能夠容忍數(shù)據(jù)的少量丟失西乖,所有沒有必要等待ISR中的Follower全部接收成功
所以對于不同場景下的數(shù)據(jù)可靠性傳輸狐榔、與數(shù)據(jù)傳輸性能上的要求,kafka對應(yīng)給出了如下三種ack應(yīng)答機(jī)制配置策略获雕。
1.2.3.1 acks = 0
0
: producer 不等待 leader partition所在的broker 回傳的ack薄腻,這個操作提供了一個最低的延遲,broker接收到(還沒有寫入磁盤的時候就已經(jīng)返回返回)届案,當(dāng)broker
故障時有可能丟失數(shù)據(jù)
1
:producer 等待 leader partition 所在的broker 回傳的ack庵楷,leader partition 落盤成功后返回ack,如果follower同步之前l(fā)eader故障楣颠,
那么將會丟失數(shù)據(jù)尽纽。
-1
: producer 等待 leader partition 所在的broker 回傳的ack,partition 的leader 和follower 全部落盤成功后才返回ack童漩。
但是弄贿,注意在 acks = -1時,在極端情況下還是可能會出現(xiàn)數(shù)據(jù)丟失的情況(這種情況很少見矫膨,但不代表沒有)差凹,而且最容易出現(xiàn)的情況是數(shù)據(jù)重復(fù)
下面簡單清晰的描述下這兩種場景:
acks = -1,數(shù)據(jù)丟失 ISR 中的follower副本數(shù)量恰好為0侧馅,即當(dāng)前l(fā)eader partition接收的數(shù)據(jù)直奋,沒有follower 需要同步,且leader partition 發(fā)完ack之后掛掉了施禾,那數(shù)據(jù)就丟失了脚线。
acks = -1, 數(shù)據(jù)重復(fù) 如果ISR 中維護(hù)的 followers 同步完數(shù)據(jù),leader 在發(fā)送ack給producer 之前掛掉了弥搞,那么producer就會重發(fā)數(shù)據(jù)給新晉升的leader邮绿。此時渠旁,數(shù)據(jù)就會重復(fù)發(fā)送。
1.3 數(shù)據(jù)一致性問題
1.3.1 保證消費(fèi)數(shù)據(jù)的一致性
場景描述: leader 接收了新一批數(shù)據(jù)顾腊,但是ISR 中follower還未同步完之前就掛掉了,如下圖所示挖胃,假如consumer已經(jīng)消費(fèi)到了19杂靶,那么接下來將消費(fèi)18,此時
leader掛掉酱鸭,新的follower成為leader吗垮,那么去消費(fèi)offset為18(當(dāng)前最老的數(shù)據(jù))就會報錯。
為應(yīng)對以上問題凹髓,kafka通過HW
& LEO
的機(jī)制解決消費(fèi)一致性問題:
解決方案:
HW - High water 高水位 即ISR 中所有 follower 中最小的LEO
LEO - 每個副本的最后一個offset
注意: HW 來保證數(shù)據(jù)一致性蔚舀,高水位之前的數(shù)據(jù)是消費(fèi)者可見的饵沧。
1.3.2 腦裂問題-存儲的一致性
可能出現(xiàn)腦裂問題 ,leader 掛掉赌躺,follower 被選舉為新leader狼牺, 先前掛掉的leader又重新活了起來,產(chǎn)生腦裂礼患,如果此時producer又新發(fā)一批次數(shù)據(jù)是钥,
這兩個leader都會接收到數(shù)據(jù),那么數(shù)據(jù)就發(fā)生混亂且不一致了讶泰。
將來消費(fèi)的數(shù)據(jù)都不一樣 。
腦補(bǔ)一下場面就可以了拂到,那么如何解決腦裂產(chǎn)生數(shù)據(jù)不一致問題呢?
新官上任三把火: 告訴所有在ISR中記錄的follower痪署,將數(shù)據(jù)截取到HW, 跟新leader的存儲數(shù)據(jù)保持一致
注意 HW只能保證副本數(shù)據(jù)的一致性,并不能保證數(shù)據(jù)丟不丟失躺翻,或者重不重復(fù)萍启,即要少都少疏虫,要多都多
以上問題討論的都是ISR 記錄的Follower 范圍。