天天看點

Kafka(二)-- 安裝配置

一、單機部署

1.下載下傳kafka,可在apache官網上下載下傳,kafka要和JDK版本對應,我使用的是JDK1.7,kafka為0.10

2.進入到 /usr/java 中,解壓到 此檔案夾中

  tar -zxvf kafka_2.12-0.10.2.0.tgz

3. 因為kafka是通過Zookeeper來叢集的,是以先開啟Zookeeper叢集(當然開啟一個Zookeeper也可以),此處用了3個Zookeeper實作了僞叢集,叢集的方法見此處

4.修改kafka的 /usr/java/kafka_2.12-0.10.2.0/config/server.properties 配置檔案,配置Zookeeper的位址,将zookeeper.connect 的值改為:

  zookeeper.connect=192.168.80.128:2181,192.168.80.128:2182,192.168.80.128:2183

5.啟動kafka,進入到kafka的 bin 目錄,需要指定啟動的配置檔案。

  啟動(以背景方式啟動): ./kafka-server-start.sh  -daemon  ../config/server.properties

  在Zookeeper中檢視節點:ls / ,發現多個很多節點

  

Kafka(二)-- 安裝配置

  由此,kafka 已經啟動成功了,啟動成功之後 kafka 會暴露一個 9092的端口。

6.建立一個topic

  ./kafka-topics.sh --create --zookeeper localhost:2181,localhost:2182,localhost:2183  --replication-factor 1 --partition 2 --topic TestTopic

  解析:create 為 建立一個topic;

       zookeeper 為 指定的zookeeper的位址和端口;

       replication-factor 為 topic要在 不同的 broke中儲存幾分,因為此處沒有做叢集,則隻有一個broker;

            partition 為 分區;

       topic 為 建立的topic的名字;

 7.檢視建立的topic

  指令行方式:./kafka-topics.sh --list --zookeeper localhost:2181,localhost:2182,localhost:2183

  

Kafka(二)-- 安裝配置

  在Zookeeper中檢視:ls  /brokers/topics

  

Kafka(二)-- 安裝配置

  所有的消息都死通過Zookeeper管理的,不論是發送還是消費。

8.啟動消費者,監聽6中建立的topic:TestTopic

  ./kafka-console-consumer.sh --zookeeper localhost:2181,localhost:2182,localhost:2183 --topic TestTopic --from-beginning

9.重新打開一個視窗,啟動生産者,發送消息

  ./kafka-console-producer.sh --broker-list 192.168.80.128:9092 --topic TestTopic

  發送:hello kafka,在消費端可以看到 收到資訊了。然後多發送幾條消息,後面會用到,先發送7條消息。

10.檢視kafka的日志:

  cd /tmp/kafka-logs/  (因為 server.properties中配置的 log.dirs=/tmp/kafka-logs)

  會看到 裡面有 TestTopic-0 和 TestTopic-1:

  

Kafka(二)-- 安裝配置

  因為建立topic的時候建立了兩個分區,是以有兩個partition。短橫線後面的表示 分區的号。

  進入到 TestTopic-0中: cd TestTopic-0/,有兩個檔案:

  

Kafka(二)-- 安裝配置

  如果直接檢視log檔案的話,裡面會是亂碼,是以使用下面指令檢視日志:

  /usr/java/kafka_2.10-0.10.0.0/bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files 00000000000000000000.log --print-data-log,

  發現日志中有剛剛發的消息,但是發的日志中消息的數量并沒有7條,這是因為消息會平均配置設定在兩個partition中,即 TestTopic-0 和 TestTopic-1 中,在TestTopic-0中有4條,就會在TestTopic-1中有3條,一個partition就對應本地的一個實體檔案,每個檔案中存儲的就是消息的内容,消息是持久化存儲在磁盤中的,即使消費了的消息也會依然存儲在磁盤中,消息的多少和處理消息的效率沒太大影響。

二、叢集部署(此處為僞叢集,部署兩個Kafka)

1.開啟Zookeeper叢集。

2.在 /usr/java中建立kafkaCluster檔案夾,然後在 kafkaCluster中建立 kafka1 和 kakfa2 檔案夾,将 kafka_2.12-0.10.2.0.tgz 解壓到 kafka1 和 kafka2中。

3.修改kafka1 中的 server.perproties檔案(192.168.99.50為伺服器的IP),

  (1)将zookeeper.connect的值改為:zookeeper.connect=192.168.99.50:2181,192.168.99.50:2182,192.168.99.50:2183,

  (2)将advertised.listeners的值改為:advertised.listeners=PLAINTEXT://192.168.99.50:9092。

  (3)修改端口:listeners=PLAINTEXT://:9092

4.修改kafka2 中的server.perproties檔案,

  (1)将zookeeper.connect的值改為:zookeeper.connect=192.168.99.50:2181,192.168.99.50:2182,192.168.99.50:2183,

  (2)将broker.id 的值 改為 :broker.id = 1 ,用于區分是哪一個broker,相當于 ActiveMQ中的myid。

  (3)将advertised.listeners的值改為:advertised.listeners=PLAINTEXT://192.168.99.50:9093。

  (4)修改端口:listeners=PLAINTEXT://:9093

  (5)修改日志檔案儲存的位置:log.dirs=/tmp/kafka-logs2(僞叢集的時候需要修改,否則會報 檔案鎖定的錯,kafka.common.KafkaException: Failed to acquire lock on file .lock in /tmp/kafka-logs. A Kafka instance in another process or thread is using this directory.)

5.分别啟動 kafkka1 和 kafka2 ,進入  bin中,

  ./kafka-server-start.sh -daemon ../config/server.properties

6.檢視 Zookeeper節點,

  ls /brokers/ids,發現有兩個節點,為 [0,1],然後我們 取出 0 和 1 中的值,從 endpoints的值就可以看出我們修改advertised.listeners值的原因,如果不修改的話,預設的是localhost,叢集中根本不知道是哪一個。

  get  /brokers/ids/0 

  

Kafka(二)-- 安裝配置

7.驗證叢集是否成功,在kafka1 中發消息,在 kafka2 中收消息。

  1) 首先建立一個topic,如果不建立,發消息的時候會自動幫我們建立topic,但是就不會指定partition了。

      ./kafka-topics.sh --create --zookeeper localhost:2181,localhost:2182,localhost:2183  --replication-factor 1 --partition 4 --topic jiqun

  2) 檢視Zookeeper上節點:ls /brokers/topics,存在 剛剛建立的jiqun 的topic

      

Kafka(二)-- 安裝配置

  3) 在kafka2中 啟動消費者,

    ./kafka-console-consumer.sh --zookeeper localhost:2181,localhost:2182,localhost:2183 --topic jiqun --from-beginning

  4) 在kafka中 啟動生産者,發送消息,

      ./kafka-console-producer.sh --broker-list 192.168.99.50:9092,192.168.99.50:9093 --topic jiqun,

       發送 :How are you! ,發現 消費者中 接收到 How are you!

  說明叢集部署成功!

  5) 檢視kafka1 的日志目錄,cd /tmp/kafka-logs/,發現有 jiqun-1 和 jiqun-3

      

Kafka(二)-- 安裝配置

  6) 檢視kafka2 的日志目錄,cd /tmp/kafka-logs2/,發現有jiqun-0 和 jiqun-2

     

Kafka(二)-- 安裝配置

  這就說明kafka是一個分布式的消息中間件。在不同的 實體機上 存在着真實的檔案,又是以順序存儲的。我們可以進入到 partitsion中 找出 剛剛 發送的消息 在哪一個 partision中,發現在jiqun-0上,

   

Kafka(二)-- 安裝配置

  kafka消息是順序寫入的,kafka之是以性能高,是因為零拷貝 和 順序寫入磁盤,順序寫入磁盤的效率比随機寫入磁盤的效率高幾百倍甚至上千倍。

  kafka讀取消息 是 consumer 主動pull 消息的,并不是 broker push 到consumer的,這也是和 ActiveMQ的差別,kafka的消費能力是由 consumer來決定的,pull的時候 是根據offset 來拿到消息。

  kafka的message是以topic為基本機關,不同的topic之間是互相獨立的,可以了解為不同的topic就是不同的業務,每一個topic中又可以分成幾個不同的partision(建立的時候指定),每個partision存儲一部分message。Zookeeper上不會儲存 message。

  檢視日志檔案中得到的資料分析:

  • offset: 0 邏輯上值,遞增,主鍵
  • position: 0 實體偏移量
  • CreateTime: 1491920255486 建立時間
  • isvalid: true 是否有效
  • payloadsize: 3 消息大小
  • magic: 1 協定版本号
  • compresscodec: NONE 是否壓縮
  • crc: 3544424991 算法
  • payload: How are you! 消息内容

8.配置master-slave模式

  建立topic的時候, ./kafka-topics.sh --create --zookeeper localhost:2181,localhost:2182,localhost:2183  --replication-factor 2 --partition 4 --topic ceshiMasterSlave。

  這樣在消息既在master上儲存,又在slave中儲存。

9.檢視哪一個leader,哪一個是follow

  ./kafka-topics.sh --describe --zookeeper localhost:2181,localhost:2182,localhost:2183 --topic ceshiMasterSlave