Kafka知識點總結(jié)

1. Kafka

Kafka 是一種高吞吐量、分布式、基于發(fā)布/訂閱的消息系統(tǒng),最初由 LinkedIn 公司開發(fā),使用 Scala語言編寫,目前是Apache的開源項目。

特點:

高吞吐量、低延遲:kafka每秒可以處理幾十萬條消息,它的延遲最低只有幾毫秒,每個topic可以分多個partition, consumer group 對partition進行consume操作。
可擴展性:kafka集群支持熱擴展
持久性、可靠性:消息被持久化到本地磁盤,并且支持數(shù)據(jù)備份防止數(shù)據(jù)丟失
容錯性:允許集群中節(jié)點失敗(若副本數(shù)量為n,則允許n-1個節(jié)點失?。?br> 高并發(fā):支持數(shù)千個客戶端同時讀寫

應(yīng)用場景

日志收集:一個公司可以用Kafka可以收集各種服務(wù)的log,通過kafka以統(tǒng)一接口服務(wù)的方式開放給各種consumer,例如hadoop、HBase、Solr等。
消息系統(tǒng):解耦和生產(chǎn)者和消費者、緩存消息等。
用戶活動跟蹤:Kafka經(jīng)常被用來記錄web用戶或者app用戶的各種活動,如瀏覽網(wǎng)頁、搜索、點擊等活動,這些活動信息被各個服務(wù)器發(fā)布到kafka的topic中,然后訂閱者通過訂閱這些topic來做實時的監(jiān)控分析,或者裝載到hadoop、數(shù)據(jù)倉庫中做離線分析和挖掘。
運營指標:Kafka也經(jīng)常用來記錄運營監(jiān)控數(shù)據(jù)。包括收集各種分布式應(yīng)用的數(shù)據(jù),生產(chǎn)各種操作的集中反饋,比如報警和報告。
流式處理:比如 Spark streaming 和 Flink

2、Kafka架構(gòu)

幾個核心概念:
1. Broker:Kafka服務(wù)器,負責(zé)消息存儲和轉(zhuǎn)發(fā)
2. Topic:消息類別,Kafka按照topic來分類消息
3. Partition:topic的分區(qū),一個 topic 可以包含多個 partition,topic消息保存在各個 partition上
4. Offset:消息在日志中的位置,可以理解是消息在 partition上的偏移量,也是代表該消息的唯一序號
5. Producer:消息生產(chǎn)者
6. Consumer:消息消費者
7. Consumer Group:消費者分組,每個Consumer必須屬于一個group
8. Replica: partition 的副本,保障 partition 的高可用。
9. Leader: replica 中的一個角色, producer 和 consumer 只跟 leader 交互。
10. Follower: replica 中的一個角色,從 leader 中復(fù)制數(shù)據(jù)。
11. Controller: kafka 集群中的其中一個服務(wù)器,用來進行 leader election 以及 各種 failover。
12. Zookeeper:保存著集群broker、topic、partition等meta數(shù)據(jù);另外,還負責(zé)broker 故障發(fā)現(xiàn),partition leader選舉,負載均衡等功能

3. Kafka高效數(shù)據(jù)存儲設(shè)計

partition的數(shù)據(jù)文件(offset,MessageSize,data)

partition中的每條Message包含了以下三個屬性:offset,MessageSize,data,其中offset表 示 Message 在這個 partition 中的偏移量,offset 不是該 Message 在 partition 數(shù)據(jù)文件中的實際存儲位置,而是邏輯上一個值,它唯一確定了partition中的一條Message,可以認為offset是partition中 Message 的 id;MessageSize 表示消息內(nèi)容 data 的大??;data 為 Message 的具體內(nèi)容。

數(shù)據(jù)文件分段segment(順序讀寫、分段命令、二分查找)

partition物理上由多個segment文件組成,每個segment大小相等,順序讀寫。每個segment 數(shù)據(jù)文件以該段中最小的offset命名,文件擴展名為.log。這樣在查找指定offset的Message的時候,用二分查找就可以定位到該Message在哪個segment數(shù)據(jù)文件中。

數(shù)據(jù)文件索引(分段索引、稀疏存儲)

Kafka 為每個分段后的數(shù)據(jù)文件建立了索引文件,文件名與數(shù)據(jù)文件的名字是一樣的,只是文件擴 展名為.index。index 文件中并沒有為數(shù)據(jù)文件中的每條 Message 建立索引,而是采用了稀疏存儲的方式,每隔一定字節(jié)的數(shù)據(jù)建立一條索引。這樣避免了索引文件占用過多的空間,從而可以 將索引文件保留在內(nèi)存中。

4.Kafka 生產(chǎn)者

負載均衡(partition會均衡分布到不同broker上)

由于消息 topic 由多個 partition 組成,且 partition 會均衡分布到不同 broker 上,因此,為了有效利用broker集群的性能,提高消息的吞吐量,producer可以通過隨機或者hash等方式,將消息平均發(fā)送到多個partition上,以實現(xiàn)負載均衡。

批量發(fā)送

是提高消息吞吐量重要的方式,Producer 端可以在內(nèi)存中合并多條消息后,以一次請求的方式發(fā)送了批量的消息給 broker,從而大大減少 broker 存儲消息的 IO 操作次數(shù)。但也一定程度上影響 了消息的實時性,相當于以時延代價,換取更好的吞吐量。

壓縮(GZIP或Snappy)

Producer端可以通過GZIP或Snappy格式對消息集合進行壓縮。Producer端進行壓縮之后,在 Consumer 端需進行解壓。壓縮的好處就是減少傳輸?shù)臄?shù)據(jù)量,減輕對網(wǎng)絡(luò)傳輸?shù)膲毫?,在對大?shù)據(jù)處理上,瓶頸往往體現(xiàn)在網(wǎng)絡(luò)上而不是CPU(壓縮和解壓會耗掉部分CPU資源)。

5. Kafka消費者

Consumer Group

同一 Consumer Group 中的多個 Consumer 實例,不同時消費同一個 partition,等效于隊列模式。
partition內(nèi)消息是有序的,Consumer通過pull方式消費消息。Kafka不刪除已消費的消息
對于partition,順序讀寫磁盤數(shù)據(jù),以時間復(fù)雜度O(1)方式提供消息持久化能力。

6、 Kafka 是如何實現(xiàn)高吞吐率的?

寫操作

1. 寫入內(nèi)核區(qū)內(nèi)存: 直接寫入os cache里,也就是寫入內(nèi)存中,接下來由操作系統(tǒng)自己決定什么時候把os cache里的數(shù)據(jù)真的刷入磁盤文件中,相當于寫內(nèi)存而不是寫磁盤;
2. 順序?qū)懀?/strong>僅僅將數(shù)據(jù)追加到文件的末尾,不是在文件的隨機位置來修改數(shù)據(jù)。

分發(fā)操作

3. 零拷貝: 直接讓操作系統(tǒng)的cache中的數(shù)據(jù)發(fā)送到網(wǎng)卡后傳輸給下游的消費者,中間跳過了兩次拷貝數(shù)據(jù)的步驟,Socket緩存中僅僅會拷貝一個描述符過去,不會拷貝數(shù)據(jù)到Socket緩存。

4. 批量壓縮:Producer端可以通過GZIP或Snappy格式對消息集合進行壓縮。Producer端進行壓縮之后,在 Consumer 端需進行解壓。壓縮的好處就是減少傳輸?shù)臄?shù)據(jù)量,減輕對網(wǎng)絡(luò)傳輸?shù)膲毫?,在對大?shù)據(jù)處理上,瓶頸往往體現(xiàn)在網(wǎng)絡(luò)上而不是CPU(壓縮和解壓會耗掉部分CPU資源)。

5. 批量發(fā)送: 提高消息吞吐量重要的方式,Producer 端可以在內(nèi)存中合并多條消息后,以一次請求的方式發(fā)送了批量的消息給 broker,從而大大減少 broker 存儲消息的 IO 操作次數(shù)。但也一定程度上影響 了消息的實時性,相當于以時延代價,換取更好的吞吐量。

存儲

6. 分區(qū)patition分段segment + 索引index

分布式系統(tǒng)分區(qū)分桶的設(shè)計思想:Kafka 的 message 是按 topic 分類存儲的,topic 中的數(shù)據(jù)又是按照一個一個的 partition 即分區(qū)存儲到不同broker節(jié)點。每個partition對應(yīng)了操作系統(tǒng)上的一個文件夾,partition實際上又是按照segment分段存儲的。為了進一步的查詢優(yōu)化,Kafka又默認為分段后的數(shù)據(jù)文件建立了索引文件,就是文件系統(tǒng)上的.index文件。
這種分區(qū)分段+索引的設(shè)計,不僅提升了數(shù)據(jù)讀取的效率,同時也提高了數(shù)據(jù)操作的并行度。

7、Kafka 的高可靠性是怎么實現(xiàn)的?

Topic 分區(qū)副本:提高容錯

從 0.8.0 版本開始Kafka引入了分區(qū)副本,一般設(shè)置為3。Kafka 的分區(qū)多副本架構(gòu)是 Kafka 可靠性保證的核心,把消息寫入多個副本可以使 Kafka 在發(fā)生崩潰時仍能保證消息的持久性。

在眾多的分區(qū)副本里面有一個副本是 Leader,其余的副本是 follower,所有的讀寫操作都是經(jīng)過 Leader 進行的,同時 follower 會定期地去 leader 上的復(fù)制數(shù)據(jù)。當 Leader 掛了的時候,其中一個 follower 會重新成為新的 Leader。通過分區(qū)副本,引入了數(shù)據(jù)冗余,同時也提供了 Kafka 的數(shù)據(jù)可靠性。

Producer 往 Broker 發(fā)送消息:消息確認機制保證可靠性

通過 Producer 往 Kafka 對應(yīng)的主題發(fā)送消息時, Kafka 在 Producer 里面提供了消息確認機制來保證可靠性。即通過配置來決定消息發(fā)送到對應(yīng)分區(qū)的幾個副本才算消息發(fā)送成功。

Leader 選舉:當Leader掛點之后重新選舉出新Leader

在ISR(in-sync replicas)列表中,每個分區(qū)的 leader 會維護一個 ISR 列表,ISR 列表里面就是 follower 副本的 Borker 編號,只有跟得上 Leader 的 follower 副本才能加入到 ISR 里面。所以當 Leader 掛掉了,而且 unclean.leader.election.enable=false 的情況下,Kafka 會從 ISR 列表中選擇第一個 follower 作為新的 Leader,因為這個分區(qū)擁有最新的已經(jīng) committed 的消息。通過這個可以保證已經(jīng) committed 的消息的數(shù)據(jù)可靠性。

8、Kafka 的數(shù)據(jù)一致性是怎么實現(xiàn)的?

一致性定義:若某條消息對Consumer可見,那么即使Leader宕機了,在新Leader上數(shù)據(jù)依然可以被讀到

HighWaterMark簡稱HW:Partition的高水位,取一個partition對應(yīng)的ISR中最小的LEO作為HW,消費者最多只能消費到HW所在的位置,另外每個replica都有highWatermark,leader和follower各自負責(zé)更新自己的highWatermark狀態(tài),highWatermark <= leader. LogEndOffset

對于Leader新寫入的msg,Consumer不能立刻消費,Leader會等待該消息被所有ISR中的replica同步后,更新HW,此時該消息才能被Consumer消費,即Consumer最多只能消費到HW位置

這樣就保證了如果Leader Broker失效,該消息仍然可以從新選舉的Leader中獲取。對于來自內(nèi)部Broker的讀取請求,沒有HW的限制。同時,F(xiàn)ollower也會維護一份自己的HW,F(xiàn)olloer.HW = min(Leader.HW, Follower.offset)

9.Kafka 是如何做到消息的有序性?

kafka 中的每個 partition 中的消息在寫入時都是有序的,而且單獨一個 partition 只能由一個消費者去消費,可以在里面保證消息的順序性。但是分區(qū)之間的消息是不保證有序的。

10.Kafka為什么要分區(qū)?

分區(qū)對于 Kafka 集群的好處是:實現(xiàn)負載均衡。
分區(qū)對于消費者來說,可以提高并發(fā)度,提高效率。

11、ISR、OSR、AR 是什么?

這些都是關(guān)于副本的術(shù)語。
ISR:In-Sync Replicas 副本同步隊列
OSR:Out-of-Sync Replicas
AR:Assigned Replicas 所有副本

ISR是由leader維護,follower從leader同步數(shù)據(jù)有一些延遲,超過相應(yīng)的閾值會把 follower 剔除出 ISR, 存入OSR(Out-of-Sync Replicas )列表,新加入的follower也會先存放在OSR中。AR = ISR + OSR。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容