寫在前面
上篇說到了kafka由于重復發(fā)送消息導致消息重復的問題。那不重發(fā)就不會重復了,的確是這樣的,但這樣也會帶來一個問題。producer只發(fā)送一次,那消息丟失了怎莫辦?
一.消息丟失
說到消息丟失,就不得不說到一個參數(shù)ACK。該參數(shù)有三個值,分別是0,1和all(或者-1)。這三個值關系到我們的消息是否真正寫入成功到kafka。
使用過kafka的小伙伴都知道有l(wèi)eader和follower角色,follower負責同步leader的數(shù)據(jù),以實現(xiàn)高可用消息不丟失。而ACK參數(shù)就是來控制消息是否真正寫入成功的。
2.1 ack參數(shù)詳解
-
0
如果設置為0,表示生產(chǎn)者不會等待broker對消息的確認。producer發(fā)出去就會得到相應,不清楚是否發(fā)到了broker上,同時重試配置也不會生效。 -
1
消息只需要寫到leader,然后就響應客戶端,不等follower確認。這樣是有風險的,假如leader寫入了消息,follower沒來得及同步數(shù)據(jù),此時leader掛了,那數(shù)據(jù)就沒了。 -
all
all的意思是說producer向leader寫入了數(shù)據(jù),同時follower同步了數(shù)據(jù),才向producer返回響應說數(shù)據(jù)成功寫入kafka。這里面有個ISR問題,后期我們會詳說??梢哉fall是kafka的最強可靠性保證。
相信大家看完,就知道了ack問題。
2.2 ISR
在數(shù)據(jù)同步這一塊,有個ISR的概念,意思是同步中的副本。
所有與leader副本保持一定程度同步的副本(包括Leader)組成ISR(In-Sync Replicas),一定程度表示允許有延遲。
這里說明一下kafka的leader副本是可以選舉的,當leader副本掛掉了,broker會從其他副本長選舉出新的副本。假如允許從落后太多的副本中選舉,也就是非ISR副本(OSR)中選舉,那數(shù)據(jù)肯定會丟失,OSR就是落后太多數(shù)據(jù)的一群。
默認不允許如上操作,但為了快速恢復集群的可用性,也就是設置
unclean.leader.election.enable=true就會造成數(shù)據(jù)丟失。
2.3 min.insync.replicas
該參數(shù)表示副本的最小數(shù)目,假如只有一個,那該副本宕機了,那數(shù)據(jù)也就丟失了。
所以,min.insync.replicas一半設為>1,和ack=-1配合使用。