1.1簡介
apache kafka 是分布式發布-訂閱訊息系統(訊息中介軟體)。它最初由 linkedin 公司開發,之後成為 apache 專案的一部分。kafka 是一種快速、可擴充套件的、設計內在就是分布式的,分割槽的和可複製的提交日誌服務。
apache kafka 與傳統訊息系統相比,有以下不同:
它是分布式系統,易於向外擴充套件;
它同時為發布和訂閱提供高吞吐量;
它支援多訂閱者,當失敗時能自動平衡消費者;
它將訊息持久化到磁碟,因此可用於批量消費,例如 etl,以及實時應用程式。
1.2術語
broker
kafka 集群包含乙個或多個伺服器,這種伺服器被稱為 broker
topic
每條發布到 kafka 集群的訊息都有乙個類別,這個類別被稱為 topic。(物
理上不同 topic 的訊息分開儲存,邏輯上乙個 topic 的訊息雖然儲存於乙個或多個 broker 上但使用者只需指定訊息的 topic 即可生產或消費資料而不必關心資料存於何處)
partition
partition 是物理上的概念,每個 topic 包含乙個或多個 partition.
producer
負責發布訊息到 kafka broker
consumer
訊息消費者,向 kafka broker 讀取訊息的客戶端
consumer group
每個 consumer 屬於乙個特定的 consumer group(可為每個 consumer
指定 group name,若不指定 group name 則屬於預設的 group)
replica
partition 的副本,保障 partition 的高可用
leader
replica 中的乙個角色, producer 和 consumer 只跟 leader 互動
follower
replica 中的乙個角色,從 leader 中複製資料
controller
kafka 集群中的其中乙個伺服器,用來進行 leader election 以及各種
failover
(*)kafka的安裝
解壓:tar -zxvf kafka_2.11-0.10.2.1.tgz -c /opt/modules/
核心配置檔案: config/server.propertis
broker.id=0
listeners=plaintext://bigdata01:9092
log.dirs=/opt/modules/kafka_2.11-0.10.2.1/data
num.partitions=3
zookeeper.connect=bigdata01:2181,bigdata02:2181,bigdata03:2181
分發:
scp -r kafka_2.11-0.10.2.1/ bigdata02:/opt/modules/
scp -r kafka_2.11-0.10.2.1/ bigdata03:/opt/modules/
修改bigdata02:
broker.id=1
listeners=plaintext://bigdata02:9092
修改bigdata03:
broker.id=2
listeners=plaintext://bigdata03:9092
每台機器上都要啟動(需要先啟動zookeeper):
bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic test
bin/kafka-console-producer.sh --broker-list
192.168.1.3:9092,192.168.1.4:9092,192.168.1.5:9092 --topic test
bin/kafka-console-consumer.sh --bootstrap-server hadoop03:9092
--from-beginning --topic hellotopic
4.1kafka的拓撲結構
如上圖所示,乙個典型的 kafka 集群中包含若干 producer,若干 broker(kafka 支援水平擴充套件, 一般 broker 數量越多,集群吞吐率越高),若干 consumer group,以及乙個 zookeeper 集群。kafka 通過 zookeeper 管理集群配置,選舉 leader。producer 使用 push 模式將訊息發布到 broker,consumer 使用 pull 模式從 broker 訂閱並消費訊息。
producer 傳送訊息到broker時,會根據分割槽演算法將其儲存到哪乙個partition
指定了partition,則直接使用
未指定partition,但指定key,通過對key的 value進行hash 選出乙個partition
partition和key 都為指定,使用輪詢選出乙個partition
4.2.1寫資料流程
4.3.1訊息儲存方式
物理上把 topic 分成乙個或多個 partition(對應 server.properties 中的 num.partitions=3 配置),每個 partition 物理上對應乙個資料夾(該資料夾儲存該 partition 的所有訊息和索引檔案)
4.3.2訊息儲存策略
無論訊息是否被消費,kafka 都會保留所有訊息。有兩種策略可以刪除舊資料:
log.retention.hours=168 #基於時間
log.retention.bytes=1073741824 #基於大小
partition 中的每條 message 由 offset 來表示它在這個 partition 中的偏移量,這個 offset 不是該 message 在 partition 資料檔案中的實際儲存位置,而是邏輯上乙個值,它唯一確定了partition 中的一條 message。因此,可以認為 offset 是 partition 中 message 的 id。partition中的每條 message 包含了以下三個屬性: offset ;messagesize;data
那 kafka 是如何解決查詢效率的的問題呢?
分段
kafka 解決查詢效率的手段之一是將資料檔案分段,比如有 100 條 message,它們的 offset 是從 0 到 99。假設將資料檔案分成 5 段,第一段為 0-19,第二段為 20-39,以此類推,每段放在乙個單獨的資料檔案裡面,資料檔案以該段中最小的 offset 命名。這樣在查詢指定 offset 的 message 的時候,用二分查詢就可以定位到該 message 在哪個段中。
索引
資料檔案分段使得可以在乙個較小的資料檔案中查詢對應 offset 的 message 了,但是這依然需要順序掃瞄才能找到對應 offset 的 message。為了進一步提高查詢的效率,kafka 為每個分段後的資料檔案建立了索引檔案,檔名與資料檔案的名字是一樣的,只是擴充套件名為.index。
索引檔案中包含若干個索引條目,每個條目表示資料檔案中一條 message 的索引。索引包含兩個部分,分別為相對 offset 和 position。
學習筆記 Kafka
kafka kafka把資料往磁碟上寫,但是在磁碟上存它的讀寫速度比記憶體快,這個依賴於預讀和後寫功能,但是這個預讀和後寫必須是按照順序的方式,若沒有順序的方式優化的話,不存在什麼預讀和後寫。特點 訊息持久化 能落到磁碟 通過o 1 的磁碟資料結構提供資料的持久化 高吞吐量 分布式 擴充套件能力強 ...
kafka學習筆記
1.1 kafka的特性 controller在zookeeper註冊watch zookeeper管理kakfabroker集群。所有的kafkabroker節點一起去zookeeper上註冊乙個臨時節點,只有乙個能成功,成功註冊的節點稱之為 kafkabrokercontroller,其餘的稱之...
kafka學習筆記
名詞解釋 物理儲存結構 說明segment中index data file對應關係物理結構如下 message資料結構 資料查詢過程 讀取offset 368776的message todo 定位是哪個segment檔案 通過segment檔名二分查詢,比如 當offset 368776時定位到00...