Kafka單機部署

Kafka部署:

  • 目前Kafka的最新的源碼包版本爲2.2.1,二進制版本爲2.12-2.2.1;
  • 一般好多人都採用二進制部署,因爲解壓即用,快捷方便,再此也選擇二進制安裝,官方建議用二進制的2.12版本;
  • Kafka官方下載地址:http://kafka.apache.org/downloads
  • Kafka_2.12下載地址:http://mirror.bit.edu.cn/apache/kafka/2.2.1/kafka_2.12-2.2.1.tgz
# wget http://mirror.bit.edu.cn/apache/kafka/2.2.1/kafka_2.12-2.2.1.tgz
下載安裝包
# tar xf kafka_2.12-2.2.1.tgz -C /usr/local/
解壓安裝包到/usr/local/
# mv /usr/local/kafka_2.12-2.2.1 /usr/local/kafka
更改kafka目錄名
# cat << EOF >> /etc/profile
export KAFKA_HOME=/usr/local/kafka
export PATH=\$PATH:\$KAFKA_HOME/bin
EOF
添加Kafaka環境變量
# source /etc/profile
重新加載文件

ZooKeeper部署:

  • ZooKeeper官方站點:https://zookeeper.apache.org/
  • Kafka使用ZooKeeper來管理,因此需要安裝ZooKeeper,並且要先啓動ZooKeeper。
  • 但是在Kafka中內置了ZooKeeper配置文件:/usr/local/kafka/config/zookeeper.properties,單機部署我們選擇Kafka所提供的ZK配置文件來使用ZK,但是如果是集羣環境的Kafka,建議使用單獨的ZooKeeper來管理Kafka集羣,以下我們選擇使用Kafka內置的ZooKeeper來管理單節點的Kafka。
注意:
  • ZooKeeper需要允許Java環境,需要先部署JDK。
  • JDK下載鏈接:https://www.oracle.com/technetwork/java/javase/archive-139210.html
# tar xf jdk-8u161-linux-x64.tar.gz  -C /usr/local/
解壓安裝包到/usr/local/
# cat << EOF >> /etc/profile
   #################JAVA#################
   export JAVA_HOME=/usr/local/jdk1.8.0_161
   export JRE_HOME=\$JAVA_HOME/jre
   export CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar:\$JRE_HOME/lib
   export PATH=\$JAVA_HOME/bin:\$JRE_HOME/bin:\$PATH
   EOF
添加Kafaka環境變量
# source /etc/profile
重新加載文件
# java -version
驗證查看jdk版本號

修改Zookeeper配置文件與詳解:

# cat /usr/local/kafka/config/zookeeper.properties
tickTime=2000
#ZooKeeper服務器之間或客戶端與服務器之間維持心跳的時間間隔,單位是毫秒,默認爲2000。
initLimit=10
#zookeeper接受客戶端(這裏所說的客戶端不是用戶連接zookeeper服務器的客戶端,而是zookeeper服務器集羣中連接到leader的follower 服務器)初始化連接時最長能忍受多少個心跳時間間隔數。
#當已經超過10個心跳的時間(也就是tickTime)長度後 zookeeper 服務器還沒有收到客戶端的返回信息,那麼表明這個客戶端連接失敗。總的時間長度就是 10*2000=20秒。
syncLimit=5
#標識ZooKeeper的leader和follower之間同步消息,請求和應答時間長度,最長不超過多少個tickTime的時間長度,總的時間長度就是5*2000=10秒。
dataDir=/data/ZK
#存儲內存數據庫快照的位置;ZooKeeper保存Client的數據都是在內存中的,如果ZooKeeper節點故障或者服務停止,那麼ZooKeeper就會將數據快照到該目錄當中。
dataLogDir=/data/zk-logs
#如果沒提供的話使用的則是dataDir。zookeeper的持久化都存儲在這兩個目錄裏。dataLogDir裏是放到的順序日誌(WAL)。而dataDir裏放的是內存數據結構的snapshot,便於快速恢復。爲了達到性能最大化,一般建議把dataDir和dataLogDir分到不同的磁盤上,這樣就可以充分利用磁盤順序寫的特性
clientPort=2181
#ZooKeeper客戶端連接ZooKeeper服務器的端口,監聽端口
maxClientCnxns=60
#ZooKeeper可接受客戶端連接的最大數量,默認爲60
autopurge.snapRetainCount=3
#ZooKeeper要保留dataDir中快照的數量
autopurge.purgeInterval=1
#ZooKeeper清楚任務間隔(以小時爲單位),設置爲0表示禁用自動清除功能
server.1=localhost:2888:3888
#指定ZooKeeper集羣主機地址及通信端口
#“1”爲集羣主機的數字標識,一般從1開始,三臺ZooKeeper集羣一般都爲123
#localhost 爲集羣主機的IP地址或者可解析主機名
#2888 端口用來集羣成員的信息交換端口,用於ZooKeeper集羣節點與leader進行信息同步
#3888 端口是在leader掛掉時或者剛啓動ZK集羣時專門用來進行選舉leader所用的端口

Kafka目錄文件介紹:

Kafka根目錄文件介紹:

# ll kafka_2.12-2.2.1/
total 52
drwxr-xr-x 3 root root  4096 May 14 00:18 bin			#Kafka腳本程序目錄
drwxr-xr-x 2 root root  4096 Jun 24 16:41 config			#Kafka配置文件目錄
drwxr-xr-x 2 root root   215 Jun 23 00:56 kafka-logs		#Kafka數據存儲地址
drwxr-xr-x 2 root root  4096 Jun 23 00:49 libs			#Kafka開發程序包目錄
-rw-rw-r-- 1 root root 32216 May 14 00:10 LICENSE
drwxr-xr-x 2 root root   182 Jun 23 00:51 logs			#Kafka日誌目錄
-rw-rw-r-- 1 root root   336 May 14 00:10 NOTICE
drwxr-xr-x 2 root root    44 May 14 00:18 site-docs		#Kafka站點文檔

Kafka執行程序介紹:

# ll /usr/local/kafka/bin/
total 132
-rwxrwxr-x 1 root root  945 May 13 16:10 kafka-console-consumer.sh
#Kafka消費消息腳本
-rwxrwxr-x 1 root root  944 May 13 16:10 kafka-console-producer.sh
#Kafka生產消息腳本
-rwxrwxr-x 1 root root  871 May 13 16:10 kafka-consumer-groups.sh
#Kafka消費者組腳本
-rwxrwxr-x 1 root root  863 May 13 16:10 kafka-topics.sh
#Kafka創建topic腳本
-rwxrwxr-x 1 root root 1393 May 13 16:10 zookeeper-server-start.sh
#Kafka內置ZK啓動腳本
-rwxrwxr-x 1 root root 1001 May 13 16:10 zookeeper-server-stop.sh
#Kafka內置ZK關閉腳本

修改Kafka主配置文件server.properties:

# cat /usr/local/kafka/config/server.properties 
broker.id=1
listeners=PLAINTEXT://172.17.0.2:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/data/kafka-logs/
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=172.17.0.2:2181
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0

啓動Zookeeper與Kafka:

# /usr/local/kafka/bin/zookeeper-server-start.sh -daemon /usr/local/kafka/config/zookeeper.properties
查看進程以確保zk啓動
# ss -naplt | grep 2181
LISTEN     0      50           *:2181                     *:*                   users:(("java",pid=830,fd=101))
# /usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
查看進程連接
# jps
1858 QuorumPeerMain
2280 Jps
2201 Kafka
下面通過過濾端口號可以看到
ZooKeeper監控本地地址TCP端口2181,可以ZooKeeper看到2181後面對應的還有一個端口號爲43354 
Kafka監控本地地址TCP端口9092,可以看到Kafka9092後面也有對應的一個端口號55036
# netstat -anplt | egrep "(2181|9092)"  
tcp        0      0 172.17.0.2:9092         0.0.0.0:*               LISTEN      1041/java           
tcp        0      0 0.0.0.0:2181            0.0.0.0:*               LISTEN      700/java            
tcp        0      0 172.17.0.2:2181         172.17.0.2:43354        ESTABLISHED 700/java            
tcp        0      0 172.17.0.2:43354        172.17.0.2:2181         ESTABLISHED 1041/java           
tcp        0      0 172.17.0.2:9092         172.17.0.2:55036        ESTABLISHED 1041/java           
tcp        0      0 172.17.0.2:55036        172.17.0.2:9092         ESTABLISHED 1041/java 
查看2181端口的監聽狀態
# lsof -i:2181
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java     700 root  101u  IPv4  23940      0t0  TCP *:eforward (LISTEN)
java     700 root  103u  IPv4  18120      0t0  TCP kafka_node1:eforward->kafka_node1:43354 (ESTABLISHED)
java    1041 root  101u  IPv4  25680      0t0  TCP kafka_node1:43354->kafka_node1:eforward (ESTABLISHED)
查看9092的端口監聽狀態
# lsof -i:9092
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    1041 root  158u  IPv4  24974      0t0  TCP kafka_node1:XmlIpcRegSvc (LISTEN)
java    1041 root  174u  IPv4  30888      0t0  TCP kafka_node1:55036->kafka_node1:XmlIpcRegSvc (ESTABLISHED)
java    1041 root  177u  IPv4  29475      0t0  TCP kafka_node1:XmlIpcRegSvc->kafka_node1:55036 (ESTABLISHED)

管理Kafka:

  • 接下來操作下Kafka,通過kafka-topics.sh新建一個Topic,然後使用kafka-console-producer.sh消息生產腳本來生產消息到Topic中,再由kafka-console-consumer.sh消息消費者消費消息,以及常用的選項介紹。
  • 此處使用的Kafka版本爲kafka_2.12-2.2.1.tgz,但是在Kafka的上一個版本中kafka_2.11-2.1.0.tgz,Kafka的命令配置發生了改變,以下我們把兩個版本的命令都寫出來:
    • 新版本:2.12-2.2.1
    • 老版本:2.11-2.1.0

創建Topic主題:

新版本:
# /usr/local/kafka/bin/kafka-topics.sh --create --bootstrap-server 172.17.0.2:9092 --replication-factor 1 --partitions 1 --topic kafka_new_01
老版本:
# /usr/local/kafka/bin/kafka-topics.sh --create --zookeeper 172.17.0.2:2181 --replication-factor 1 --partitions 1 --topic kafka_old_01
選項解釋:
  • –create:創建新的Topic
  • –bootstrap-server:指定要哪臺Kafka服務器上創建Topic,主機加端口,指定的主機地址一定要和配置文件中的listeners一致
  • –zookeeper:指定要哪臺zookeeper服務器上創建Topic,主機加端口,指定的主機地址一定要和配置文件中的listeners一致
  • –replication-factor:創建Topic中的每個分區(partition)中的複製因子數量,即爲Topic的副本數量,建議和Broker節點數量一致,如果複製因子超出Broker節點將無法創建
  • –partitions:創建該Topic中的分區(partition)數量
  • –topic:指定Topic名稱
區別:
  • –bootstrap-server:新版本爲bootstrap-server,新版本把Topic創建到了Kafka中,也就意味着信息要被存儲到Broker節點的Topic中
  • –zookeeper:老版本爲zookeeper,老版本是把Topic創建到了zookeeper中,意味着信息要被存儲到ZooKeeper應用的Topic中
總結:
  • 我們的這個2.2.1版本這兩種目前都支持,但是官方建議使用新版本的選項。

查看已創建的Topic:

新版本:
# /usr/local/kafka/bin/kafka-topics.sh --list --bootstrap-server 172.17.0.2:9092
    kafka_new_01
    kafka_old_01
老版本:
# /usr/local/kafka/bin/kafka-topics.sh --list --zookeeper 172.17.0.2:2181
    kafka_new_01
    kafka_old_01
區別:
    使用不同的選項要指定不同的服務和端口

生產消息:

注意:
  • 生產消息在新版本中未發生改變,同樣是向Broker節點發送消息,這也證實了producer生產者無需和ZooKeeper節點產生連接,只需和Broker建立連接即可,如果瞭解更多kafka的架構及工作原理,請看該篇文章的架構圖部分:文檔:Kafka理論概述(一).note
  • 以下向兩個Topic中發送不同的消息,該消息內容爲手動輸入
生產kafka_new_01:
# /usr/local/kafka/bin/kafka-console-producer.sh --broker-list 172.17.0.2:9092 --topic kafka_new_01
>Hello Kafka_new_01
>I'm the new version

生產kafka_old_01:
# /usr/local/kafka/bin/kafka-console-producer.sh --broker-list 172.17.0.2:9092 --topic kafka_old_01
>Hello Kafka_old_01
>I'm the old version
參數解釋:
    --broker-list:指定使用哪臺broker來生產消息
    --topic:指定要往哪個Topic中生產消息

消費消息:

消費Kafka_new_01:
# /usr/local/kafka/bin/kafka-console-consumer.sh --bootstrap-server 172.17.0.2:9092 --topic 		
    kafka_new_01 --from-beginning
    Hello Kafka_new_01
    I'm the new version

消費Kafka_old_01:
# /usr/local/kafka/bin/kafka-console-consumer.sh --bootstrap-server 172.17.0.2:9092 --topic 
    kafka_old_01 --from-beginning
    Hello Kafka_old_01
    I'm the old version

參數解釋:
    --bootstrap-server:指定要在哪臺broker節點消費消息,指明IP和端口。
    --topic:指定要在哪個Topic中消費消息。
    --from-beginning:獲取所有未被消費的信息

查看Topic詳情:

新版本命令:
# /usr/local/kafka/bin/kafka-topics.sh --describe --bootstrap-server 172.17.0.2:9092 --topic kafka_new_01
    Topic:kafka_new_01  PartitionCount:1    ReplicationFactor:1 Configs:segment.bytes=1073741824
    Topic: kafka_new_01 Partition: 0    Leader: 1   Replicas: 1 Isr: 1

老版本命令:
# /usr/local/kafka/bin/kafka-topics.sh --zookeeper 172.17.0.2:2181 --describe --topic kafka_new_01
    Topic:kafka_new_01  PartitionCount:1    ReplicationFactor:1 Configs:
    Topic: kafka_new_01 Partition: 0    Leader: 1   Replicas: 1 Isr: 1    

參數解釋:
    --Topic:kafka_new_01:topic名稱
    --PartitionCount:1:分片數量
    --ReplicationFactor:1:Topic副本數量

刪除Topic:

使用--bootstrap-server刪除
# /usr/local/kafka/bin/kafka-topics.sh --delete --bootstrap-server 172.17.0.2:9092 --topic kafka_new_01

使用--zookeeper刪除
# /usr/local/kafka/bin/kafka-topics.sh --delete --zookeeper 172.17.0.2:2181 --topic kafka_old_01
    Topic kafka_old_01 is marked for deletion.
    Note: This will have no impact if delete.topic.enable is not set to true.
雖然有提示說"kafka_old_01"只是標記被刪除,但是沒關係
# /usr/local/kafka/bin/kafka-topics.sh --list --bootstrap-server 172.17.0.2:9092
    __consumer_offsets
查看已創建Topic,我們創建的兩個Topic已經被刪除掉了,但是Kafka自動生成了一個叫__consumer_offsets的Topic。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章