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 |