-
寫入方式
-
producer 采用推(push)模式將消息發布到 broker,每條消息都被追加(append)到分區(patition)中,屬於順序寫磁盤(順序寫磁盤效率比隨機寫內存要高,保障 kafka 吞吐率)
-
-
分區(Partition)
-
消息發送時都被發送到一個 topic,其本質就是一個目錄,而 topic 是由一些 PartitionLogs(分區日志)組成,每個 Partition 中的消息都是有序的,生產的消息被不斷追加到Partition log 上,其中的每一個消息都被賦予了一個唯一的 offset 值,其組織結構如下圖所示:
-
-
-
分區的原因
-
實現水平擴展。每個 Partition 可以通過調整以適應它所在的機器,而一個topic 又可以由多個 Partition 組成,因此整個集群就可以適應任意大小的數據
-
實現負載均衡。以 Partition 為單位讀寫,提高並發量
-
-
分區的原則
-
指定了 patition,則直接使用
-
未指定 patition 但指定 key,通過對 key 的 value 進行 hash 出一個 patition
-
patition 和 key 都未指定,使用輪詢選出一個 patition
-
-
-
-
同一個 partition 可 能 會 有 多 個 replication 。沒有 replication 的情況下,一旦 broker 宕機,其上所有patition的數據都不可被消費,同時 producer 也不能再將數據存於其上的 patition。引入 replication 之后,同一個 partition 可能會有多個 replication,而這時需要在這些 replication 之間選出一個leader,producer 和 consumer 只與這個 leader 交互,其它 replication 作為 follower 從 leader中復制數據
-
-
producer 先從 zookeeper 的 "/brokers/.../state"節點找到該 partition 的 leader
-
producer 將消息發送給該 leader
-
leader 將消息寫入本地 log
-
followers 從 leader pull 消息,寫入本地 log 后向 leader 發送 ACK
-
leader 收到所有 ISR 中的 replication 的 ACK 后,增加 HW(high watermark,最后 commit的 offset)並向 producer 發送 ACK
-