柚子快報(bào)激活碼778899分享:KafKa核心概念
柚子快報(bào)激活碼778899分享:KafKa核心概念
傳統(tǒng)的消息隊(duì)列的概念 Java中關(guān)于消息隊(duì)列是有規(guī)范在的—JMS(Java Message Service)規(guī)范,概念如下圖: KafKa有哪些自己的特性呢?
分區(qū)和集群
將數(shù)據(jù)流分成多個分區(qū),每個分區(qū)可以獨(dú)立地進(jìn)行讀寫操作。每個Topic由多個分區(qū)組成,這些分區(qū)可以分布在集群中的不同Broker上。
以發(fā)布訂閱的模式為例,消息的生產(chǎn)和消費(fèi)都是面向Topic的,既然Topic是分成多個分區(qū)的,每個分區(qū)又能獨(dú)立的進(jìn)行讀寫操作,所以在生產(chǎn)和消費(fèi)的時候能夠?qū)崿F(xiàn)多實(shí)例并發(fā)操作,減輕單個實(shí)例的負(fù)載。
多個Broker協(xié)作組成了集群。
Controller選舉過程
(搶占----上線----唯一----監(jiān)聽等待):
第一次啟動Kafka集群時,會同時啟動多個Broker節(jié)點(diǎn),每一個Broker節(jié)點(diǎn)就會連接ZooKeeper,并嘗試創(chuàng)建一個臨時節(jié)點(diǎn) /controller(搶占)因?yàn)閆ooKeeper中一個節(jié)點(diǎn)不允許重復(fù)創(chuàng)建,所以多個Broker節(jié)點(diǎn),最終只能有一個Broker節(jié)點(diǎn)可以創(chuàng)建成功,那么這個創(chuàng)建成功的Broker節(jié)點(diǎn)就會自動作為Kafka集群控制器節(jié)點(diǎn),用于管理整個Kafka集群。沒有選舉成功的其他Slave節(jié)點(diǎn)會創(chuàng)建Node監(jiān)聽器,用于監(jiān)聽 /controller節(jié)點(diǎn)的狀態(tài)變化。一旦Controller節(jié)點(diǎn)出現(xiàn)故障或掛掉了,那么對應(yīng)的ZooKeeper客戶端連接就會中斷。ZooKeeper中的 /controller 節(jié)點(diǎn)就會自動被刪除,而其他的那些Slave節(jié)點(diǎn)因?yàn)樵黾恿吮O(jiān)聽器,所以當(dāng)監(jiān)聽到 /controller 節(jié)點(diǎn)被刪除后,就會馬上向ZooKeeper發(fā)出創(chuàng)建 /controller 節(jié)點(diǎn)的請求,一旦創(chuàng)建成功,那么該Broker就變成了新的Controller節(jié)點(diǎn)了, 稱為Controller節(jié)點(diǎn)后會接管管理工作,加載最新的元數(shù)據(jù),并將元數(shù)據(jù)同步給其他Slave Broker。
Controller作為管理人員主要的管理內(nèi)容:
監(jiān)聽Broker的狀態(tài),上下線,數(shù)據(jù)在/brokers/ids進(jìn)行Topic的管理,增刪改查。 /brokers/topicsPartition的管理。分區(qū)Leader的選舉。分區(qū)副本的分配。
Broker包含的服務(wù):
kafka 的消息可靠性
生產(chǎn)端的ACK參數(shù):
ACK值含義0當(dāng)生產(chǎn)數(shù)據(jù)時,生產(chǎn)者對象將數(shù)據(jù)通過網(wǎng)絡(luò)客戶端將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)數(shù)據(jù)流中的時候,Kafka就對當(dāng)前的數(shù)據(jù)請求進(jìn)行了響應(yīng)(確認(rèn)應(yīng)答)1當(dāng)生產(chǎn)數(shù)據(jù)時,Kafka Leader副本將數(shù)據(jù)接收到并寫入到了日志文件后,就會對當(dāng)前的數(shù)據(jù)請求進(jìn)行響應(yīng)(確認(rèn)應(yīng)答)-1默認(rèn)當(dāng)生產(chǎn)數(shù)據(jù)時,Kafka Leader副本和ISR Follower副本都已經(jīng)將數(shù)據(jù)接收到并寫入到了日志文件后,再對當(dāng)前的數(shù)據(jù)請求進(jìn)行響應(yīng)(確認(rèn)應(yīng)答)
問題優(yōu)化過程 ACK參數(shù)可以根據(jù)不同業(yè)務(wù)場景對數(shù)據(jù)響應(yīng)速度以及數(shù)據(jù)響應(yīng)的準(zhǔn)確度的要求進(jìn)行配置。 實(shí)際業(yè)務(wù)場景中會存在不可預(yù)知的消息不可靠問題,比如網(wǎng)絡(luò)因素發(fā)送不成功,或者響應(yīng)的丟失等,由此kafka增加數(shù)據(jù)重試機(jī)制。 數(shù)據(jù)重試直接能導(dǎo)致的問題就是重復(fù)和亂序。解決方法是數(shù)據(jù)的冪等性。 冪等性是給Batch Data一個SeqNum并且結(jié)合生產(chǎn)者的ProducerID,給批數(shù)據(jù)一個唯一性的標(biāo)識,同時消耗時間和性能(做部分緩沖比對)達(dá)到數(shù)據(jù)的有序和唯一。
KafKa實(shí)現(xiàn)事務(wù)的必要條件:原子性、一致性、隔離性和永久性(ACID)基本滿足。
冪等性(Idempotence):事務(wù)支持確保生產(chǎn)者的冪等性,即同一條消息不會被重復(fù)寫入。Kafka通過為每個生產(chǎn)者分配一個唯一的PID(Producer ID)來實(shí)現(xiàn)冪等性。原子性(Atomicity):事務(wù)操作要么全部成功要么全部失敗,保證消息的一致性。隔離性(Isolation):事務(wù)消息對消費(fèi)者不可見,直到事務(wù)提交。消費(fèi)者可以配置isolation.level=read_committed來確保只讀取已提交的消息。持久性(Durability):一旦事務(wù)提交,消息被持久化到Kafka日志中,保證消息不會丟失。
所以實(shí)現(xiàn)數(shù)據(jù)傳輸精準(zhǔn)一次的條件:
ack=-1 + 分區(qū)副本數(shù)>=2 + ISR最小副本數(shù)量>=2開啟事務(wù)冪等性
附錄: 消息隊(duì)列的對比:
Zookeeper中元數(shù)據(jù)的節(jié)點(diǎn)和作用
節(jié)點(diǎn)類型說明/admin/delete_topics持久化節(jié)點(diǎn)配置需要刪除的topic,因?yàn)閯h除過程中,可能broker下線,或執(zhí)行失敗,那么就需要在broker重新上線后,根據(jù)當(dāng)前節(jié)點(diǎn)繼續(xù)刪除操作,一旦topic所有的分區(qū)數(shù)據(jù)全部刪除,那么當(dāng)前節(jié)點(diǎn)的數(shù)據(jù)才會進(jìn)行清理/brokers/ids持久化節(jié)點(diǎn)服務(wù)節(jié)點(diǎn)ID標(biāo)識,只要broker啟動,那么就會在當(dāng)前節(jié)點(diǎn)中增加子節(jié)點(diǎn),brokerID不能重復(fù)/brokers/topics持久化節(jié)點(diǎn)服務(wù)節(jié)點(diǎn)中的主題詳細(xì)信息,包括分區(qū),副本/brokers/seqid持久化節(jié)點(diǎn)seqid主要用于自動生產(chǎn)brokerId/config/changes持久化節(jié)點(diǎn)kafka的元數(shù)據(jù)發(fā)生變化時,會向該節(jié)點(diǎn)下創(chuàng)建子節(jié)點(diǎn)。并寫入對應(yīng)信息/config/clients持久化節(jié)點(diǎn)客戶端配置,默認(rèn)為空/config/brokers持久化節(jié)點(diǎn)服務(wù)節(jié)點(diǎn)相關(guān)配置,默認(rèn)為空/config/ips持久化節(jié)點(diǎn)IP配置,默認(rèn)為空/config/topics持久化節(jié)點(diǎn)主題配置,默認(rèn)為空/config/users持久化節(jié)點(diǎn)用戶配置,默認(rèn)為空/consumers持久化節(jié)點(diǎn)消費(fèi)者節(jié)點(diǎn),用于記錄消費(fèi)者相關(guān)信息/isr_change_notification持久化節(jié)點(diǎn)ISR列表發(fā)生變更時候的通知,在kafka當(dāng)中由于存在ISR列表變更的情況發(fā)生,為了保證ISR列表更新的及時性,定義了isr_change_notification這個節(jié)點(diǎn),主要用于通知Controller來及時將ISR列表進(jìn)行變更。/latest_producer_id_block持久化節(jié)點(diǎn)保存PID塊,主要用于能夠保證生產(chǎn)者的任意寫入請求都能夠得到響應(yīng)。/log_dir_event_notification持久化節(jié)點(diǎn)主要用于保存當(dāng)broker當(dāng)中某些數(shù)據(jù)路徑出現(xiàn)異常時候,例如磁盤損壞,文件讀寫失敗等異常時候,向ZooKeeper當(dāng)中增加一個通知序號,Controller節(jié)點(diǎn)監(jiān)聽到這個節(jié)點(diǎn)的變化之后,就會做出對應(yīng)的處理操作/cluster/id持久化節(jié)點(diǎn)主要用于保存kafka集群的唯一id信息,每個kafka集群都會給分配要給唯一id,以及對應(yīng)的版本號
柚子快報(bào)激活碼778899分享:KafKa核心概念
好文閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。