消息中間件Kafka

Kafka簡介

消息 Message

網絡中的兩臺計算機或者兩個通訊設備之間傳遞的數據。例如說:文本、音樂、視頻等內容。

隊列 Queue

一種特殊的線性表(數據元素首尾相接),特殊之處在於只允許在首部刪除元素和在尾部追加元素。入隊、出隊。
消息隊列 MQ
消息+隊列,保存消息的隊列。消息的傳輸過程中的容器;主要提供生產、消費接口供外部調用做數據的存儲和獲取。

Kafka是分佈式的發佈—訂閱消息系統。它最初由LinkedIn(領英)公司發佈,使用Scala語言編寫,與2010年12月份開源,成爲Apache的頂級項目。Kafka是一個高吞吐量的、持久性的、分佈式發佈訂閱消息系統。它主要用於處理活躍的數據(登錄、瀏覽、點擊、分享、喜歡等用戶行爲產生的數據)。

三大特點:

高吞吐量

可以滿足每秒百萬級別消息的生產和消費——生產消費。

持久性

有一套完善的消息存儲機制,確保數據的高效安全的持久化——中間存儲。

分佈式

基於分佈式的擴展和容錯機制;Kafka的數據都會複製到幾臺服務器上。當某一臺故障失效時,生產者和消費者轉而使用其它的機器——整體健壯性。

一個MQ需要哪些部分?生產、消費、消息類別、存儲等等。
對於kafka而言,kafka服務就像是一個大的水池。不斷的生產、存儲、消費着各種類別的消息。那麼kafka由何組成呢?

Kafka服務:
Topic:主題,Kafka處理的消息的不同分類。
Broker:消息代理,Kafka集羣中的一個kafka服務節點稱爲一個broker,主要存儲消息數據。存在硬盤中。每個topic都是有分區的。
Partition:Topic物理上的分組,一個topic在broker中被分爲1個或者多個partition,分區在創建topic的時候指定。
Message:消息,是通信的基本單位,每個消息都屬於一個partition
Kafka服務相關
Producer:消息和數據的生產者,向Kafka的一個topic發佈消息。
Consumer:消息和數據的消費者,定於topic並處理其發佈的消息。
Zookeeper:協調kafka的正常運行。

Kafka安裝配置

  ——standalone

解壓: opt]# tar -zxvf soft/kafka_2.10-0.10.0.1.tgz
重命名:opt]# mv kafka_2.10-0.10.0.1/ kafka
添加KAFKA_HOME至環境變量:/etc/profile
配置:
關於zookeeper,有兩種方式可選,內置或是外置,推薦外置的zk集羣,內置的zk,主要自己測試來用。
內置關於配置和啓動ZK服務:
配置ZK文件:KAFKAHOME/config/zookeeper.propertiesdataDir/tmp/zookeeperzknohup KAFKA_HOME/bin/zookeeper-server-start.sh KAFKA_HOME/  
config/zookeeper.properties > /opt/logs/kafka-zk.log 2>&1 &  
   查看日誌:more /opt/logs/kafka-zk.log  
啓動kafka-server  
  配置相關參數:
KAFKA_HOME/config/server.properties
主要參數:broker.id、port、log.dirs、zookeeper.connect
broker.id=0
log.dirs=/opt/kafka/logs/ [kafka數據的存放目錄]
zookeeper.connect=master:2181,slave01:2181,slave02:2181
啓動:
nohup KAFKAHOME/bin/kafkaserverstart.sh KAFKA_HOME/
config/server.properties > /opt/logs/kafka-server.log 2>&1 &
查看日誌:more /opt/logs/kafka-server.log

Kafka操作
——topic
增:新增一個topic:”kafka”,爲它分配一個分區,保存一個副本
bin/kafka-topics.sh –create –topic kafka –zookeeper master:2181 –partitions 3 –replication-factor 2

#replication-factor不能大於broker數

bin/kafka-topics.sh –create –zookeeper master:2181 –replication-factor 1 –partitions 3 –topic world
查:查詢kafka的信息【不加topic是查詢所有的topic的詳情】
bin/kafka-topics.sh –describe –zookeeper master:2181 –topic kafka
所有可以使用的topic
bin/kafka-topics.sh –list –zookeeper master:2181
改:修改hello爲2個分區 alter:修改partition數(只能增加)
bin/kafka-topics.sh –alter –zookeeper master:2181 –partitions 3 –topic kafka
刪:刪除world的topic
bin/kafka-topics.sh –delete –zookeeper master:2181 –topic world
是否開啓topic的刪除功能:默認爲false。 如果要開啓刪除topic 開關
在kafka/conf/server.properties 裏的最後一行添加:delete.topic.enable=true

Kafka操作
——生產者消費者案例

創建生產者 producer
必須的參數:
broker-list:kafka的服務地址[多個用逗號隔開]、topic:具體的單個topic
bin/kafka-console-producer.sh –broker-list localhost:9092 –topic kafka
創建消費者 consumer
必須的參數:
Zookeeper:kafka的zk集羣地址;
Topic\whitelist\blacklist:
1、具體的單個topic
2、多個白名單topic字符串[逗號隔開]。
3、多個黑名單topic字符串[逗號隔開]。
bin/kafka-console-consumer.sh –zookeeper master:2181 –topic kafka –from-beginning
標記刪除的topic也可以使用

Kafka安裝配置
——cluster
Kafka集羣中,沒有主節點和從節點之分。搭建起來也是非常容易。
只需要將standalone中搭建好的節點拷貝scp到其他節點上,注意不要把日誌數據拷貝到另外的機器上。
scp -r kafka/ root@slave01:/opt/
scp -r kafka/ root@slave02:/opt/
修改KAFKAHOME/config/server.propertiesbroker.id1,2kafkanohup KAFKA_HOME/bin/kafka-server-start.sh $KAFKA_HOME/
config/server.properties > /opt/logs/kafka-zk.log 2>&1 &

Kafka組件
——Broker
Broker:配置文件server.properties
1、爲了減少磁盤寫入的次數,broker會將消息暫時buffer起來,當消息的個數達到一定閥值或者過了一定的時間間隔時,再flush到磁盤,這樣減少了磁盤IO調用的次數。
配置:Log Flush Policy
#log.flush.interval.messages=10000 一個分區的消息數閥值
#log.flush.interval.ms=1000
2、kafka的消息保存一定時間(通常爲7天)後會被刪除。
配置:Log Retention Policy
log.retention.hours=168
#log.retention.bytes=1073741824
log.retention.check.interval.ms=300000

Producer:配置文件:producer.properties
1、自定義partition
Producer也根據用戶設置的算法來根據消息的key來計算輸入哪個partition:partitioner.class
2、異步或者同步發送
配置項:producer.type
異步或者同步發送
同步是指:發送方發出數據後,等接收方發回響應以後才發下一個數據的通訊方式。
異步是指:發送方發出數據後,不等接收方發回響應,接着發送下個數據的通訊方式。
3、批量發送可以很有效的提高發送效率。
Kafka producer的異步發送模式允許進行批量發送,先將消息緩存在內存中,然後一次請求批量發送出去。
具體配置queue.buffering.max.ms、queue.buffering.max.messages。
默認值分別爲5000和10000

consumers:配置文件:consumer.properties
1、每個consumer屬於一個consumer group,可以指定組id。group.id
2、消費形式:
組內:組內的消費者消費同一份數據;同時只能有一個consumer消費一個Topic中的1個partition;一個consumer可以消費多個partitions中的消息。所以,對於一個topic,同一個group中推薦不能有多於partitions個數的consumer同時消費,否則將意味着某些consumer將無法得到消息。
組間:每個消費組消費相同的數據,互不影響。
3、在一個consumer多個線程的情況下,一個線程相當於一個消費者。
例如:partition爲3,一個consumer起了3個線程消費另一個後來的consumer就無法消費。

1、每個partition在存儲層面是append log文件。新消息都會被直接追加到log文件的尾部,每條消息在log文件中的位置稱爲offset(偏移量)。
2、每條Message包含了以下三個屬性:
1°、offset 對應類型:long 此消息在一個partition中序號。可以認爲offset是partition中Message的id
2°、MessageSize 對應類型:int32 此消息的字節大小。
3°、data 是message的具體內容。
3、越多的partitions意味着可以容納更多的consumer,有效提升併發消費的能力。
4、總之:業務區分增加topic、數據量大增加partition。

注:如果指定的topic不存在則會創建
partitions數目和num.partitions一致 【server.properties】默認1
重複因子:default.replication.factor 一致【server.properties】默認1
1、將生產者的配置文件放在程序的資源目錄裏。
2、java加載配置文件生產數據
//加載和配置文件
Properties prop = new Properties();
prop.load(ProducerDemo.class.getClassLoader().getResourceAsStream(“producer.properties”));
Producer

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章