這兩年大數據行業發展前景較好,行業工程師薪資高、人才少、競爭壓力小,不少人也所以想要轉型成爲大數據工程師,但也正是由於行業新、人才少,不少技術解決方案也是缺乏很優質的答案。今天,我給你們詳細剖析一個大數據工程師面試中的高頻面試題——Kafka是如何保證數據零丟失的?面試
若是要想保證Kafka數據不丟, 要從Kafka的三個地方入手:生產者、服務端和消費者。緩存
生產者安全
01 / API使用
在生產中Kafka生產者的開發咱們都會用異步調用的方式,異步調用方式有以下兩個API:服務器
1)producer.send(msg) 不帶回調方法2)producer.send(msg,callback) 帶回調方法異步
記得要使用帶有回調方法的API,咱們能夠根據回調函數得知消息是否發送成功,若是發送失敗了咱們要進行異常處理,好比存儲到其餘介質來保證消息不丟。
02 / acks參數設置分佈式
acks這個參數有三個值:0,1,-1,可是不一樣的參數對應的含義不一樣,那若是咱們想要保證數據不丟,acks值應該設置爲哪一個參數呢?請看下面的表格:ide
表明生產者只要把消息發送出去之後就認爲消息發送成功了,這種方式有可能會致使數據丟失,由於有可能消息發送到服務端之後服務端存儲失敗了。函數
1oop
表明生產者把消息發送到服務端,服務端的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......
更多免費技術資料及視頻