Kafka-概念原理及工具

記錄下和kafka相關的概念原理以及經常使用工具,文中不少理解參考文末博文、書籍還有前輩。html

kafka特性

kafka是由領英(LinkedIn)提供給Apache,是一個消息引擎,如今發展成爲還能夠進行流處理(kafka streams)的一個平臺,如下是它的架構圖。web

(1)用的是發佈-訂閱模式,多個消費者均可以消費Message。數據庫

(2)單機kafka吞吐量大概是80~100M/s,性能高,其中寫性能基於磁盤順序寫,讀性能基於零拷貝,此外還有三層網絡模型,這三個是保證其高性能的主要緣由。apache

(3)解耦生產者和消費者,只要消息隊列不變化,二者沒必要要關心對方是否有變化,一個發消息,一個消費消息進行處理就能夠了。bootstrap

(4)削峯限流,在高併發場景下,能夠在不須要升級硬件資源的狀況下,關鍵組件可以使用kafka頂住峯值流量,正常對外提供服務,不會由於一時處理不了大量請求而奔潰。bash

(5)順序性保證,加入消息隊列的的消息能夠在單個分區保持一致的順序,對於消息處理順序有要求的場景,它能保證。服務器

(6)當生產消息和消費消息的速度不一致時,kafka能夠提供一個緩衝。網絡

(7)容錯性,即便消費消息的進程掛掉了,也能夠在恢復後繼續消費。就算某臺部署了kafka的服務器宕機了,也不影響整個kafka集羣繼續提供服務,由於它有副本(replica)機制,能夠實現高可用。架構

(8)kafka元數據,在0.8版本以前都交給zookeeper管理,1.0x後,每一個kafka節點上都會保存一份元數據。併發

核心概念

kafka的核心名詞有不少,參考博文用一個圖簡單示意一下。

producer

消息的生產者,如flume sink到kafka。

consumer

消費消息的消費者,通常是spark streaming或flink。

consumer group

多個消費者能夠放到一個消費組裏,如上圖,具體體現就是各個消費者部署在不一樣的服務器上。kafka的消息對於消費組是組間共享的,好比電商網站中,積分組和訂單組均可以消費數據,完成業務處理(沒幹過電商,網上看文章推測的)。可是消息被消費組獲取後,只能被其中的一個組員處理,組內是競爭的。

broker

啓動kafka server後,它就是一個broker,它有id號,在server.properties裏指定的,每一個服務器節點上的broker id必須惟一。如上圖啓動了三個kafka節點,所以就有三個broker。

topic

發送消息時,須要分類管理,相似數據庫中的一張表,一張表存一類型的數據,kafka中一個topic也對應一個類型的數據。如系統消息發送一個topic,業務消息發送一個topic。

partition

topic在kafka中是一個邏輯上的概念,真正體如今物理上就是對應一個個的目錄,一個topic至少有一個partition,若是建立topic時指定了多個分區,則它們會均勻分佈在不一樣節點上,文件後綴名以數字區分不一樣的分區。分區後能夠總體提升kafka的吞吐量,由於每一個分區均可以存儲數據,消費數據。

分區內,會有一個log文件,index文件,和timeindex文件。其中kafka中的message就是寫入到log中保存的,底層是二進制數據,而index則是log文件的索引文件,經過它能夠快速的定位一條日誌,而不須要從頭遍歷log文件查看,細節後續文章總結。時間索引文件便於經過時間範圍來查找消息,可是會存在時間錯亂的可能,不經常使用。

[root@hadoop01 /home/software/kafka-2/kafka-logs/topicA-0]# ll
total 0
-rw-r--r--. 1 root root 10485760 Mar 20 20:29 00000000000000000000.index
-rw-r--r--. 1 root root        0 Mar 20 20:29 00000000000000000000.log
-rw-r--r--. 1 root root 10485756 Mar 20 20:29 00000000000000000000.timeindex

replica

上面partition保證了吞吐量,可是高可用HA尚未保證,這就須要副本機制了。kafka中默認指定一個副本,它是以topic爲單位進行備份的,上圖topicA除了有3個分區外,還有3個副本,而topicB則只有一個副本,從建立topic的命令也能夠看出來。kafka中同一個分區的多個replica不會在同一個broker上,這就實現了HA,反之若是能存在一個broker上,那這個broker宕機了那這個分區上的消息也就不能提供服務了。

# topicA 3個replica
[root@hadoop01 /home/software/kafka-2/bin]# sh kafka-topics.sh --create --zookeeper hadoop01:2181 --replication-factor 3 --partitions 3 --topic topicA
Created topic "topicA".
# topicB 1個replica
[root@hadoop01 /home/software/kafka-2/bin]# sh kafka-topics.sh --create --zookeeper hadoop01:2181 --replication-factor 1 --partitions 3 --topic topicB
Created topic "topicB".

leader和follower

上圖能夠看出來,生產者和消費者都只和紅色分區通訊,生產和消費數據,這個紅色分區就是leader分區,而綠色分區就是follower分區,它只從leader分區fetch數據,並返回ack信號。對於topicA來講,每一個分區有三個replica,其中一個是leader,另外兩個是follower,對於topicB來講,它沒有follower。

controller

當啓動了kafka集羣,zookeeper會在某個節點啓動一個controller進程,它是kafka集羣的總控組件,如上圖所示在broker2上,在zookeeper中會建立對應臨時節點/controller。它的做用不少,簡單列舉一下:

(1)當某個broker宕機,它上面的leader副本就不能繼續提供服務,須要從follower裏選舉有資格(處於isr列表中的replica)的副本頂上去,這就須要controller完成。

(2)上圖中每一個broker上都有meta元數據(如kafka集羣中broker、partition、leader等信息),在kafka1.0.x後,它再也不是存儲在zookeeper上了,而是會每一個broker上都有一份,這也是controller獲取後分發下去的。0.8版本以前,須要鏈接zookeeper,1.0.x後,能夠連任意一個broker就能夠獲取元數據,以下的例子也能夠看出端倪。

# 1.0.x 之消費消息
kafka-console-consumer.sh --bootstrap-server hadoop01:9092 --topic football --from-beginning
# 0.8.x 之消費消息
kafka-console-consumer.sh --zookeeper hadoop01:2181 --topic football --from-beginning

# 均可以消費到
[root@hadoop01 /home/software/kafka-2/bin]# sh kafka-console-consumer.sh --bootstrap-server hadoop01:9092 --topic football --from-beginning
hello i am clyang
hello
i am sorry
i am not enter into bigdata
[root@hadoop01 /home/software/kafka-2/bin]# sh kafka-console-consumer.sh --zookeeper hadoop01:2181 --topic footballUsing the ConsoleConsumer with old consumer is deprecated and will be removed in a future major release. Consider using the new consumer by passing [bootstrap-server] instead of [zookeeper].
hello i am clyang
hello
i am sorry
i am not enter into bigdata

Zookeeper

(1)zookeeper管理kafka元數據,可是zookeeper並非爲高併發設計的,後面元數據會保存到各個broker一份。

(2)controller的選舉,以及controller不少工做,都是在zookeeper的基礎上才能完成。如broker的上下線,controller能監聽到隨後能夠rebalance。此外leader分區宕機後,新的leader分區的選舉工做,也是controller完成。

KafkaManager

kafkaManager是一款web可視化管理kafka節點的軟件,由雅虎開源,能夠方便管理整個集羣的kafka,須要自行安裝。參考文末博文,直接使用博主編譯好的kafkaManager,無需安裝sbt(也能夠安裝sbt後本身編譯,能夠參考網上博文),只需完成如下步驟就可使用。

(1)修改安裝目錄/conf下的application.conf,將裏面zookeeper的地址,修改成本身的主機地址。

[root@hadoop01 /home/software/kafka-manager-1.3.3.7/conf]# ll
total 24
-rw-r--r--. 1 root root 1381 Jun 18  2017 application.conf
-rw-r--r--. 1 root root   27 Jun  5  2017 consumer.properties
-rw-r--r--. 1 root root 2108 Jun  5  2017 logback.xml
-rw-r--r--. 1 root root 1367 Jun  5  2017 logger.xml
-rw-r--r--. 1 root root 7423 Jun  5  2017 routes

修改地址。

# 配置成本身的zookeeper的值
# kafka-manager.zkhosts="localhost:2181"
kafka-manager.zkhosts="hadoop01:2181,hadoop02:2181,hadoop03:2181"
kafka-manager.zkhosts=${?ZK_HOSTS}
pinned-dispatcher.type="PinnedDispatcher"
pinned-dispatcher.executor="thread-pool-executor"

(2)啓動。

若是發現後臺有ProdServerStart進程,表明已啓動成功。

# -Dconfig.file 指定配置文件
# -Dhttp.port=9000 指定應用的端口號
# nohup和&表明後臺運行,1和2表明標準輸出和錯誤輸出結果,都輸出到"黑洞"
[root@hadoop01 /home/software/kafka-manager-1.3.3.7]#  nohup bin/kafka-manager -Dconfig.file=conf/application.conf -Dhttp.port=9000 1>/dev/null 2>/dev/null &

# 啓動
[root@hadoop01 /home/software/kafka-manager-1.3.3.7]# jps
2358 Jps
2220 ProdServerStart

(3)啓動zookeeper和kafka後,能夠登陸web查看,在哪臺啓動kafkamanager,就連哪臺服務器的地址。剛開始須要添加一個集羣,配置好zookeeper鏈接的地址和kafka版本就可使用。

經過web,能夠看到整個kafka節點上的topic,其餘還有很多界面供查看,總體使用方便,具體略。

以上,理解不必定正確,但學習就是一個不斷了解和糾錯的過程,記錄令人逐漸準確。

參考博文:

(1)《Apache Kafka實戰》

(2)https://www.cnblogs.com/youngchaolin/p/12121812.html

(3)http://kafka.apache.org/10/documentation.html

(4)[https://www.cnblogs.com/dadonggg/p/8205302.html kafkaManager安裝

相關文章
相關標籤/搜索