Kafka寫入流程和副本策略

2022-08-23 04:06:09 字數 2266 閱讀 3970

kafka寫入流程:

1.producer 先從 zookeeper 的 "/brokers/.../state" 節點找到該 partition 的 leader

2. producer 將訊息傳送給該 leader

3. leader 將訊息寫入本地 log

4. followers 從 leader pull 訊息,寫入本地 log 後 leader 傳送 ack

5. leader 收到所有 isr 中的 replica 的 ack 後,增加 hw(high watermark,最後 commit 的 offset) 並向 producer 傳送 ack

副本策略:

kafka的高可靠性的保障**於其健壯的副本(replication)策略。

1) 資料同步

kafka在0.8版本前沒有提供partition的replication機制,一旦broker宕機,其上的所有partition就都無法提供服務,而partition又沒有備份資料,資料的可用性就大大降低了。所以0.8後提供了replication機制來保證broker的failover。

引入replication之後,同乙個partition可能會有多個replica,而這時需要在這些replication之間選出乙個leader,producer和consumer只與這個leader互動,其它replica作為follower從leader中複製資料。

[root@tourbis kafka_2.10-0.8.2.1]# bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic  test

topic:test      partitioncount:3        replicationfactor:3     configs:

topic: test     partition: 0    leader: 1       replicas: 1,3,2 isr: 1,3,2

topic: test     partition: 1    leader: 2       replicas: 2,1,3 isr: 2,1,3

topic: test     partition: 2    leader: 3       replicas: 3,2,1 isr: 3,2,1

1個topic,3個分割槽,每個分割槽有3個副本。

2) 副本放置策略

為了更好的做負載均衡,kafka盡量將所有的partition均勻分配到整個集群上。kafka分配replica的演算法如下:

將所有存活的n個brokers和待分配的partition排序

將第i個partition分配到第(i mod n)個broker上,這個partition的第乙個replica存在於這個分配的broker上,並且會作為partition的優先副本

將第i個partition的第j個replica分配到第((i + j-1) mod n)個broker上

假設集群一共有4個brokers,乙個topic有4個partition,每個partition有3個副本。下圖是每個broker上的副本分配情況。

3)同步策略

producer在發布訊息到某個partition時,先通過zookeeper找到該partition的leader,然後無論該topic的replication factor為多少,producer只將該訊息傳送到該partition的leader。leader會將該訊息寫入其本地log。每個follower都從leader pull資料。這種方式上,follower儲存的資料順序與leader保持一致。follower在收到該訊息並寫入其log後,向leader傳送ack。一旦leader收到了isr中的所有replica的ack,該訊息就被認為已經commit了,leader將增加hw【high watermark】

並且向producer傳送ack。

為了提高效能,每個follower在接收到資料後就立馬向leader傳送ack,而非等到資料寫入log中。因此,對於已經commit的訊息,kafka只能保證它被存於多個replica的記憶體中,而不能保證它們被持久化到磁碟中,也就不能完全保證異常發生後該條訊息一定能被consumer消費。

consumer讀訊息也是從leader讀取,只有被commit過的訊息才會暴露給consumer。

HDFS讀取和寫入流程

1 讀檔案的過程 首先 client 通過 file system 的 open 函式開啟檔案,distributed file system 用 rpc呼叫 namenode 節點,得到檔案的資料塊資訊。對於每乙個資料塊,namenode 節點返回儲存資料塊的資料節點的位址。distributed...

HDFS資料寫入流程

1 client 發起檔案寫入請求,通過 rpc 與 namenode 建立通訊,namenode檢查目標檔案,返回是否可以上傳 2 client 請求第乙個 block 該傳輸到哪些 datanode 伺服器上 3 namenode 根據副本數量和副本放置策略進行節點分配,返回datanode節點...

HFDS的資料寫入流程

首先了解資料寫入過程中,什麼是block,packet,chunk 1.block 資料塊,當上傳的檔案太大時,就需要分塊,乙個塊預設設定時128m,在客戶端完成切割操作。資料塊block也不是一次性傳送到 datanode中,在客戶端向datanode傳送資料檔案時,是分成乙個乙個的packet的...