Introduction
Kafka 是一個分佈式流平臺:
- 發佈和訂閱記錄流,像消息隊列/系統
- 容錯持久地存儲記錄流
- 有記錄流出現時處理
kafka概念:
- kafka是在多個服務器上以集羣方式運行,並有多個數據中心
- 記錄流存儲在叫topics的類別裏
- 每個記錄包含了一個key,一個value和一個時間戳
4個APIs:
- Producer API : 允許程序發佈1個數據流給一個或多個topics
- Consumer API : 允許程序訂閱一個或多個topics並處理這些數據流
- Streams API : 允許程序扮演流處理器,從一個或多個topics中得到輸入流併產生輸出流給一個或多個topics
- Connector API : 建立和運行可重用的生產者和消費者來連接kafka topics到已有的程序或數據系統
Topics & Logs:
Topics是multi-subscriber, 可以有0/1/多個消費者訂閱數據
每個topic是一個Partitioned log
partition 是有序的,不可改變的,被持續append的,結構化的commit log
kafka cluster持久地保存所有records(無論是否被消費過),根據一個可配置的保留時常
每個消費者保留的唯一metadata是offset,這個offset是被消費者控制的,它可隨意調整消費數據的順序
kafka 消費者可以隨意來或走,而不會影響集羣或其他消費者:可以用命令行來tail任何topic的內容而不用改變其他消費者正在消費的東西
分佈:
每個partition分佈在多個servers上,一個server上有多個partitions,以達到容錯性
一個server扮演leader,其他扮演followers:
– leader 處理所有讀寫請求
– followers 被動複製leader
– 如果leader fail,從followers中選舉leader
– 每個server扮演自己partition的leader 和 別人的follower
Geo-Replication:
主動/被動地鏡像,來備份和恢復
生產者:
負責決定某個記錄分配在這個topic的哪個partition – 負載均衡
消費者:
消費者分成組,每個發佈到一個topic上的記錄被放在每個組的一個消費者實例中,消費者實例可以在不同的進程或機器中
如果所有消費者都在一個組,則records會平均分配
如果所有消費者都不在一個組,則每個record分配在每個消費者上
通常一個logical subscriber對應一個消費者組。
消費的方式:
– partitions被平均分給每個consumer實例,所以在任何時刻每個實例都是一部分partitions的唯一消費者
– 如果一個實例新來,就從現有實例分配一點過來
– 如果一個實例掉線,就將它的任務拆分給其他實例
kafka只支持對一個partition內的records的總調度,而不管partition之間的(partition內部調度和按key的切分已經足夠)
Kafka as a Storage System:
寫入kafka的數據被存在disk中