1. 程式人生 > >分散式訊息系統:Kafka(一)簡介

分散式訊息系統:Kafka(一)簡介

1、簡介

  kafka是用於構建實時資料管道和資料流的應用程式。具有實時橫向擴充套件、高吞吐量、支援大量堆積具有容錯性和速度快等特點。它是一個高效能分散式訊息系統。通常一個分散式流資料平臺它具有三個特點:

  1. 釋出和訂閱功能,類似於訊息系統
  2. 以容錯的方式記錄流
  3. 處理流

Kafka通常用於構建在系統或應用之間的實時資料流管道、構建實時流應用程式用於轉換和響應資料流。

1.1 簡介

  kafka對訊息儲存時根據Topic進行歸類,傳送訊息者成為Producer,訊息接受者成為Consumer,此外kafka叢集有多個kafka例項組成,每個例項server成為broker。無論是kafka叢集,還是producer和consumer都依賴於zookeeper來保證系統可用性叢集儲存一些meta資訊。
這裡寫圖片描述


主要特點:

  1. 同時為釋出和訂閱提供高吞吐量。據瞭解,Kafka每秒可以生產約25萬訊息(50 MB),每秒處理55萬訊息(110 MB)
  2. 可進行持久化操作。將訊息持久化到磁碟,因此可用於批量消費,例如ETL,以及實時應用程式。通過將資料持久化到硬碟以及複製防止資料丟失。
  3. 分散式系統,易於向外擴充套件。所有的生產者和消費者都會有多個,均為分散式的。無需停機即可擴充套件機器。
  4. 訊息被處理的狀態是在消費端維護,而不是由伺服器端維護。當失敗時能自動平衡。
  5. 支援線上和離線的場景。

1.2 基本概念

  主題(topic):就是訊息的分類,生產者將訊息傳送到特定主題,消費者訂閱該主題或者主題的分割槽來進行消費。

  訊息:就是資料,一個固定長度的訊息頭和一個可變長度的訊息體組成。

  分割槽和副本:一個主題可以分成多個分割槽,每個分割槽由一系列有序、不可變的訊息組成,是一個有序佇列。每個分割槽在物理上對應一個資料夾,分割槽的命名規則為主題名稱後接“-”連線符,之後再接分割槽編號,分割槽編號從0開始,表示第一個分割槽。如下圖主題3有2個分割槽,編號0、1;
這裡寫圖片描述
  每個分割槽中只有一個副本對外提供服務,可以看到上圖的Leader標示的那樣。我們通過zookeeper檢視,如下圖:
這裡寫圖片描述
欄位的含義:

Name Academy
controller_epoch 用於記錄控制器傳送變更次數。每一個代理例項化的時候都會啟動一個KafkaController,並將代理的brokerId註冊到zookeeper上,控制器主要負責主題的建立、刪除、分割槽和副本的變化以及代理的故障轉移。該值初始值為0,每變化一次增加1,客戶端向控制器傳送請求要帶上這個值,如果小於該值表示請求時過期的,如果大於則說明以及有了新的控制器,這個值是為了保證機器控制器的唯一性。
leader 該主題的這個分割槽的當前Leader是誰,這裡記錄的是brokerId,也就是代理的ID。
version 版本
leader_epoch 分割槽Leader更新次數,這個是相對分割槽而言。
isr 表示該分割槽有幾個副本,這裡顯示一個列表,列表元素個數表示副本個數,元素值表示它的副本分佈在哪些brokerId的代理上

Leader副本和Follower副本:同一個分割槽的多個副本目的就是為了冗餘提高可用性,所以就必須保證副本的一致性,那麼Kafka會選擇分割槽內的一個副本作為Leader副本,而其他副本作為Follower副本,只有Leader副本處理讀寫請求。Follower副本只是從Leader上覆制資料。

偏移量:釋出到分割槽的訊息會追加到日誌檔案的尾部,每條訊息在日誌檔案中的位置都會對應一個按序遞增的偏移量。不過偏移量不表示訊息在磁碟上的位置,而且kafka幾乎不允許對訊息進行隨機讀寫,消費者可以指定偏移量的的起始位置進行消費。

日誌段:日誌又被劃分為多個日誌段,日誌段是kafka日誌物件分片的最小單位。與日誌物件一樣,日誌段也是邏輯概念。一個日誌段對應磁碟上一個具體日誌檔案和兩個索引檔案,日誌以.log結尾,兩個索引以.index和.timeindex結尾,表示訊息偏移量索引檔案和訊息時間戳索引檔案。

代理:其實就是Kafka服務,一個Kafka服務叫做一個例項,也就是一個代理。一個叢集通常包含多臺代理,每個代理有一個非負整數的id,且在整個叢集中id值是唯一的。

生產者:也就是傳送訊息的客戶端

消費者和消費者組:消費者通過拉的方式獲取資料,每一個消費者都屬於一個消費者組,我們可以為每個消費者指定一個組。如果不指定則屬於預設消費者組test-consumer-group。同時每個消費者也有一個唯一id,如果沒有指定則kafka會為其自動生成一個。同一個主題的訊息只能被消費者組中的一個消費者訊息,但不同消費者組中的消費者可以消費這條訊息。

ISR:Kafka在Zookeeper中動態維護一個ISR,也就是儲存同步的副本列表,該列表中儲存的是與Leader副本保持訊息同步的所有副本對應的代理節點id。如果一個Follower宕機或者其落後太多,則該Follower副本節點將從ISR列表中移除。

1.3 Topics/logs

  一個Topic可以認為是一類訊息,每個topic將被分成多個partition(區),每個partition在儲存層面是append log檔案。任何釋出到此partition的訊息都會被直接追加到log檔案的尾部,每條訊息在檔案中的位置稱為offset(偏移量),offset為一個long型數字,它是唯一標記一條訊息。它唯一的標記一條訊息。
這裡寫圖片描述
這裡寫圖片描述

1.4 在kafka中為什麼幾乎不允許對訊息進行“隨機讀寫”

  原因:每條訊息在檔案中的位置稱為offset(偏移量),offset為一個long型數字。kafka並沒有提供其他額外的索引機制來儲存offset。
  kafka和JMS(Java Message Service)實現(activeMQ)不同的是:即使訊息被消費,訊息仍然不會被立即刪除。日誌檔案將會根據broker中的配置要求,保留一定的時間之後刪除;比如log檔案保留2天,那麼兩天後,檔案會被清除,無論其中的訊息是否被消費.kafka通過這種簡單的手段,來釋放磁碟空間,以及減少訊息消費之後對檔案內容改動的磁碟IO開支.
  對於consumer而言,它需要儲存消費訊息的offset,對於offset的儲存和使用,有consumer來控制;當consumer正常消費訊息時,offset將會”線性”的向前驅動,即訊息將依次順序被消費.事實上consumer可以使用任意順序消費訊息,它只需要將offset重置為任意值。
  partitions的設計目的有多個.最根本原因是kafka基於檔案儲存.通過分割槽,可以將日誌內容分散到多個server上,來避免檔案尺寸達到單機磁碟的上限,每個partiton都會被當前server(kafka例項)儲存;可以將一個topic切分多任意多個partitions,來訊息儲存/消費的效率.此外越多的partitions意味著可以容納更多的consumer,有效提升併發消費的能力.

1.5 Distribution

  一個Topic的多個partitions,被分佈在kafka叢集中的多個server上;每個server(kafka例項)負責partitions中訊息的讀寫操作;此外kafka還可以配置partitions需要備份的個數(replicas),每個partition將會被備份到多臺機器上,以提高可用性.
  基於replicated方案,那麼就意味著需要對多個備份進行排程;每個partition都有一個server為”leader”;leader負責所有的讀寫操作,如果leader失效,那麼將會有其他follower來接管(成為新的leader);follower只是單調的和leader跟進,同步訊息即可..由此可見作為leader的server承載了全部的請求壓力,因此從叢集的整體考慮,有多少個partitions就意味著有多少個”leader”,kafka會將”leader”均衡的分散在每個例項上,來確保整體的效能穩定.

Producers
  Producer將訊息釋出到指定的Topic中,同時Producer也能決定將此訊息歸屬於哪個partition;比如基於”round-robin”方式或者通過其他的一些演算法等.

Consumers
  本質上kafka只支援Topic.每個consumer屬於一個consumer group;反過來說,每個group中可以有多個consumer.傳送到Topic的訊息,只會被訂閱此Topic的每個group中的一個consumer消費.
  如果所有的consumer都具有相同的group,這種情況和queue模式很像;訊息將會在consumers之間負載均衡.
  如果所有的consumer都具有不同的group,那這就是”釋出-訂閱”;訊息將會廣播給所有的消費者.
  在kafka中,一個partition中的訊息只會被group中的一個consumer消費;每個group中consumer訊息消費互相獨立;我們可以認為一個group是一個”訂閱”者,一個Topic中的每個partions,只會被一個”訂閱者”中的一個consumer消費,不過一個consumer可以消費多個partitions中的訊息.kafka只能保證一個partition中的訊息被某個consumer消費時,訊息是順序的.事實上,從Topic角度來說,訊息仍不是有序的.
  kafka的設計原理決定,對於一個topic,同一個group中不能有多於partitions個數的consumer同時消費,否則將意味著某些consumer將無法得到訊息.

Guarantees

  1) 傳送到partitions中的訊息將會按照它接收的順序追加到日誌中

  2) 對於消費者而言,它們消費訊息的順序和日誌中訊息順序一致.

  3) 如果Topic的”replicationfactor”為N,那麼允許N-1個kafka例項失效.

相關推薦

分散式訊息系統Kafka簡介

1、簡介   kafka是用於構建實時資料管道和資料流的應用程式。具有實時橫向擴充套件、高吞吐量、支援大量堆積具有容錯性和速度快等特點。它是一個高效能分散式訊息系統。通常一個分散式流資料平臺它具有三個特點: 釋出和訂閱功能,類似於訊息系統 以容錯的方式記錄

分散式訊息系統Kafka應用Spring Boot實現消費者和生產者

一、專案 (1)新建Spring Boot專案,參考以下建立過程; 建立一個Spring Boot專案 (2)pom檔案中新增spring-kafka框架 <dependency> <groupId>org.springf

分散式訊息系統Kafka偏移量

5、偏移量提交 5.1 偏移量 (1)新舊版本偏移量的變化   在Kafka0.9版本之前消費者儲存的偏移量是在zookeeper中/consumers/GROUP.ID/offsets/TOPIC.NAME/PARTITION.ID。新版消費者不在儲

分散式訊息系統Kafka

Kafka是分散式釋出-訂閱訊息系統。 它最初由LinkedIn公司開發,之後成為Apache專案的一部分。Kafka是一個分散式的,可劃分的,冗餘備份的永續性的日誌服務。它主要用於處理活躍的流式資料。 原文:http://blog.jobbole.com/75328/

分散式檔案系統NFS3

四、NFS NFS(Sun Network File System)最初為SUN(不知道有這個公司?上百度或google查檢視)提供,後移植到Linux等其他平臺。其介面都已經標準化,如NFS version 3介面由RC1813定義,NFS version 4介面由 RF

大資料系列之分散式釋出訂閱訊息系統KafkaKafka簡介,組成,叢集安裝

1.Kafka簡介   Kafka如同JMS(Java Message Service)一樣,是一箇中間件,在異構系統間通訊,為不同的系統之間提供服務。我們知道JMS通過佇列(一對一)與主題(一對多)兩種形式提供服務,而Kafka則通過主題(topic),來給一組消費者提供

ArcGIS Engine 系統開發設計簡單的地圖讀取、展示

終於到暑假了。。。開始認真整理整理相關學習的心得體會咯~ 先把很久之前挖的關於C# 二次開發的坑給填上好了~ 這次先計劃用一個月把C# ArcEngine 10.0相關開發的學習心得給釋出出來好啦~ 第一部分就是最簡單的helloworld了:掌握使用控制元件建立簡單的GIS應用程

分散式事務 解決資料一致性事務原則與實現事務、sql事務

事務: 定義:       是以一種可靠、一致的方式,訪問和操作資料庫中資料的程式單元。 原則:      *a、 原子性   * b、一致性  * c、隔離性 &nbs

大資料生態系統基礎 HBASEHBASE 介紹及安裝、配置

一、介紹        Apache HBase是Hadoop資料庫,一個分散式的、可伸縮的大型資料儲存。        當您需要隨機的、實時的讀/寫訪問您的大資料時,請使用Apache HBase。這個專案的目標是承載非常大的表——數十億行X百萬列的列——執行在在商用硬體

訊息佇列kafka--基本使用

一、kafka簡介 kafka是一種高吞吐量的訊息佇列。 二、kafka特點 1、輕量級,比如activeMQ等訊息佇列更輕量級。 2、訊息在kafka中,無論訊息是否被消費,都不會被刪除,會保留所有訊息。 3、訊息刪除的策略,基於時間。在config/server.pro

分散式系統閱讀筆記-----分散式系統的特徵

1)引言 從今天開始,我將會開始學習分散式系統的一些理論知識,全方面的重新學習分散式的各個技術點,所以選用了原版本的英文教材<<Dstributed Sysytems Concepts A

C# Queue與RabbitMQ的愛恨情仇文末附原始碼Q與MQ訊息佇列簡單應用

首先我們簡單瞭解一下什麼堆、棧、佇列。 堆是在程式執行時,而不是在程式編譯時,申請某個大小的記憶體空間。即動態分配記憶體,對其訪問和對一般記憶體的訪問沒有區別。 棧就是一個容器,後放進去的先拿出來,它下面本來有的東西要等它出來之後才能出來。(先進後出or後進先出) 佇列只能在隊頭做刪除操作,在隊尾做插入操作.

若依管理系統RuoYi-Vue專案啟動和選單建立

若依管理系統應該是國內最受歡迎的完全開源的後端管理系統了吧,看看gitee上的star數量,著實驚人。若依系統有很多個版本 | 版本 | gitee地址 | 說明

深入淺出CSSDiv

指定 增加 src 深入 lock alt 舉例 gin width 這個系列是學習筆記,簡明記錄結論性的知識。 新建一個層時,border為零,margin為0,padding為0,如果不指定寬度(width),則自動100%填充父元素。 三、層與父元素的關系 1.

win10系統docker學習——docker安裝

tle png 問題: 方案 start htm 完成後 系統 mage windows系統中目前有兩種安裝docker的方式,分別為boot2docker和docker toolbox。按照官方說明和實際安裝過程來講,推薦使用docker toolbox方

項目管理系統的實施

項目管理系統 項目交付過程 項目管理系統是IT服務公司,軟件公司,系統集成公司或者是其他依賴軟硬件的高科技公司或組織必須的保證組織正常運營,成熟發展,健康生長的必要企業內部運營性平臺。要做好項目管理系統實施,首先要做好項目管理評估。在CMMi或者其他項目成熟度管理體系中,叫做過程評估。而其中第一步要建

Android系統啟動流程解析init進程啟動過程

option 寫入 android change failed miss 通知 target sna 前言 作為“Android框架層”這個大系列中的第一個系列,我們首先要了解的是Android系統啟動流程,在這個流程中會涉及到很多重要的知識點,這個系列我們就來一一講解它們

對賬系統產品設計

例如 產品經理 表模塊 放心 比較 div 第一篇 訂單 系列 我是做技術的,為什麽會要寫產品設計呢?就像一句俗話“久病成醫”,當你負責一個系統足夠久了,可能你就懂的比較多了。我想把自己遇見的聽見的做一個系列,算是對自己過去工作的總結。 本文的基調是,少專業術語,全用大白話

linux系統程序安裝rpm工具

erl fields program 軟件 方法 owin lib 直接 源碼安裝 linux系統下程序安裝主要采用三種方式:1、rpm,有點類似.msi 和.exe比較類似,軟件包(相當於windows的某個程序的所有文件)的安裝路徑和文件名稱基本是固定的,但是他不會安裝

linux系統程序安裝yum工具

sync 內容 sim lean provide for 就是 grep 大型 yum安裝工具類似appstore,運用yum工具可以方便的下載所需的程序,同時yum工具會自動檢查程序的依賴關系,並安裝相應的依賴包,有點像windows的某些大型軟件安裝程序會自動檢查幫你安