Kafka架構詳細深入

Kafka工作流程及文件存儲機制

image.png
Kafka中消息是以topic進行分類的,生產者生產消息,消費者消費消息,都是面向topic的。
topic是邏輯上的概念,而partition是物理上的概念,每個partition對應於一個log文件,該log文件中存儲的就是producer生產的數據。Producer生產的數據會被不斷追加到該log文件末端,且每條數據都有自己的offset。消費者組中的每個消費者,都會實時記錄自己消費到了哪個offset,以便出錯恢復時,從上次的位置繼續消費。
image.png
由於生產者生產的消息會不斷追加到log文件末尾,爲防止log文件過大導致數據定位效率低下,Kafka採取了分片和索引機制,將每個partition分爲多個segment。每個segment對應兩個文件——“.index”文件和“.log”文件。這些文件位於一個文件夾下,該文件夾的命名規則爲:topic名稱+分區序號。例如,first這個topic有三個分區,則其對應的文件夾爲first-0,first-1,first-2。

00000000000000000000.index
00000000000000000000.log
00000000000000170410.index
00000000000000170410.log
00000000000000239430.index
00000000000000239430.log

index和log文件以當前segment的第一條消息的offset命名。下圖爲index文件和log文件的結構示意圖
image.png
“.index”文件存儲大量的索引信息,“.log”文件存儲大量的數據,索引文件中的元數據指向對應數據文件中message的物理偏移地址。

Kafka 高效讀寫數據

順序寫磁盤

Kafka的producer生產數據,要寫入到log文件中,寫的過程是一直追加到文件末端,爲順序寫。官網有數據表明,同樣的磁盤,順序寫能到到600M/s,而隨機寫只有100k/s。這與磁盤的機械機構有關,順序寫之所以快,是因爲其省去了大量磁頭尋址的時間。

零複製技術

image.png

Zookeeper在Kafka中的作用

Kafka集羣中有一個broker會被選舉爲Controller,負責管理集羣broker的上下線,所有topic的分區副本分配和leader選舉等工作。
Controller的管理工作都是依賴於Zookeeper的。
以下爲partition的leader選舉過程:
image.png

Flume對接Kafka

  1. 配置flume(flume-kafka.conf)
# define
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# source
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F -c +0 /opt/module/datas/flume.log
a1.sources.r1.shell = /bin/bash -c

# sink
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.kafka.bootstrap.servers = hadoop102:9092,hadoop103:9092,hadoop104:9092
a1.sinks.k1.kafka.topic = first
a1.sinks.k1.kafka.flumeBatchSize = 20
a1.sinks.k1.kafka.producer.acks = 1
a1.sinks.k1.kafka.producer.linger.ms = 1

# channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# bind
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
  1. 啓動kafkaIDEA消費者
  2. 進入flume根目錄下,啓動flume
$ bin/flume-ng agent -c conf/ -n a1 -f jobs/flume-kafka.conf
  1. 向 /opt/module/datas/flume.log裏追加數據,查看kafka消費者消費情況
$ echo hello >> /opt/module/datas/flume.log

Kafka監控

Kafka Monitor

  1. 上傳jar包KafkaOffsetMonitor-assembly-0.4.6.jar到集羣
  2. 在/opt/module/下創建kafka-offset-console文件夾
  3. 將上傳的jar包放入剛創建的目錄下
  4. 在/opt/module/kafka-offset-console目錄下創建啓動腳本start.sh,內容如下:
#!/bin/bash
java -cp KafkaOffsetMonitor-assembly-0.4.6-SNAPSHOT.jar \
com.quantifind.kafka.offsetapp.OffsetGetterWeb \
--offsetStorage kafka \
--kafkaBrokers hadoop102:9092,hadoop103:9092,hadoop104:9092 \
--kafkaSecurityProtocol PLAINTEXT \
--zk hadoop102:2181,hadoop103:2181,hadoop104:2181 \
--port 8086 \
--refresh 10.seconds \
--retain 2.days \
--dbName offsetapp_kafka &
  1. 在/opt/module/kafka-offset-console目錄下創建mobile-logs文件夾
mkdir /opt/module/kafka-offset-console/mobile-logs
  1. 啓動KafkaMonitor
./start.sh
  1. 登錄頁面hadoop102:8086端口查看詳情

Kafka Manager

  1. 上傳壓縮包kafka-manager-1.3.3.15.zip到集羣
  2. 解壓到/opt/module
  3. 修改配置文件conf/application.conf
kafka-manager.zkhosts="kafka-manager-zookeeper:2181"
修改爲:
kafka-manager.zkhosts="hadoop102:2181,hadoop103:2181,hadoop104:2181"
  1. 啓動kafka-manager
bin/kafka-manager
  1. 登錄hadoop102:9000頁面查看詳細信息
    關注微信公衆號
    簡書:https://www.jianshu.com/u/0278602aea1d
    CSDN:https://blog.csdn.net/u012387141
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章