Java筆記-----(8)消息隊列-Kafka
- (1)消息隊列Kafka
-
- (1.1)Kafka可以實作**消息的快速持久化**的原因
- (1.2)磁盤的操作一般情況下是遠遠低于對記憶體的操作效率,Kafka使用磁盤存儲,為什麼會具有高性能的特點?
- (2)Kafka中的核心概念
- (3)Kafka中的副本機制
-
- (3.1)ISR(In-Sync-Replica)集合
- (4)Kafka的檔案存儲機制
消息隊列的使用可以實作生産者和消費者的解耦,實作異步通信過載保護等功能。
(1)消息隊列Kafka
Kafka是一個消息隊列,可以實作釋出訂閱模式,在異步通信或者生産者和消費者需要解耦合的場景中經常使用,可以對資料流進行處理等。
Kafka的特性如下所示:
- Kafka支援消息的快速持久化
- 支援批量讀寫消息
- 支援消息分區,并且支援線上增加分區,提高了并發能力
- 支援為每個分區建立多個副本
(1.1)Kafka可以實作消息的快速持久化的原因
- KafKa将消息儲存在磁盤中,并且讀寫磁盤的方式是順序讀寫,避免了随機讀寫磁盤(尋道時間過長)導緻的性能瓶頸。
- 磁盤的順序讀寫速度超過記憶體随機讀寫。
(1.2)磁盤的操作一般情況下是遠遠低于對記憶體的操作效率,Kafka使用磁盤存儲,為什麼會具有高性能的特點?
-
順序讀寫磁盤:
消息在磁盤中的方式是順序讀寫的,磁盤的順序讀寫速度超過記憶體随機讀寫。
-
頁緩存:
頁緩存是作業系統實作的一種主要的磁盤緩存,以此用來減少對磁盤I/O 的操作。具體就是把磁盤中的資料緩存到記憶體中,把對磁盤的通路變為對記憶體的通路。當然,也會存在磁盤髒頁,以及合适時機會進行刷盤操作。
-
零拷貝:
使用零拷貝( Zero-Copy )技術來進一步提升Kafka性能。零拷貝是指将資料直接從磁盤檔案複制到網卡裝置中,而不需要經由應用程式之手。零拷貝大大提高了應用程式的性能,減少了核心和使用者模式之間的上下文切換。
(2)Kafka中的核心概念
-
生産者(Producer):
生産消息,并且按照一定的規則(分區配置設定規則)推送到Topic的分區中。
-
消費者(Consumer):
從Topic中拉取消息并且進行消費,消費者自行維護消費消息的位置(offset)。
-
主題(Topic):
存儲消息的邏輯概念,是一個消息集合,Kafka根據topic對消息進行歸類,釋出到Kafka叢集的每條消息都需要指定一個topic。
-
分區(partition):
每個Topic可以劃分為多個分區,每個消息在分區中都會有一個唯一編号offset,kafka通過offset保證消息在分區中的順序,同一Topic的不同分區可以配置設定在不同的Broker上,partition以檔案的形式存儲在檔案系統中。
-
副本(replica):
KafKa對消息進行了備援備份,每個分區有多個副本,每個副本中包含的消息是“一樣”的。每個副本中都會選舉出一個Leader副本,其餘為Follower副本,Follower副本僅僅是将資料從Leader副本拉到本地,然後同步到自己的Log中。
-
消費者組(Consumer Group):
每個consumer都屬于一個consumer group,每條消息隻能被consumer group中的一個Consumer消費,但可以被多個consumer group消費。
-
Broker:
一個單獨的server就是一個Broker,主要用來接收生産者發過來的消息,配置設定offset,并且儲存到磁盤中。
-
Cluster & Controller:
多個Broker可以組成一個Cluster叢集,每個叢集選舉一個Broker來作為Controller,充當指揮中心。Controller負責管理分區的狀态,管理每個分區的副本狀态,監聽ZooKeeper中資料的變化等工作。
-
日志壓縮與保留政策:
不管消費者是否已經消費了消息,Kafka都會儲存這些消息(持久化到磁盤),通過配置相應的保留政策,定時删除陳舊的消息。所謂日志壓縮,就是定時進行相同key值得合并,隻保留最新的Key-Value值。
(3)Kafka中的副本機制
使用副本機制來進行備援備份
在分布式的存儲中,進行備援備份是一種常見的設計,主要的設計方案有同步複制和異步複制。
-
同步複制:
當所有的Follower副本都将消息複制完成,這條消息才會被認為是送出完成,一旦有一個Follower副本出現故障,就會導緻消息無法送出,極大的影響到了系統的性能。
-
異步複制:
當Leader副本接收到生産者發送的消息後就認為目前消息送出成功。Follower副本異步的從Leader副本同步消息,但是不可以保證同步速度,當Leader副本突然當機的時候,可能Follower副本中的消息落後太多,導緻消息的丢失。
考慮到同步複制和異步複制的優缺點,Kafka引入了ISR集合。
(3.1)ISR(In-Sync-Replica)集合
可用副本集合,ISR集合表示目前“可用”且消息量與Leader相差不多的副本集合,需要滿足如下條件:
- 副本所在節點必須維持着與ZooKeeper的連接配接。
- 副本最後一條資訊的offset與Leader副本的最後一條消息的offset之間的內插補點不能超過指定的門檻值。
HW和LEO标志:
- HW(HighWatermark)表示高水位,标記了一個特殊的offset,當消費者處理消息的時候,隻能拉取到HW之前的消息。HW也是由Leader副本管理的。
- LEO(Log End Offset)是所有副本都會有的一個offset标記。
ISR、HW和LEO的工作配合機制:
- producer向此分區中推送消息
- Leader副本将消息追加到Log中,并且遞增其LEO
- Follower副本從Leader副本中拉取消息進行同步
- Follower副本将消息更新到本地Log中,并且遞增其LEO
- 當ISR集合中的所有副本都完成了對offset的消息同步,Leader副本會遞增其HW
優勢:
- 同步複制會導緻高延遲,異步複制可能會造成消息的丢失。
- KafKa引入的ISR集合解決了同步複制和異步複制的缺點。
- 當Follower副本延遲過高時,将會被踢出ISR集合,避免了高延遲的Follower副本影響整個KafKa叢集性能。
- 當Leader副本所在的Broker當機,會優先将ISR集合中的Follower副本選舉為Leader。
(4)Kafka的檔案存儲機制
Kafka中消息是以
topic
進行分類的,生産者通過
topic
向
Kafka broker
發送消息,消費者通過
topic
讀取資料。
然而
topic
在實體層面又能以
partition
為分組,一個
topic
可以分成若幹個
partition
,
partition
還可以細分為
segment
,一個
partition
實體上由多個
segment
組成。
在
server.properties
中可以設定檔案的存儲位置,預設為
log.dirs=/tmp/kafka-logs
。當我們建立一個
topic
的時候,可以在
/tmp/kafka-logs
目錄中看到對應分區個數的目錄數。在Kafka檔案存儲中,同一個topic下有多個不同的partition,每個partiton為一個目錄,partition的名稱規則為:topic名稱+有序序号,第一個序号從0開始計,最大的序号為partition數量減1