上次入門篇介紹了針對Kafka做了基本介紹,還沒看過的朋友可以先前往:
Kafka 訊息訂閱發布系統 簡介 - 入門篇
接下來文章將會圖解Kafka的詳細架構、總結優缺點,以及穿插一些小小的實作輔助理解,如果是對Kafka已經有基礎了解的朋友讓我們繼續看下去!
Kafka 架構 – Producer如何將資料寫入Topic
在 Kafka 中 Topic 被分成多個 Partition 分區。
依據上圖可以看出每個Partition裡面是有順序的,因此如果我們希望一個Topic裡面的資料都是有序的,我們需要將Topic僅設定一個Partition,當一個Topic有多個Partition時,我們無法保證Topic資料被取出時,是按照存入的順序被取出。
Zookeeper
看到這邊不曉得有沒有人和我一樣會以為Topic的所有Partition會存在同一台機器上,其實Partition會存在不同機器上,也就是說上圖的Topic裡有3個Partition就會被分配到三台Server(Broker),而這三台Server(Broker)除了有自己的Partition資料外,還會存備份,而管理這些Broker的人就是Zookeeper。
Broker - 多個Broker組成Kafka Cluster,以保持負載平衡。Broker本身沒有狀態,而是由Zookeeper管理、紀錄每個Broker的狀態。一個Broker裡面可以有一或多個Partition,通常一個Broker就是一台Server。
ZooKeeper - ZooKeeper用於管理和協調Broker。 ZooKeeper服務主要用於紀錄Kafka系統中Broker(Server)的存活狀態,並且可以協調失敗的Broker如何存取資料。
這邊插播一個實例解說
上圖示Kafka的server.properties,這邊我建立了三台機器,分別是三個Broker,在Zookeeper配置這些機器的位置,並且透過指令Create一個名為first的Topic。
透過上圖可以看到我告訴Zookeeper這個first的Topic需要有三個Partition,因此Producer存放資料的時候會被分流到這三個Partition中,達到存資料的負載均衡,並且進行備份,replication我設定為2,這邊需要注意,設定為2時,同個Server就只會有兩個Partition的資料(自己和另一個),像是上圖Broker1就存了partition0、partition1,由此可知,若想要每個Broker都備份到全部的資料,就需要將replication我設定為3。
相信透過這個實例大家對於Kafka架構就不會過於抽象,那我們就繼續用架構圖解釋備份機制
Kafka強大的備份機制
由上面的架構圖可以得知,在Broker中Leader是主要存取的Partition,Follower只是備份機制產生的,因此Follower不被讀取,只做備份使用,Kafka的備份機制可以讓某一台Server(Broker)斷線、停止服務的時候另外一台Server(Broker)可以正常地繼續運作,不會因為其他Broker停止導致資料流斷掉無法繼續存取資料,因為此時的Zookeeper會監測到Broker狀態,調渡資料存到其他正常運作的Broker。
這邊一樣利用實作模擬某台機器斷線,查看一下Zookeeper
下指令Kill Broker3
Zookeeper發揮作用,Partition 2 的 Leader 3 => 2
Isr (InSyncReplication) 正在同步的複本:Leader3 已經不存活所以不能被同步
Consumer Group
特別說明,當多個Consumer組成一個Group訂閱某個Topic收取資料時,假設Topic中有10筆資料,某個Consumer Group裡有三個Consumer接收消息,那麼這三個Consumer可能會分別收到幾條訊息(3筆/3筆/4筆),整個Group總共收到10筆資料後,就不會再收資料,由此可知,當我今天的需求是希望Consumer可以收到Topic中完整的全部的訊息時,我的Consumer Group中只能有一位Consumer,這樣才可以保證消費者收到Topic的所有訊息喔!
若今天需要將Topic訊息全都讓所有有訂閱的Consumer收到就需要設定不同的GroupId(保持每個Group裡面只有一個Consumer即可)。
總結Kafka優點
剛開始學習Kafka架構時也覺得很多名詞很複雜,因此希望這文章搭配實作、白話的說明可以讓大家更進一步了解Kafka,更深入的操作我也還沒實作,若有甚麼好的文章或建議歡迎留言給我~ 互相交流!