Kafka學習心得及總結

Kafka

   1.kafka是什麼?使用場景?

 kafka是一個高吞吐的分佈式消息隊列系統。特點是生產者消費者模式,先進先出(FIFO)保證順序,自己不丟數據,默認每隔7天清理數據。消息列隊常見場景:系統之間解耦合、峯值壓力緩衝、異步通信。底層使用的是nio的零拷貝,直接將信息寫入文件磁盤,不用經過用戶的內存空間。

   2.kafka生產消息、存儲消息、消費消息

 

                           

Kafka架構是由producer(消息生產者)、consumer(消息消費者)、borker(kafka集羣的server,負責處理消息讀、寫請求,存儲消息,在kafka cluster這一層這裏,其實裏面是有很多個broker)、topic(消息隊列/分類相當於隊列,裏面有生產者和消費者模型)、zookeeper(元數據信息存在zookeeper中,包括:存儲消費偏移量,topic話題信息,partition信息) 這些部分組成。

kafka裏面的消息是有topic來組織的,簡單的我們可以想象爲一個隊列,一個隊列就是一個topic,然後它把每個topic又分爲很多個partition,這個是爲了做並行的,在每個partition內部消息強有序,相當於有序的隊列,其中每個消息都有個序號offset,比如0到12,從前面讀往後面寫。一個partition對應一個broker,一個broker可以管多個partition,比如說,topic有6個partition,有兩個broker,那每個broker就管3個partition。這個partition可以很簡單想象爲一個文件,當數據發過來的時候它就往這個partition上面append,追加就行,消息不經過內存緩衝,直接寫入文件,kafka和很多消息系統不一樣,很多消息系統是消費完了我就把它刪掉,而kafka是根據時間策略刪除,而不是消費完就刪除,在kafka裏面沒有一個消費完這麼個概念,只有過期這樣一個概念。

producer自己決定往哪個partition裏面去寫,這裏有一些的策略,譬如如果hash,不用多個partition之間去join數據了。consumer自己維護消費到哪個offset,每個consumer都有對應的group,group內是queue消費模型(各個consumer消費不同的partition,因此一個消息在group內只消費一次),group間是publish-subscribe消費模型,各個group各自獨立消費,互不影響,因此一個消息在被每個group消費一次。

3.kafka的特點

  • 系統的特點:生產者消費者模型,FIFO

Partition內部是FIFO的,partition之間呢不是FIFO的,當然我們可以把topic設爲一個partition,這樣就是嚴格的FIFO。

  • 高性能:單節點支持上千個客戶端,百MB/s吞吐,接近網卡的極限
  • 持久性:消息直接持久化在普通磁盤上且性能好

直接寫到磁盤中去,就是直接append到磁盤裏去,這樣的好處是直接持久化,數據不會丟失,第二個好處是順序寫,然後消費數據也是順序的讀,所以持久化的同時還能保證順序,比較好,因爲磁盤順序讀比較好。

  • 分佈式:數據副本冗餘、流量負載均衡、可擴展

分佈式,數據副本,也就是同一份數據可以到不同的broker上面去,也就是當一份數據,磁盤壞掉的時候,數據不會丟失,比如3個副本,就是在3個機器磁盤都壞掉的情況下數據纔會丟,在大量使用情況下看這樣是非常好的,負載均衡,可擴展,在線擴展,不需要停服務。

  • 很靈活:消息長時間持久化+Client維護消費狀態

消費方式非常靈活,第一原因是消息持久化時間跨度比較長,一天或者一星期等,第二消費狀態自己維護消費到哪個地方了可以自定義消費偏移量。

4.kafka集羣搭建

   可以參照這篇博客https://www.cnblogs.com/expiator/p/9990171.html

    1.上傳kafka_2.10-0.8.2.2.tgz包到三個不同節點上,解壓。

      當然也可以直接下載  

wget http://labfile.oss.aliyuncs.com/courses/859/kafka_2.10-0.10.2.1.tgz

    2.配置../ kafka_2.10-0.8.2.2/config/server.properties文件

節點編號:(不同節點按0,1,2,3整數來配置)

真實數據存儲位置:

zookeeper的節點:

  3.啓動zookeeper集羣。

  4.三個節點上,啓動kafka:

bin/kafka-server-start.sh   config/server.properties

最好使用自己寫的腳本啓動,將啓動命令寫入到一個文件:

nohup bin/kafka-server-start.sh   config/server.properties > kafka.log 2>&1 &

 

腳本附件:

(放在與bin同一級別下,注意創建後要修改權限:chmod 755 startkafka.sh)

 

 5.相關命令:

創建topic:

./kafka-topics.sh --zookeeper node3:2181,node4:2181,node5:2181  --create --topic topic2017 --partitions 3 --replication-factor 3

用一臺節點控制檯來當kafka的生產者:

./kafka-console-producer.sh  --topic  topic2017

--broker-list node1:9092,node2:9092,node3:9092

用另一臺節點控制檯來當kafka的消費者:

./kafka-console-consumer.sh --zookeeper node3:2181,node4:2181,node5:2181 --topic topic2017

查看kafka中topic列表:

./kafka-topics.sh  --list --zookeeper node3:2181,node4:2181,node5:2181

查看kafka中topic的描述:

./kafka-topics.sh --describe --zookeeper node3:2181,node4:2181,node5:2181  --topic topic2017

注意:ISR是檢查數據的完整性有哪些個節點。

查看zookeeper中topic相關信息:

啓動zookeeper客戶端:

./zkCli.sh

查看topic相關信息:

ls /brokers/topics/

查看消費者相關信息:

ls /consumers

  6.刪除kafka中的數據。

  • :在kafka集羣中刪除topic,當前topic被標記成刪除。

./kafka-topics.sh --zookeeper node3:2181,node4:2181,node5:2181 --delete --topic t1205

在每臺broker節點上刪除當前這個topic對應的真實數據。

    • :進入zookeeper客戶端,刪除topic信息

rmr /brokers/topics/t1205

    • :刪除zookeeper中被標記爲刪除的topic信息

rmr /admin/delete_topics/t1205

5.kafka的leader的均衡機制

當一個broker停止或者crashes時,所有本來將它作爲leader的分區將會把leader轉移到其他broker上去,極端情況下,會導致同一個leader管理多個分區,導致負載不均衡,同時當這個broker重啓時,如果這個broker不再是任何分區的leader,kafka的client也不會從這個broker來讀取消息,從而導致資源的浪費。

kafka中有一個被稱爲優先副本(preferred replicas)的概念。如果一個分區有3個副本,且這3個副本的優先級別分別爲0,1,2,根據優先副本的概念,0會作爲leader 。當0節點的broker掛掉時,會啓動1這個節點broker當做leader。當0節點的broker再次啓動後,會自動恢復爲此partition的leader。不會導致負載不均衡和資源浪費,這就是leader的均衡機制。

在配置文件conf/ server.properties中配置開啓(默認就是開啓):

auto.leader.rebalance.enable true

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