kafka的簡單學習

源於螞蟻課堂的學習,點擊這裏查看(老餘很給力)   

kafka優點 

高吞吐量

1.使用順序寫方式實現數據存儲
Kafka是採用不斷的將數據追加到文件中,該特性利用了磁盤的順序讀寫性能比傳統的磁盤讀寫可以減少尋地址浪費的時間;
2.能夠支持生產者與消費者(批量發送和批量消費) 減少io操作
可以將消息投遞到緩存區中,在以定時或者/緩存大小方式將數據寫入到MQ服務器中,
這樣可以減少IO的網絡操作,但是這種方式也存在很大缺陷數據可能會丟失。
3.數據零拷貝
4.實現數據的分區 
根據Partition實現對我們的數據的分區
5.數據的壓縮  會對我們的數據實現壓縮,減少網絡的傳輸

kafka的核心組件

Broker 

Kafka節點,一個Kafka節點就是一個broker,多個broker可以組成一個Kafka集羣

 Topic

消息存放的目錄即主題,例如page view日誌、click日誌等都可以以topic的形式存在,Kafka集羣能夠同時負責多個topic的分發

Massage

Kafka中最基本的傳遞對象

Partition 

Topic物理上的分組,一個Topic可以分爲多個Partition,每個Partition是一個有序的隊列

Segment 

Partition物理上由多個Segment組成,每個Segment存着Message信息

Producer 

生產者,生產Message發送到Topic

Consumer

消費者,訂閱Topic並消費Message, Consumer作爲一個線程來消費

Consumer Group 

消費者組,一個Consumer Group包含多個Consumer

Offset

偏移量,理解爲消息Partition中的索引即可

集羣環境搭建 

Zookeeper集羣環境
在zk的配置文件zoo_sample.cfg中新增
server.0=192.168.212.174:2888:3888
server.1=192.168.212.175:2888:3888
server.2=192.168.212.176:2888:3888
修改配置
dataDir=/usr/kafka/zookeeper/data(注意同時在zookeeper創建data目錄)



每臺zk服務器節點,創建服務器標識
創建文件夾: mkdir data
創建文件myid並填寫內容爲0: vi
myid (內容爲服務器標識 : 0)


關閉每臺服務器節點防火牆,systemctl stop firewalld.service
啓動Zookeeper


kafka集羣
tar -zxvf kafka_2.11-1.0.0.tgz
mv kafka_2.12-0.11.0.0 kafka
vi ./kafka/config/server.properties
broker.id=0
listeners=PLAINTEXT://192.168.131.130:9092
zookeeper.connect=192.168.212.164:2181,192.168.212.167:2181,192.168.212.168:2181

其他兩臺只需要修改server.properties中的broker.id分別爲 1 ,2

集羣環境測試

1、開啓3臺虛擬機的zookeeper程序 
/usr/local/zookeeper/bin/zkServer.sh start 
開啓成功後查看zookeeper集羣的狀態 
/usr/local/zookeeper/bin/zkServer.sh status 
出現Mode:follower或是Mode:leader則代表成功 
2、在後臺開啓3臺虛擬機的kafka程序(cd /usr/local/kafka) 
./bin/kafka-server-start.sh -daemon config/server.properties 
3、在其中一臺虛擬機(192.168.131.130)創建topic 
/usr/local/kafka/bin/kafka-topics.sh --create –zookeeper 192.168.212.131:2181 –replication-factor 3 –partitions 1 –topic my-replicated-topic 
// 查看創建的topic信息 
/usr/local/kafka/bin/kafka-topics.sh –describe –zookeeper 192.168.212.132:2181 –topic my-replicated-topic 

如何保證消息順序

消息順序消費產生原因 

不同行爲的消息在消費時,多個消費者消費能力不同,導致後面的消息先於前面的消息消費
不同行爲的消息投放至不同的broker中,一個消費者獲取消息時順序可能被打亂

注意:只有不同行爲纔會有可能導致消息順序消費問題,相同行爲誰先誰後理論上無意義。

例如:insert update delete 三條消息進行消費,在消費者能力不同的情況下,可能出現消費者1消費insert
    消費者2消費update,消費者2消費完成後手動ack,消費者1還未消費完,此時消息又推送至消費者2消費,
    理論上insert消費完成後纔會運行update和delete,所以出現問題
    
    再有,消費者獲取消息時順序可能打亂,先消費了update,後消費insert。

解決方法

解決思路在於,消費者消費同一個broker的消息時,可以保證其順序。
所以,我們可以使用策略將想要維護順序的消息,儘量使其落在同一個broker中即可。

故消息投遞時採用消息key的方式計算hash取模broker,使其相同key落在同一個broker中,消費者進行消費。
這裏消費者必須是一個,多個消費者無法解決順序問題。

但一個消費者其吞吐量慘淡,故採用緩存的設計優化,即消費者批量獲取消息,然後將消費使用相同方式計算key落在內存隊列中。
每個內存隊列對應唯一的線程處理消息。此方式會出現數據丟失

還有就是分組,將消費者分成一個組,多個消費者對應多個broker,kafka會使其合理分配,即一個消費者只消費一個broker的消息

 

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