目錄:
1、kafka的介紹
2、kafka與傳統消息隊列的區別
3、kafka的架構模型
4、kafka的安裝與命令行使用
5、kafka的API
6、kafka的分區(共4種)
7、kafka的配置文件說明
8、flume與kafka的整合
9、kafka如何保證數據的不丟失
10、kafkaManager監控工具的安裝與使用(可視化界面)
11、kafka爲什麼這麼快
1、kafka的介紹
apache下開源的消息系統,分佈式的消息隊列,是scala編寫的。
Kafka是一個分佈式消息隊列:生產者、消費者的功能。它提供了類似於JMS的特性,但是在設計實現上完全不同,此外它並不是JMS規範的實現。
broker是kafka的一個實例,kafka集羣依賴於zookeeper。
2、kafka與傳統消息隊列的區別
*傳統的是從 topic裏監聽後,消費者被動接收的。pub和sub。
*Kafka的消費者是主動去取從kafka的集羣。1 push和pull。2 吞吐量大。3 主備模式。4 可擴容。
3、kafka的架構模型
producer:生產消息,並且將消息push到kafka集羣當中的topic當中去。
topic:所有消息都可以推送到某一類自定義的topic當中去,topic也有分區和副本的概念。
consumer:通過zookeeper集羣連接到kafka集羣,消費topic,通過pull的方式主動拉取。
broker:kafka的每一個節點就叫broker 也就是臺機器。類似於hadoop的datanode。
Zookeeper:記錄kafka集羣保存的元數據信息
-
topic組件介紹:
paritition:topic可以分爲多個partition(區),是有序的隊列,其中的每條信息都有一個id(offset),不是整體有序,但是分區有序。一個partition分爲多個segment。offset:偏移量 是個long型的數字,方便查找,唯一標記一條信息,數據不丟失
Segement:消息存儲的真實文件,會不斷生成新的。
-
partition 設計 (拓展)
-
存儲層面上:(圖的中下位置)
- 生產者(producer) :ACK確認機制
- 消費者(consumer): partition的消息記錄在.log文件裏;每個partition在內存中對應一個index列表,記錄每個segment中的第一條消息偏移offset。
-
ACK機制:在圖的左下角
4、 kafka的安裝
- 4.1、安裝
方法1:docker安裝kafka,參考文章:https://blog.csdn.net/qq_18769269/article/details/80880633
方法2:原生的,對於原生的安裝,本文只大體說一下。
kafka是 Scala 2.11-1.0.0 版本(是向下兼容的)
安裝:上次,安裝,安裝後,改配置文件 server.properties。注意:broker.id host.id
啓動:(啓動前先啓動zk集羣)
nohup 和 & 配合使用 是後臺啓動,指定配置文件,日誌輸出到/dev/null 2>&1 &(目的地址類似於黑洞)
nohup bin/kafka-server-start.sh config/server.properties >/dev/null 2>&1 & (在kafka目錄下)
- 4.2 kafka 命令行的管理與使用
主要是三個腳本:-
創建topic: 5個主要參數
–create 表示創建topic
–partitions 表示指定我們topic的分區書
–replication-factor 表示指定我們的副本數
–topic 指定我們topic的名字
–zookeeper 指定我們zookeeper的地址 -
創建producer發送數據: 指定kafka集羣地址和topic;然後發送數據
–broker-list 指定我們kafka集羣的地址
–topic 指定我們的消息發送到哪個topic裏面去 -
創建consumer:接收數據。
–bootstrap-server 表示我們的kafak集羣的地址
–from-beginning 表示我們從最開始的數據進行消費
–topic指定我們topic的名字
-
注:如果有亂碼的話,可能是因爲src客戶端工具亂碼。
5、 kafka的API
這裏就不詳細介紹了…
java API:
創建maven工程、導入jar包。官網裏documentation下有介紹
producer,consumer(注意開啓kafka的offset自動提交功能,保證數據不丟失,可以說自己遇到
問題:kafka Api操作的時候,沒有開啓offset自動提交功能,導致數據丟失)
6、 kafka分區策略( 4 種 )
把消息怎麼存在kafka的topic裏):
1)手動指定用分區
2)通過消息的key 進行hash 取模 (注:Key值一定要變,要不造成數據傾斜)
3)輪循 實際工作中常用這個均勻放(實現負載均衡)
4)自定義分區 implements Partitioner(一般不用)
7、kafka的配置文件說明
-
server.properties :(只有這個在linux配,剩下的倆在代碼中配)
broker標識、監聽端口、處理網絡請求的線程數量、IO數量、緩存區大小、kafka日誌存放路徑、清理 恢復和保存log,index的線程數、 segement大小,時間、本機id、能否刪除topic -
producer.properties: (一般不用自己寫,整合就有,如果用自己寫,就把紅的配了)
是否壓縮、設置ACK機制 0、1、-1(工作用1) 、發送消息異步(快,工作上用這個多)還是同步(慢但數據不丟失)、堆積、充實次數… -
consumer.properties:
zookeeper地址、多久負載均衡、offset多久更加到zk、組、offset自動提交、最大取多少塊緩存(調優)
8、flume與kafka的整合
Flume 1.8.0 ,看官網。整合的時候,flume就相當於生產者。
-
整合後的 配置文件:sources、channel、kafka sink
注意: 1) 忽略 tmp 用正則表達式粘貼 ; 2) 如果是從windows上傳文件的話,必須得設置格式是GBK,默認是UTF-8) -
爲什麼要flume 採集數據後 要通過 kafka 集羣?
答:1、解決數據流平緩性問題 ,統一平臺 (可以設置一次性取多少,不會一次性過來太多或者低風期過少) -
flume如何採集windowsServer的信息?(因爲flume只能採集linux的)
答:windowsServer先通過ftp傳到linux,再從linux採集。
9、kafka如何保證數據的不丟失
生產者producer如何保證數據的不丟失
- 同步模式
通過ack機制來確認消息已經收到。可以設置,有0、1、-1 取值。
一般工作用 1 ,parition的主節點保存後確認成功即可;如果是-1,副本和主節點都要確認,效率低點 安全性最高;0 是不用確認。 - 異步模式
一批一批的確認,設置 多少時間往磁盤刷新一次數據 和 多少條數據往磁盤刷新一次。
2)、消費者consumer如何保證數據的不丟失
消費者一般通過offset偏移量,每次讀取上次的偏移量 來確保數據不丟失。
10、kafkaManager監控工具的安裝與使用(可視化界面)
方法1:docker安裝kafkaManager,參考文章,裏面docker安裝了zk,kafka,kafkamanager:https://blog.csdn.net/qq_18769269/article/details/80880633
方法2:原生的,這裏只是大體說一下。
-
安裝:上傳壓縮包解壓;修改配置文件(zk地址);後臺啓動kafkaManager 並 指定配置文件位置;從頁面訪問kafkaManager
-
啓動:(後臺啓動)
./kafka-manager -Dconfig.file=/export/servers/kafka-manager-1.3.3.7/conf/application.conf -Dhttp.port=8070 & -
查看:1)jps
2)頁面查看: http://192.168.52.200:8070/ -
在頁面配置kafka集羣:
- 出現的問題: 啓動manager後出現如下信息。。。
This application is already running (Or delete /export/servers/kafka-manager-1.3.0.7/RUNNING_PID file).
解決辦法:手 動kill掉kafka-mamager進程,然後 刪除RUNNING_PID文件後再重新啓動。
- 出現的問題: 啓動manager後出現如下信息。。。
11、kafka爲什麼這麼快:
- kafka爲什麼快:
1)順序讀寫文件。比固態盤還快。普通的是隨機存放。
2)pageCache頁緩存。消息先緩存到pageCache,然後達到一定量再寫入磁盤。