Kafka 學習筆記(4)—— Kafka總結
阿新 • • 發佈:2018-12-12
1 Kafka 是什麼
- 類似JMS訊息佇列,結合JMS中的兩種模式,可以有多個消費者主動拉取資料,在JMS中只有點對點模式才有消費者拉取資料。
- kafka 是一個生產-消費模型。
Producer
:生產者,只負責資料生產,生產者的程式碼可以整合到任務系統中,資料的分發策略由producer 決定,預設是 defaultPatition ,Utils.abs(key.hashCode) % numPartitions
Broker
:當前伺服器 kafka 程序,只管資料儲存,不管是是誰生產,不管是誰消費。在叢集中每個 broker都有唯一的 brokerId,不能重複Topic
: 目標傳送的目的地,這是一個邏輯上的概念。落到磁碟上是一個 partition的目錄,partition 的目錄中有多個segment組合(index,log)。一個Topic 對應多個 partition(0,1,2,3),一個partition對應多個segment組合,一個segment有預設的大小是 1G 。每個partition 可以設定多個副本(replication-factor 1),會從所有的副本中選取一個leader來進行。這和 mysql 中的主從有區別,mysql 做主從是為了讀寫分離,在kafka中讀寫操作都是 leaderconsumer
,可以有多個,每個 consumer 消費的資料都是一樣的。ConsumerGroup
,可以有多個,每個ConsumerGroup消費的資料都是一樣的。 可以把多個consumer 執行緒劃分為一個組,組裡面所有成員共同消費一個 topic 的資料,組員之間不能重複消費。
2 Kafka 生產資料時的分組策略
- 預設是 defaultPatition ,
Utils.abs(key.hashCode) % numPartitions
- key 是 producer 傳送資料時傳入的,
produer.send(KeyedMessage(topic,myPartitionKey,messageContent))
3 Kafka 如何保證資料的完全生產
- ack 機制,broker 表示發來的資料已確認接收無誤,表示資料已經存到磁碟。
0
: 不等待 broker 返回確認訊息1
: 等待 topic 中某個 partition leader 儲存成功的狀態反饋-1
: 等待 topic 中某個partition 所有副本都儲存成功的狀態反饋
4 broker 如何 儲存資料
在理論環境下,broker 按照 順序讀寫機制,可以每秒儲存 60M的資料。主要通過 pagecache 機制,儘可能利用當前物理機器上的空閒記憶體做快取。當前 topic 所屬的broker,必定有一個該 topic 的 partition,partition是一個磁碟目錄,partition目錄中有多個 segment組合(index,log)。
5 broker 和 partition 的關係
int i = 0
list{kafka01,kafka02,kafka03}
for(int i=0;i<5;i++){
brIndex = i%broker;
hostName = list.get(brIndex)
}
6 consumerGroup 的組員 和 partition之間如何負載均衡
最好是一一對應。如果consumer 的數量太多,必然有空閒的 consumer。
演算法:
假如topic1,具有如下partitions: P0,P1,P2,P3
group中,有如下consumer: C1,C2
首先根據partition索引號對partitions排序: P0,P1,P2,P3
根據consumer.id排序: C0,C1
計算倍數: M = [P0,P1,P2,P3].size / [C0,C1].size,本例值M=2(向上取整)
然後依次分配partitions: C0 = [P0,P1],C1=[P2,P3],即Ci = [P(i * M),P((i + 1) * M -1)]
7 如何保證 kafka 消費者消費資料的全域性有序
如果要保證消費有序,必須保證生產有序,儲存有序,消費有序。 由於生產可以叢集,儲存就可以分片,消費可以設定為一個 consumerGroup ,要保證全域性有序,就需要保證每個環節都有序。只有一個可能,就是一個生產者,一個 partition,一個消費者,這種場景和大資料應用場景相悖。