溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Producer發(fā)送數(shù)據(jù)丟失、重復(fù)、亂序原因及解決方案是什么

發(fā)布時(shí)間:2021-12-06 10:28:39 來(lái)源:億速云 閱讀:183 作者:柒染 欄目:大數(shù)據(jù)

這篇文章給大家介紹Producer發(fā)送數(shù)據(jù)丟失、重復(fù)、亂序原因及解決方案是什么,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

    生產(chǎn)環(huán)境對(duì)于生產(chǎn)者來(lái)說(shuō),Kafka集群發(fā)送消息經(jīng)常會(huì)遇到消息丟失、重復(fù)、亂序等問(wèn)題,下面我們來(lái)講解一下出現(xiàn)這些問(wèn)題的原因及解決方案。

1.我們知道Kafka為保障數(shù)據(jù)的可靠性,采用了多副本的存儲(chǔ)機(jī)制

    假設(shè)一個(gè)Topic拆分為了3個(gè)Partition,分別是PartitionA,PartitonB,PartitionC,此時(shí)每個(gè)Partition都有2個(gè)副本。比如PartitionA有一個(gè)副本是leader,另外一個(gè)副本是follower,leader和follower兩個(gè)副本是分布在不同機(jī)器上的。

    一般生產(chǎn)環(huán)境我們都會(huì)指定Topic的數(shù)據(jù)有3個(gè)副本,即使一臺(tái)broker掛掉以后,數(shù)據(jù)也不會(huì)徹底丟失,因?yàn)槠渌鸼roker還存在另外的副本數(shù)據(jù)。

2.副本數(shù)據(jù)是如何進(jìn)行同步的呢?

    對(duì)于多個(gè)副本的topic來(lái)說(shuō),只有分區(qū)leader提供讀寫(xiě)服務(wù)的,follower只是不停的嘗試從leader拉取最新的數(shù)據(jù)到本地,不提供讀寫(xiě)服務(wù),跟leader數(shù)據(jù)保持同步的數(shù)據(jù)有哪些呢?就是通過(guò)ISRl來(lái)管理的。

    ISR全稱(chēng)是“In-Sync Replicas”,就是能跟首領(lǐng)副本基本保持一致的跟隨副本,如果同步的速度太慢的話(huà),就會(huì)被踢出ISR副本。

3.說(shuō)一下Kafka的Producer端消息傳遞語(yǔ)義,由參數(shù)"acks"控制,分三種:

a.acks=all

    意味著當(dāng)Producer發(fā)送消息時(shí),leader接收到消息之后,還必須要求ISR列表里跟leader保持同步的那些follower都要把消息同步過(guò)去,才能認(rèn)為這條消息是寫(xiě)入成功了,這種效率最低,但是可靠性最高。

b.acks=1:

    意味著當(dāng)Producer發(fā)送消息時(shí),leader接收到消息而且寫(xiě)入本地磁盤(pán)了,就認(rèn)為成功了,不管他其他的follower有沒(méi)有同步過(guò)去這條消息了,acks默認(rèn)值為1。

c.acks=0:

    意味著當(dāng)Producer發(fā)送消息時(shí),producer發(fā)送一次就不再發(fā)送了,不管是否發(fā)送成功,這種情況下沒(méi)有任何的確認(rèn),可能存在消息的丟失;這種效率最高,但是可靠性最低。

4.Producer端引起數(shù)據(jù)丟失、重復(fù)、亂序的原因及解決方案

1).Producer發(fā)送數(shù)據(jù)分為同步、異步兩種模式,由參數(shù)producer.type控制,一般生產(chǎn)采用異步模式批量發(fā)送,提高Kafka系統(tǒng)的吞吐率。

a同步模式 producer.type = sync:

    當(dāng)acks=0,不進(jìn)行消息接收的確認(rèn),那么當(dāng)網(wǎng)絡(luò)異常時(shí),就會(huì)造成數(shù)據(jù)丟失,一般生產(chǎn)不建議設(shè)置為0;

    當(dāng)acks=1,在只有l(wèi)eader接收成功并發(fā)送ack確認(rèn)后,leader宕機(jī),副本沒(méi)有同步完成,也會(huì)造成數(shù)據(jù)丟失;

    上面兩種數(shù)據(jù)丟失,我們可以設(shè)置acks=all,保證produce 寫(xiě)入所有副本算成功,效率比較低。

 producer.type = sync  request.required.acks=all

?

b.異步模式 producer.type = async:

    異步模式下的有個(gè)buffer,通過(guò)buffer來(lái)進(jìn)行控制數(shù)據(jù)的發(fā)送,有兩個(gè)值來(lái)進(jìn)行控制,時(shí)間閾值與消息的數(shù)量閾值,如果buffer滿(mǎn)了數(shù)據(jù)還沒(méi)有發(fā)送出去,如果設(shè)置的是立即清理模式,風(fēng)險(xiǎn)很大,容易造成數(shù)據(jù)丟失。一般設(shè)置為阻塞模式:queue.enqueue.timeout.ms = -1表示后臺(tái)消息queue積壓到上限后將一直阻塞,直到queue空間釋放;

producer.type = asyncrequest.required.acks=1queue.buffering.max.ms=6000queue.buffering.max.messages=10000queue.enqueue.timeout.ms = -1batch.num.messages=500

3).acks = all時(shí),數(shù)據(jù)發(fā)送到 leader 后 ,數(shù)據(jù)發(fā)送到 leader 后 ,部分 ISR 的副本同步,leader 此時(shí)掛掉。比如 follower1 和 follower2 都有可能變成新的 leader, producer 端會(huì)得到返回異常,producer 端會(huì)重新發(fā)送數(shù)據(jù),可能會(huì)造成數(shù)據(jù)重復(fù),這種可通過(guò)冪等性和事務(wù)解決,后續(xù)會(huì)講;

4).acks=all時(shí),當(dāng)isr列表為空,如果unclean.leader.election.enable為true,則會(huì)選擇其他存活的副本作為新的leader,也會(huì)存在消息丟失的問(wèn)題

可通過(guò)設(shè)置參數(shù):

unclean.leader.election.enable=false

    這個(gè)參數(shù)在0.11.0之前其默認(rèn)值為true,而之后的版本其默認(rèn)值為false。意思是,在leader選舉時(shí)是否在沒(méi)有活著的ISR副本時(shí)從OSR中的最早follower選舉,如果為true可能會(huì)造成數(shù)據(jù)的丟失;

5).異步發(fā)送消息時(shí),有兩條數(shù)據(jù)數(shù)據(jù)準(zhǔn)備發(fā)送到相同的Partition,第一條消息寫(xiě)入失敗,第二條消息寫(xiě)入失敗,經(jīng)過(guò)重試后第一批次寫(xiě)入成功,這時(shí)就會(huì)造成發(fā)送數(shù)據(jù)的亂序,這種情況我們可以通過(guò)設(shè)置參數(shù)進(jìn)行限制:

參數(shù):max.in.flight.requests.per.connection

    表示請(qǐng)求隊(duì)列大小,默認(rèn)5,請(qǐng)求隊(duì)列中存放的是在發(fā)送途中的請(qǐng)求,包括:正在發(fā)送的請(qǐng)求和已經(jīng)發(fā)送的但還沒(méi)有接收到response的請(qǐng)求;請(qǐng)求隊(duì)列滿(mǎn)了,發(fā)送消息將會(huì)發(fā)生阻塞。也就是發(fā)往同一個(gè)node的最大未響應(yīng)請(qǐng)求。設(shè)置此值是1,表示kafka broker在響應(yīng)請(qǐng)求之前client不能再向同一個(gè)broker發(fā)送請(qǐng)求,這樣便可以避免消息亂序。

    通過(guò)4的分析發(fā)現(xiàn)kafka在兩端的默認(rèn)配置都是at least once,可能重復(fù),通過(guò)配置也不能做到exactly once,好像kafka的消息一定會(huì)丟失或者重復(fù),在kafka 0.11.0.0版本之后,開(kāi)始引入了冪等性和事務(wù)機(jī)制來(lái)解決上述問(wèn)題。


擴(kuò)充知識(shí)點(diǎn):

1.Kafka發(fā)送數(shù)據(jù)過(guò)快,導(dǎo)致服務(wù)器網(wǎng)卡流量暴增。或磁盤(pán)過(guò)忙,出現(xiàn)丟包,造成。這時(shí)候我們采取以下措施:

     a.首先,對(duì)kafka進(jìn)行限速;

     b.其次啟用重試機(jī)制,使重試間隔變長(zhǎng);

     c.Kafka設(shè)置ack=all,即需要處于ISR(副本列表)的分區(qū)都確認(rèn),才算發(fā)送成功。

關(guān)于Producer發(fā)送數(shù)據(jù)丟失、重復(fù)、亂序原因及解決方案是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI