天天看點

Kafka零資料丢失的配置方案

這兩年大資料行業發展前景較好,行業工程師薪資高、人才少、競争壓力小,很多人也是以想要轉型成為大資料工程師,但也正是因為行業新、人才少,很多技術解決方案也是缺少很優質的答案。今天,我給大家詳細剖析一個大資料工程師面試中的高頻面試題——Kafka是如何保證資料零丢失的?

如果要想保證Kafka資料不丢, 要從Kafka的三個地方入手:生産者、服務端和消費者。

生産者

01 / API使用

在生産中Kafka生産者的開發我們都會用異步調用的方式,異步調用方式有如下兩個API:

1)producer.send(msg) 不帶回調方法2)producer.send(msg,callback) 帶回調方法

記得要使用帶有回調方法的API,我們可以根據回調函數得知消息是否發送成功,如果發送失敗了我們要進行異常處理,比如存儲到其他媒體來保證消息不丢。

02 / acks參數設定

acks這個參數有三個值:0,1,-1,但是不同的參數對應的含義不同,那如果我們想要保證資料不丢,acks值應該設定為哪個參數呢?請看下面的表格:

代表生産者隻要把消息發送出去以後就認為消息發送成功了,這種方式有可能會導緻資料丢失,因為有可能消息發送到服務端以後服務端存儲失敗了。

1

代表生産者把消息發送到服務端,服務端的leader replica 副本寫成功以後,就傳回生産者消息發送成功了,這種方式也有可能會導緻丢資料,因為有可能剛好資料寫入到leader replica,然後傳回處理成功的響應給生産者,假如這個時候leader replica在的伺服器出問題了,follower replica還沒來得及同步資料,這個時候是會丢資料的。

-1(all)

代表生産者把消息發送到服務端,服務端的ISR清單裡所有replica 都寫入成功以後,才會傳回成功響應給生産者。假設ISR清單裡面有該分區的三個replica(一個leader replica,兩個follower replica),那麼acks=-1就意味着消息要寫入到leader replica,并且兩個follower replica從leader replica上同步資料成功,服務端才會給生産者發送消息發送成功的響應。

是以ISR清單裡面的replica就非常關鍵。如果我們想要保證資料不丢,那麼acks的值設定為-1,并且還需要保證ISR清單裡面是1個副本以上,具體由哪個參數控制,看下面的服務端的配置。

是以acks的值要設定為-1。

03 / 重試次數設定是以acks的值要設定為-1。

為了保證資料不丢,我們盡可能的設定較大的重試次數(參數是retries),如果重試失敗了,對異常進行處理,可以把消息儲存到另外安全到地方。

服務端

01 / unclean.leader.election.enable

這個參數是控制leader replica出問題了以後follower replica競選leader replica資格的,我們把設定為false,意思就是如果follower replica如果落後leader replica太多就不能參與競選。

02 / replication.factor

這個參數設定的是partition副本的個數,如果我們要想保證資料不丢,這個副本數需要設定成大于1。

03 / min.insync.replicas

這個參數要跟生産者裡的acks參數配合使用,當生産者acks=-1時,服務端的ISR清單裡的所有副本都寫入成功,才會給生産者傳回成功的響應。而min.insync.replicas這個參數就是控制ISR清單的,假設min.insync.replicas=1,這就意味着ISR清單裡可以隻有一個副本,這個副本就是leader replica,這個時候即使acks設定的是-1,但其實消息隻發送到leader replica,以後就傳回成功的響應了。

因為ISR隻有一個副本,我們知道這種情況是有可能會丢資料的,是以min.insync.replicas這個值需要大于1的(如果ISR清單裡面副本的個數小于min.insync.replicas,生産者發送消息是失敗的),并且是min.insync.replicas <= replication.factor

消費者

01 / 手動送出offset

消費者是可以自動送出offset的,但是如果是自動送出offset,可能會丢資料,比如消費者每隔3秒送出一次offset,假如偏移量成功送出了,但是資料處理失敗了,這個時候就會丢資料。是以把enable.auto.commit設定成false就行。

當然,我們也隻是有限度的保證Kafka資料不丢,因為我們知道Kafka的資料首先是寫到作業系統緩存的,假如我們用了上面的配置方案,資料寫入成功了,還沒落到磁盤,但是叢集停電了,這個時候也是會丢資料的!

Kafka 是一種高吞吐量的分布式釋出訂閱消息系統,它能夠解決和處理的問題還有很多。當然了,要想成為一名合格的大資料工程師,還要具備系統的大資料技術知識體系,并熟練使用技術解決不同工作場景中遇到的問題。像Zookeeper、Hadoop、Flume......​

繼續閱讀