天天看點

Java筆記-----(8)消息隊列-Kafka(1)消息隊列Kafka(2)Kafka中的核心概念(3)Kafka中的副本機制(4)Kafka的檔案存儲機制

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