天天看點

kafka學習小結1.簡介2. Kafka中的術語解釋3.如果突發當機,Kafka寫入的資料如何保證不丢失?

1.簡介

1.1. 消息系統介紹

一個消息系統負責将資料從一個應用傳遞到另外一個應用,應用隻需關注于資料,無需關注資料在兩個或多個應用間是如何傳遞的。分布式消息傳遞基于可靠的消息隊列,在用戶端應用和消息系統之間異步傳遞消息。有兩種主要的消息傳遞模式:點對點傳遞模式、釋出-訂閱模式。大部分的消息系統選用釋出-訂閱模式。Kafka就是一種釋出-訂閱模式。

1.2. 點對點傳遞模式

在點對點消息系統中,消息持久化到一個隊列中。此時,将有一個或多個消費者消費隊列中的資料。但是一條消息隻能被消費一次。當一個消費者消費了隊列中的某條資料之後,該條資料則從消息隊列中删除。該模式即使有多個消費者同時消費資料,也能保證資料處理的順序

1.3. 釋出-訂閱模式

在釋出-訂閱消息系統中,消息被持久化到一個topic中。與點對點消息系統不同的是,消費者可以訂閱一個或多個topic,消費者可以消費該topic中所有的資料,同一條資料可以被多個消費者消費,資料被消費後不會立馬删除。在釋出-訂閱消息系統中,消息的生産者稱為釋出者,消費者稱為訂閱者。

2. Kafka中的術語解釋

2.1. broker

Kafka 叢集包含一個或多個伺服器,伺服器節點稱為broker。

broker存儲topic的資料。如果某topic有N個partition,叢集有N個broker,那麼每個broker存儲該topic的一個partition。

如果某topic有N個partition,叢集有(N+M)個broker,那麼其中有N個broker存儲該topic的一個partition,剩下的M個broker不存儲該topic的partition資料。

如果某topic有N個partition,叢集中broker數目少于N個,那麼一個broker存儲該topic的一個或多個partition。在實際生産環境中,盡量避免這種情況的發生,這種情況容易導緻Kafka叢集資料不均衡。

2.2. Topic

每條釋出到Kafka叢集的消息都有一個類别,這個類别被稱為Topic。(實體上不同Topic的消息分開存儲,邏輯上一個Topic的消息雖然儲存于一個或多個broker上但使用者隻需指定消息的Topic即可生産或消費資料而不必關心資料存于何處)類似于資料庫的表名

2.3. Partition

topic中的資料分割為一個或多個partition。每個topic至少有一個partition。每個partition中的資料使用多個segment檔案存儲。partition中的資料是有序的,不同partition間的資料丢失了資料的順序。如果topic有多個partition,消費資料時就不能保證資料的順序。在需要嚴格保證消息的消費順序的場景下,需要将partition數目設為1。

2.4. Leader

每個partition有多個副本,其中有且僅有一個作為Leader,Leader是目前負責資料的讀寫的partition。

2.5. Follower

Follower跟随Leader,所有寫請求都通過Leader路由,資料變更會廣播給所有Follower,Follower與Leader保持資料同步。如果Leader失效,則從Follower中選舉出一個新的Leader。當Follower與Leader挂掉、卡住或者同步太慢,leader會把這個follower從“in sync replicas”(ISR)清單中删除,重新建立一個Follower。

3.如果突發當機,Kafka寫入的資料如何保證不丢失?

引用http://dy.163.com/v2/article/detail/ECINRGTE0518QKND.html

3.1.Kafka 分布式存儲架構

如果每天産生幾十 TB 的資料,難道都寫一台機器的磁盤上嗎?這明顯是不靠譜的啊!是以說,這裡就得考慮資料的分布式存儲了,我們結合 Kafka 的具體情況來說說。

  在 Kafka 裡面,有一個核心的概念叫做“Topic”,這個 Topic 你就姑且認為是一個資料集合吧。

舉個例子,如果你現在有一份網站的使用者行為資料要寫入 Kafka,你可以搞一個 Topic 叫做“user_access_log_topic”,這裡寫入的都是使用者行為資料。

然後如果你要把電商網站的訂單資料的增删改變更記錄寫 Kafka,那可以搞一個 Topic 叫做“order_tb_topic”,這裡寫入的都是訂單表的變更記錄。

  然後假如說咱們舉個例子,就說這個使用者行為 Topic 吧,裡面如果每天寫入幾十 TB 的資料,你覺得都放一台機器上靠譜嗎?明顯不太靠譜,是以 Kafka 有一個概念叫做 Partition,就是把一個 Topic 資料集合拆分為多個資料分區,你可以認為是多個資料分片,每個 Partition 可以在不同的機器上,儲存部分資料。這樣,不就可以把一個超大的資料集合分布式存儲在多台機器上了嗎?大家看下圖,一起來體會一下。

kafka學習小結1.簡介2. Kafka中的術語解釋3.如果突發當機,Kafka寫入的資料如何保證不丢失?

 但是這個時候,我們又會遇到一個問題,就是萬一某台機器當機了,這台機器上的那個 Partition 管理的資料不就丢失了嗎?

  是以說,我們還得做多副本備援,每個 Partition 都可以搞一個副本放在别的機器上,這樣某台機器當機,隻不過是 Partition 其中一個副本丢失。

  如果某個 Partition 有多副本的話,Kafka 會選舉其中一個 Parititon 副本作為 Leader,然後其他的 Partition 副本是 Follower。

  隻有 Leader Partition 是對外提供讀寫操作的,Follower Partition 就是從 Leader Partition 同步資料。

  一旦 Leader Partition 當機了,就會選舉其他的 Follower Partition 作為新的 Leader Partition 對外提供讀寫服務,這不就實作了高可用架構了?

  大家看下面的圖,看看這個過程:

kafka學習小結1.簡介2. Kafka中的術語解釋3.如果突發當機,Kafka寫入的資料如何保證不丢失?

Kafka 寫入資料丢失問題

  現在我們來看看,什麼情況下 Kafka 中寫入資料會丢失呢?其實也很簡單,大家都知道寫入資料都是往某個 Partition 的 Leader 寫入的,然後那個 Partition 的 Follower 會從 Leader 同步資料。

  但是萬一 1 條資料剛寫入 Leader Partition,還沒來得及同步給 Follower,此時 Leader Partiton 所在機器突然就當機了呢?

  大家看下圖:

  

kafka學習小結1.簡介2. Kafka中的術語解釋3.如果突發當機,Kafka寫入的資料如何保證不丢失?

  如上圖,這個時候有一條資料是沒同步到 Partition0 的 Follower 上去的,然後 Partition0 的 Leader 所在機器當機了。

  此時就會選舉 Partition0 的 Follower 作為新的 Leader 對外提供服務,然後使用者是不是就讀不到剛才寫入的那條資料了?

  因為 Partition0 的 Follower 上是沒有同步到最新的一條資料的。這個時候就會造成資料丢失的問題。

  Kafka 的 ISR 機制是什麼?

  現在我們先留着這個問題不說具體怎麼解決,先回過頭來看一個 Kafka 的核心機制,就是 ISR 機制。

  這個機制簡單來說,就是會自動給每個 Partition 維護一個 ISR 清單,這個清單裡一定會有 Leader,然後還會包含跟 Leader 保持同步的 Follower。

  也就是說,隻要 Leader 的某個 Follower 一直跟他保持資料同步,那麼就會存在于 ISR 清單裡。

  但是如果 Follower 因為自身發生一些問題,導緻不能及時的從 Leader 同步資料過去,那麼這個 Follower 就會被認為是“out-of-sync”,被從 ISR 清單裡踢出去。

  是以大家先得明白這個 ISR 是什麼,說白了,就是 Kafka 自動維護和監控哪些 Follower 及時的跟上了 Leader 的資料同步。

  Kafka 寫入的資料如何保證不丢失?

  是以如果要讓寫入 Kafka 的資料不丢失,你需要保證如下幾點:

  每個 Partition 都至少得有 1 個 Follower 在 ISR 清單裡,跟上了 Leader 的資料同步。

  每次寫入資料的時候,都要求至少寫入 Partition Leader 成功,同時還有至少一個 ISR 裡的 Follower 也寫入成功,才算這個寫入是成功了。

  如果不滿足上述兩個條件,那就一直寫入失敗,讓生産系統不停的嘗試重試,直到滿足上述兩個條件,然後才能認為寫入成功。

  按照上述思路去配置相應的參數,才能保證寫入 Kafka 的資料不會丢失。

  好!現在咱們來分析一下上面幾點要求。

  第一條,必須要求至少一個 Follower 在 ISR 清單裡。

  那必須的啊,要是 Leader 沒有 Follower 了,或者是 Follower 都沒法及時同步 Leader 資料,那麼這個事兒肯定就沒法弄下去了。

  第二條,每次寫入資料的時候,要求 Leader 寫入成功以外,至少一個 ISR 裡的 Follower 也寫成功。

  大家看下面的圖,這個要求就是保證說,每次寫資料,必須是 Leader 和 Follower 都寫成功了,才能算是寫成功,保證一條資料必須有兩個以上的副本。

  這個時候萬一 Leader 當機,就可以切換到那個 Follower 上去,那麼 Follower 上是有剛寫入的資料的,此時資料就不會丢失了。

  

kafka學習小結1.簡介2. Kafka中的術語解釋3.如果突發當機,Kafka寫入的資料如何保證不丢失?

   如上圖所示,假如現在 Leader 沒有 Follower 了,或者是剛寫入 Leader,Leader 立馬就當機,還沒來得及同步給 Follower。

  在這種情況下,寫入就會失敗,然後你就讓生産者不停的重試,直到 Kafka 恢複正常滿足上述條件,才能繼續寫入。這樣就可以讓寫入 Kafka 的資料不丢失。