記錄下和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安裝