柚子快報激活碼778899分享:Kafka基本原理|特性
柚子快報激活碼778899分享:Kafka基本原理|特性
Kafka是什么
Kafka是最初由Linkedin公司開發(fā),是一個分布式、支持分區(qū)的(partition)、多副本的(replica),基于zookeeper協(xié)調(diào)的分布式消息系統(tǒng) 它的最大的特性就是可以實時的處理大量數(shù)據(jù)以滿足各種需求場景:比如基于hadoop的批處理系統(tǒng)、低延遲的實時系統(tǒng)、storm/Spark流式處理引擎,web/nginx日志、訪問日志,消息服務(wù)等等,用scala語言編寫,Linkedin于2010年貢獻(xiàn)給了Apache基金會并成為頂級開源 項目。
Kafka的主要應(yīng)用場景
日志收集: 通過Kafka收集和聚合來自不同源的日志數(shù)據(jù)。 流式處理: 利用Kafka進(jìn)行實時數(shù)據(jù)流的處理和分析。 事件sourcing: 基于Kafka的事件驅(qū)動架構(gòu)進(jìn)行應(yīng)用開發(fā)。 數(shù)據(jù)管道: 使用Kafka在不同系統(tǒng)間傳輸和共享數(shù)據(jù)。
Kafka的特性
高吞吐:能夠每秒處理數(shù)百萬條消息,滿足大規(guī)模數(shù)據(jù)處理的需求,延遲最低只有幾毫秒
擴(kuò)展性:kafka集群支持熱擴(kuò)展,無需停機(jī)即可擴(kuò)展節(jié)點及節(jié)點上線。
持久性、可靠性:消息被持久化到本地磁盤,并且支持?jǐn)?shù)據(jù)備份防止數(shù)據(jù)丟失
容錯性:允許集群中節(jié)點失敗(若副本數(shù)量為n,則允許n-1個節(jié)點失?。?/p>
高并發(fā):支持?jǐn)?shù)千個客戶端同時讀寫
Kafka 的架構(gòu)原理
kafaka 底層架構(gòu) Producer:Producer即生產(chǎn)者,消息的產(chǎn)生者,是消息的入口。 Broker:kafka集群中包含一個或者多個服務(wù)實例(節(jié)點),這種服務(wù)實例被稱為broker(一個broker就是一個節(jié)點/一個服務(wù)器) Topic:每條發(fā)布到kafka集群的消息都屬于某個類別,這個類別就叫做topic Partition:partition是一個物理上的概念也叫分區(qū),每個topic包含一個或者多個partition。分區(qū)的作用是做負(fù)載,提高kafka的吞吐量。 Replication:每一個分區(qū)都有多個副本,副本的作用是做備胎。當(dāng)主分區(qū)(Leader)故障的時候會選擇一個備胎(Follower)上位,成為Leader。在kafka中默認(rèn)副本的最大數(shù)量是10個,且副本的數(shù)量不能大于Broker的數(shù)量,follower和leader是在不同的機(jī)器,同一機(jī)器對同一個分區(qū)也只可能存放一個副本(包括自己)。 Message:每一條發(fā)送的消息主體。 Consumer:消費者,即消息的消費方,是消息的出口。 Consumer Group:將多個消費者組成一個消費者組,同一個分區(qū)的數(shù)據(jù)只能被消費者組中的某一個消費者消費。 Zookeeper:kafka集群依賴zookeeper來保存集群的的元信息,來保證系統(tǒng)的可用性。
kafaka 的主要組件
producer(生產(chǎn)者) producer主要是用于生產(chǎn)消息,是kafka當(dāng)中的消息生產(chǎn)者,生產(chǎn)的消息通過topic進(jìn)行歸類,保存到kafka的broker里面去。 topic(主題) kafka將消息以topic為單位進(jìn)行歸類; topic特指kafka處理的消息源(feeds of messages)的不同分類; topic是一種分類。kafka主題始終是支持多用戶訂閱的;也就是說,一 個主題可以有零個,一個或者多個消費者訂閱寫入的數(shù)據(jù); 在kafka集群中,可以有無數(shù)的主題; 生產(chǎn)者和消費者消費數(shù)據(jù)一般以主題為單位,更細(xì)粒度可以到分區(qū)級別。 partition(分區(qū)) kafka當(dāng)中,topic是消息的歸類,一個topic可以有多個分區(qū)(partition),每個分區(qū)保存部分topic的數(shù)據(jù),所有的partition當(dāng)中的數(shù)據(jù)全部合并起來,就是一個topic當(dāng)中的所有的數(shù)據(jù)。 一個broker服務(wù)下,可以創(chuàng)建多個分區(qū); 每一個分區(qū)會有一個編號:編號從0開始。 每一個分區(qū)內(nèi)的數(shù)據(jù)是有序的,但全局的數(shù)據(jù)不能保證是有序的。(有序是指生產(chǎn)什么樣順序,消費時也是什么樣的順序) consumer(消費者) consumer是kafka當(dāng)中的消費者,主要用于消費kafka當(dāng)中的數(shù)據(jù),消費者一定是歸屬于某個消費組中的。 consumer group(消費者組) 消費者組由一個或者多個消費者組成,同一個組中的消費者對于同一條消息只消費一次。
每個消費者都屬于某個消費者組,如果不指定,那么所有的消費者都屬于默認(rèn)的組。
每個消費者組都有一個ID,即group ID。組內(nèi)的所有消費者協(xié)調(diào)在一起來消費一個訂閱主題( topic)的所有分區(qū)(partition)。當(dāng)然,每個分區(qū)只能由同一個消費組內(nèi)的一個消費者(consumer)來消費,可以由不同的消費組來消費。
partition數(shù)量決定了每個consumer group中并發(fā)消費者的最大數(shù)量。如下圖:
如上面左圖所示,如果只有兩個分區(qū),即使一個組內(nèi)的消費者有4個,也會有兩個空閑的。 如上面右圖所示,有4個分區(qū),每個消費者消費一個分區(qū),并發(fā)量達(dá)到最大4。
在來看如下一幅圖:
如上圖所示,不同的消費者組消費同一個topic,這個topic有4個分區(qū),分布在兩個節(jié)點上。左邊的 消費組1有兩個消費者,每個消費者就要消費兩個分區(qū)才能把消息完整的消費完,右邊的 消費組2有四個消費者,每個消費者消費一個分區(qū)即可。
總結(jié)下kafka中分區(qū)與消費組的關(guān)系
消費組: 由一個或者多個消費者組成,同一個組中的消費者對于同一條消息只消費一次。 某一個主題下的分區(qū)數(shù),對于消費該主題的同一個消費組下的消費者數(shù)量,應(yīng)該小于等于該主題下的分區(qū)數(shù)。 同一個分區(qū)下的數(shù)據(jù),在同一時刻,不能同一個消費組的不同消費者消費。 分區(qū)數(shù)越多,同一時間可以有越多的消費者來進(jìn)行消費,消費數(shù)據(jù)的速度就會越快,提高消費的性能。
partition replicas(分區(qū)副本) kafka 中的分區(qū)副本如下圖所示:
kafka 分區(qū)副本
副本數(shù)(replication-factor):控制消息保存在幾個broker(服務(wù)器)上,一般情況下副本數(shù)等于broker的個數(shù)。
一個broker服務(wù)下,不可以創(chuàng)建多個副本因子。創(chuàng)建主題時,副本因子應(yīng)該小于等于可用的broker數(shù)。
副本因子操作以分區(qū)為單位的。每個分區(qū)都有各自的主副本和從副本;
主副本叫做leader,從副本叫做 follower(在有多個副本的情況下,kafka會為同一個分區(qū)下的所有分區(qū),設(shè)定角色關(guān)系:一個leader和N個 follower),處于同步狀態(tài)的副本叫做in-sync-replicas(ISR);
follower通過拉的方式從leader同步數(shù)據(jù)。 消費者和生產(chǎn)者都是從leader讀寫數(shù)據(jù),不與follower交互。
副本因子的作用:讓kafka讀取數(shù)據(jù)和寫入數(shù)據(jù)時的可靠性。
副本因子是包含本身,同一個副本因子不能放在同一個broker中。
如果某一個分區(qū)有三個副本因子,就算其中一個掛掉,那么只會剩下的兩個中,選擇一個leader,但不會在其他的broker中,另啟動一個副本(因為在另一臺啟動的話,存在數(shù)據(jù)傳遞,只要在機(jī)器之間有數(shù)據(jù)傳遞,就會長時間占用網(wǎng)絡(luò)IO,kafka是一個高吞吐量的消息系統(tǒng),這個情況不允許發(fā)生)所以不會在另一個broker中啟動。
如果所有的副本都掛了,生產(chǎn)者如果生產(chǎn)數(shù)據(jù)到指定分區(qū)的話,將寫入不成功。
lsr表示:當(dāng)前可用的副本。
kafka中的數(shù)據(jù)不丟失機(jī)制
生產(chǎn)者生產(chǎn)數(shù)據(jù)不丟失 發(fā)送消息方式 生產(chǎn)者發(fā)送給kafka數(shù)據(jù),可以采用同步方式或異步方式
同步方式:
發(fā)送一批數(shù)據(jù)給kafka后,等待kafka返回結(jié)果:
生產(chǎn)者等待10s,如果broker沒有給出ack響應(yīng),就認(rèn)為失敗。 生產(chǎn)者重試3次,如果還沒有響應(yīng),就報錯. 異步方式:
發(fā)送一批數(shù)據(jù)給kafka,只是提供一個回調(diào)函數(shù):
先將數(shù)據(jù)保存在生產(chǎn)者端的buffer中。buffer大小是2萬條 。 滿足數(shù)據(jù)閾值或者數(shù)量閾值其中的一個條件就可以發(fā)送數(shù)據(jù)。 發(fā)送一批數(shù)據(jù)的大小是500條。 注:如果broker遲遲不給ack,而buffer又滿了,開發(fā)者可以設(shè)置是否直接清空buffer中的數(shù)據(jù)。
ack機(jī)制(確認(rèn)機(jī)制) 生產(chǎn)者數(shù)據(jù)發(fā)送出去,需要服務(wù)端返回一個確認(rèn)碼,即ack響應(yīng)碼;ack的響應(yīng)有三個狀態(tài)值0,1,-1
0:生產(chǎn)者只負(fù)責(zé)發(fā)送數(shù)據(jù),不關(guān)心數(shù)據(jù)是否丟失,丟失的數(shù)據(jù),需要再次發(fā)送
1:partition的leader收到數(shù)據(jù),不管follow是否同步完數(shù)據(jù),響應(yīng)的狀態(tài)碼為1
-1:所有的從節(jié)點都收到數(shù)據(jù),響應(yīng)的狀態(tài)碼為-1
如果broker端一直不返回ack狀態(tài),producer永遠(yuǎn)不知道是否成功;producer可以設(shè)置一個超時時間10s,超過時間認(rèn)為失敗。
broker中數(shù)據(jù)不丟失 在broker中,保證數(shù)據(jù)不丟失主要是通過副本因子(冗余),防止數(shù)據(jù)丟失。 消費者消費數(shù)據(jù)不丟失 在消費者消費數(shù)據(jù)的時候,只要每個消費者記錄好offset值即可,就能保證數(shù)據(jù)不丟失。也就是需要我們自己維護(hù)偏移量(offset),可保存在 Redis 中。
參考文章:https://www.cnblogs.com/itlz/p/14292104.html
柚子快報激活碼778899分享:Kafka基本原理|特性
參考文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。