1. 程式人生 > >初識Kafka

初識Kafka

第一個 物理 生產 應用場景 完全 mes 不同的 規則 cnblogs

Kafka是什麽?

  是一個分布式消息系統
  類JMS消息隊列,結合JMS中的兩種模式,可以有多個消費者主動拉取數據,在JMS中只有點對點模式才有消費者主動拉取數據。
  kafka是一個生產-消費模型。

一些名詞:
  Producer:生產者,只負責數據生產,生產者的代碼可以集成到任務系統中。
數據的分發策略由producer決定,默認是defaultPartition。
  Consumer:消費者,訂閱消息並處理發布消息。
  Broker:當前服務器上的Kafka進程,相當於中介,一個Kafka節點就是一個broker,只管數據存儲,不管是誰生產,不管是誰消費。
在集群中每個broker都有一個唯一brokerid,不得重復。

  Topic:Kafka中的Message是以topic為基本單位組織的,不同的topic之間是相互獨立的。每一個topic又可以分成幾個不同的partition
(每一個topic有幾個partition是在創建topic時指定的),每一個partition存儲一部份Message。
  Partition:topic物理上的分組,同一個topic下有多個不同partition,每個partition為一個目錄,partition物理上由多個segment組成(index,log)
每個partition可以設置多個副本(replication-factor 1),會從所有的副本中選取一個leader出來。所有讀寫操作都是通過leader來進行的。
特別強調,和mysql中主從有區別,mysql做主從是為了讀寫分離,在kafka中讀寫操作都是leader。
  每個partition是一個有序的隊列,partiton命名規則為topic名稱+有序序號,第一個partiton序號從0開始,序號最大值為partitions數量減1。如果是多broker分布情況:參考http://blog.csdn.net/lizhitao/article/details/41778193
  Segment:Partition物理上由多個segment組成,一個segment有默認的大小是1G。
segment file由2大部分組成,分別為index file和data file,此2個文件一一對應,成對出現,後綴".index"和“.log”分別表示為segment索引文件、數據文件。
  Message:Partition中的每條Message由offset來表示它在這個partition中的偏移量,這個offset不是該Message在partition數據文件中的實際存儲位置,而是邏輯上1個值,它唯一肯定了partition中的一條Message。因此,可以認為offset是partition中Message的id。partition中的每條Message包括了以下3個屬性:offset(long型),MessageSize(int32,表示data有多大),data(message的具體內容)
  ConsumerGroup:數據消費者組,ConsumerGroup可以有多個,每個ConsumerGroup消費的數據都是一樣的。可以把多個consumer線程劃分為一個組,組裏面所有成員共同消費一個topic的數據,組員之間不能重復消費。

Kafka如何保證數據的完全生產

  ack機制:broker表示發來的數據已確認接收無誤,表示數據已經保存到磁盤。
  0:不等待broker返回確認消息
  1:等待topic中某個partition leader保存成功的狀態反饋
  -1:等待topic中某個partition 所有副本都保存成功的狀態反饋

broker如何保存數據

  在理論環境下,broker按照順序讀寫的機制,可以每秒保存600M的數據。主要通過pagecache機制,盡可能的利用當前物理機器上的空閑內存來做緩存。
  當前topic所屬的broker,必定有一個該topic的partition,partition是一個磁盤目錄。partition的目錄中有多個segment組合(index,log)

consumerGroup的組員和partition之間如何做負載均衡

  最好是一一對應,一個partition對應一個consumer。
  如果consumer的數量過多,必然有空閑的consumer。
  算法:
    假如topic1,具有如下partitions: P0,P1,P2,P3
    加入group中,有如下consumer: C1,C2
    首先根據partition索引號對partitions排序: P0,P1,P2,P3
    根據consumer.id排序: C0,C1
    計算倍數: M = [P0,P1,P2,P3].size / [C0,C1].size,本例值M=2(向上取整)
    然後依次分配partitions: C0 = [P0,P1],C1=[P2,P3],即Ci = [P(i * M),P((i + 1) * M -1)]

如何保證kafka消費者消費數據是全局有序的

  偽命題
  如果要全局有序的,必須保證生產有序,存儲有序,消費有序。
  由於生產可以做集群,存儲可以分片,消費可以設置為一個consumerGroup,要保證全局有序,就需要保證每個環節都有序。
  只有一個可能,就是一個生產者,一個partition,一個消費者。這種場景和大數據應用場景相悖。

參考文檔

  kafka中文教程

  Kafka Shell基本命令(包括topic的增刪改查)

初識Kafka