什么是kafka瓶殃?
kafka是分布式發(fā)布-訂閱消息系統(tǒng)堤舒,是一種分布式的消息隊(duì)列工具
kafka是一個(gè)分布式的,可分區(qū)的右钾,可復(fù)制的消息系統(tǒng)
kafka對消息保存的時(shí)候根據(jù)topic進(jìn)行分類轻要,發(fā)送消息者稱為Producer复旬,消息接受者稱為consumer,此外kafka集群由多個(gè)kafka實(shí)例組成冲泥,每個(gè)實(shí)例稱為broker
依賴zookeeper來保證系統(tǒng)的可用性驹碍,保存元數(shù)據(jù)信息
Kafka的設(shè)計(jì)
1,吞吐量
數(shù)據(jù)磁盤持久化:消息不在內(nèi)存中cache柏蘑,直接寫入到磁盤幸冻,充分利用磁盤的順序讀寫性能
zero-copy:減少IO操作步驟
數(shù)據(jù)批量發(fā)送
數(shù)據(jù)壓縮
Topic劃分為多個(gè)partition,提高parallelism
2咳焚,負(fù)載均衡
producer根據(jù)用戶指定的算法,將消息發(fā)送到指定的partition
存在多個(gè)partiiton庞溜,每個(gè)partition有自己的replica革半,每個(gè)replica分布在不同的Broker節(jié)點(diǎn)上
多個(gè)partition需要選取出lead partition,lead partition負(fù)責(zé)讀寫流码,并由zookeeper負(fù)責(zé)fail over
通過zookeeper管理broker與consumer的動態(tài)加入與離開
3又官,拉取系統(tǒng)
kafka broker會持久化數(shù)據(jù),broker沒有內(nèi)存壓力漫试,因此六敬,consumer非常適合采取pull的方式消費(fèi)數(shù)據(jù)
consumer根據(jù)消費(fèi)能力自主控制消息拉取速度
consumer根據(jù)自身情況自主選擇消費(fèi)模式,例如批量驾荣,重復(fù)消費(fèi)外构,從尾端開始消費(fèi)等
4普泡,可擴(kuò)展性
當(dāng)需要增加broker結(jié)點(diǎn)時(shí),新增的broker會向zookeeper注冊审编,而producer及consumer會根據(jù)注冊在zookeeper上的watcher感知這些變化撼班,并及時(shí)作出調(diào)整。
kafka特點(diǎn)
1垒酬,高吞吐率
Kafka 每秒可以生產(chǎn)約 25萬消息(50 MB)砰嘁,每秒處理 55 萬消息(110 MB)
2,持久化數(shù)據(jù)存儲
可進(jìn)行持久化操作勘究。將消息持久化到磁盤矮湘,因此可用于批量消費(fèi),例如 ETL口糕,以及實(shí)時(shí)應(yīng)用程序缅阳。通過將數(shù)據(jù)持久化到硬盤以及 replication 防止數(shù)據(jù)丟失。
3走净,分布式系統(tǒng)易于擴(kuò)展
所有的 producer券时、broker 和 consumer都會有多個(gè),均為分布式的伏伯。無需停機(jī)即可擴(kuò)展機(jī)器
4橘洞,客戶端狀態(tài)維護(hù)
消息被處理的狀態(tài)是在 consumer 端維護(hù),而不是由 server 端維護(hù)说搅。減輕服務(wù)器端的壓力炸枣,為客戶端會話管理提供了更好的靈活性。
ETL
Extract-Transform-load 數(shù)據(jù)抽取弄唧,轉(zhuǎn)換和裝載适肠,能夠完成數(shù)據(jù)從數(shù)據(jù)源到目標(biāo)倉庫轉(zhuǎn)換的過程,從而有效的構(gòu)建起數(shù)據(jù)倉庫
數(shù)據(jù)抽取
從各種互聯(lián)網(wǎng)資源候引、業(yè)務(wù)系統(tǒng)侯养、各種數(shù)據(jù)庫及數(shù)據(jù)格式、各種應(yīng)用中抽取數(shù)據(jù)澄干」淇可以看出數(shù)據(jù)源是異構(gòu)的,各種關(guān)系型和非關(guān)系型數(shù)據(jù)庫麸俘、半格式化文本文件辩稽、CSV文件、XML文件等从媚。這些數(shù)據(jù)被抽取出來后逞泄,暫存于內(nèi)存中,等待后續(xù)處理
數(shù)據(jù)轉(zhuǎn)換
需要對加載的數(shù)據(jù)做轉(zhuǎn)換、清洗等處理
數(shù)據(jù)裝載
將轉(zhuǎn)換之后的數(shù)據(jù)裝載到目的庫中
概念
1喷众,topic主題
一個(gè)topic是對一組消息的歸納
在一個(gè)Kafka集群中各谚,可以創(chuàng)建多個(gè)topic主題,以topic主題為單位管理消息侮腹,kafka中多個(gè)topic主題之間是互相隔離互不影響嘲碧,從而可以在一個(gè)Kafka集群中通過創(chuàng)建多個(gè)topic主題實(shí)現(xiàn)不同的使用者獨(dú)立使用不同topic主題而互不影響。
2父阻,partition分區(qū)
topic可以劃分出多個(gè)分區(qū)愈涩,利用分區(qū)機(jī)制保證每個(gè)分區(qū)的數(shù)據(jù)量不會太大, 可以在單個(gè)服務(wù)器上保存
分區(qū)是kafka實(shí)現(xiàn)負(fù)載均衡和失敗恢復(fù)分布式數(shù)據(jù)存儲的基本單元
每個(gè)分區(qū)可以單獨(dú)發(fā)布和消費(fèi)加矛,為并發(fā)操作topic提供了可能
3履婉,offset序號
每個(gè)分區(qū)都由一系列有序的,不可變的消息組成斟览,這些消息被連續(xù)追加到分區(qū)中
分區(qū)中的每個(gè)消息都由一個(gè)連續(xù)的序列號叫做offset毁腿,用來在分區(qū)中唯一的標(biāo)識這個(gè)消息
在一個(gè)可配置的時(shí)間段內(nèi),Kafka集群保留所有發(fā)布的消息苛茂,不管這些消息有沒有被消費(fèi)已烤。
可以設(shè)置消息的保存策略,制定保存期限妓羊,在期限到來之前胯究,數(shù)據(jù)會一直存在,無論是否被消費(fèi)國躁绸,當(dāng)保存期限結(jié)束裕循,消息會被連續(xù)的擦除,釋放空間
一系列的機(jī)制保證了kafka當(dāng)中數(shù)據(jù)的連續(xù)讀寫磁盤净刮,保證了性能剥哑,從而使得kafka的性能與數(shù)據(jù)量無關(guān),只和磁盤的性能是常量級的
4淹父,Replication復(fù)本
每個(gè)分區(qū)擁有若干復(fù)本株婴,這些復(fù)本存放在不同的服務(wù)器中
若干個(gè)副本中,有一個(gè)稱為leader負(fù)責(zé)讀寫操作暑认,而其他的作為Leader督暂,負(fù)責(zé)同步leader中的數(shù)據(jù),對外只提供讀的能力
kafka不是以broker為單位劃分leader穷吮,follwer,而是以副本為單位劃分饥努;這樣捡鱼,集群中的每一個(gè)broker是持有一部分分區(qū)的leader和另一部分分區(qū)的follwer,從而將寫的壓力分?jǐn)偟讲煌腷roken中取酷愧,利用分布式分?jǐn)倢懙膲毫菡嵘阅?/p>
5缠诅,Producer生產(chǎn)者
生產(chǎn)者將消息發(fā)布到制定的主題中,默認(rèn)使用簡單的負(fù)載均衡機(jī)制選擇分區(qū)乍迄,如果需要可以通過特定的分區(qū)函數(shù)選擇分區(qū)管引,制定發(fā)布到哪個(gè)分區(qū)
6,Consumer消費(fèi)者
Consumer負(fù)責(zé)消費(fèi)主題中的數(shù)據(jù)闯两,消費(fèi)時(shí)由Consumer自己來維護(hù)會話產(chǎn)生的數(shù)據(jù)褥伴,實(shí)際上每個(gè)consumer唯一需要維護(hù)的數(shù)據(jù)是消息在日志中的位置,也就是offset漾狼,一般情況下隨著Consumer不斷的讀取消息重慢,這offset的值不斷增加,從而實(shí)現(xiàn)連續(xù)讀取數(shù)據(jù)
7,Broker
集群匯中的一臺或多臺服務(wù)器統(tǒng)稱為broker
消費(fèi)者消費(fèi)數(shù)據(jù)的模式
發(fā)布訂閱模式:多個(gè)Consumer可以同時(shí)從服務(wù)端讀取數(shù)據(jù)逊躁,Consumer之間互不影響似踱,每個(gè)Consumer都可以讀取到全量的數(shù)據(jù)。達(dá)成了多個(gè)Consumer之間共享數(shù)據(jù)的效果稽煤。
隊(duì)列模式:多個(gè)Consumer可以同時(shí)從服務(wù)端讀取消息核芽,每個(gè)消息只被其中一個(gè)Consumer讀到。達(dá)成多個(gè)Consumer之間競爭數(shù)據(jù)的效果酵熙。
8轧简,消費(fèi)者組的概念
在Kafka中可以將多個(gè)消費(fèi)者組成一個(gè)消費(fèi)者組。
在消費(fèi)者組內(nèi)绿店,多個(gè)消費(fèi)者而形成競爭狀態(tài)吉懊,互相搶奪數(shù)據(jù)。同一份消息只能被一個(gè)消費(fèi)者組內(nèi)的消費(fèi)者消費(fèi)一次假勿。
在消費(fèi)者組之間借嗽,多個(gè)消費(fèi)者形成共享狀態(tài),共享數(shù)據(jù)转培。同一份消息會同時(shí)被多個(gè)消費(fèi)者組各自消費(fèi)到
Kafka在大數(shù)據(jù)環(huán)境下的優(yōu)勢
分布式存儲數(shù)據(jù)恶导,易于擴(kuò)展
利用磁盤存儲數(shù)據(jù),按照主題浸须,分區(qū)來分布式的存放數(shù)據(jù)惨寿,持久化存儲,提供海量數(shù)據(jù)的存儲能力删窒,數(shù)據(jù)不會意外的丟失裂垦,提供了更好的可靠性,連續(xù)讀寫保證了性能肌索,性能和磁盤的性能有關(guān)蕉拢,和數(shù)據(jù)量的大小無關(guān)
發(fā)送數(shù)據(jù)流程
生產(chǎn)者根據(jù)制定的partition方法(round-robin,hash),將消息發(fā)布到制定topic的partition中
kafka集群接收到Producer發(fā)過來的消息后晕换,將其持久化到硬盤午乓,并保留消息指定時(shí)長(可配置),而不關(guān)注消息是否被消費(fèi)
Consumer從kafka中pull數(shù)據(jù)闸准,并控制獲取消息的offset
kafka是pull模式益愈,flume是push模式
Kafka的存儲策略
kafka通過topic來分主題存放數(shù)據(jù),主題內(nèi)又有分區(qū)夷家,分區(qū)還可以有多個(gè)副本 蒸其。
從物理結(jié)構(gòu)來看,分區(qū)本身是kafka存儲目錄下的一個(gè)文件夾瘾英,文件夾名稱是主題名加分區(qū)編號枣接,編號從0開始
分區(qū)的內(nèi)部還有segment的概念,其實(shí)就是在分區(qū)對應(yīng)的文件夾下產(chǎn)生的文件缺谴,
一個(gè)分區(qū)會被劃分為大小相等的若干個(gè)segment但惶,一方面保證了分區(qū)的數(shù)據(jù)被劃分到多個(gè)文件中(保證了文件的體積不會太大),另一方面可以基于這些segment文件進(jìn)行歷史數(shù)據(jù)的刪除湿蛔,提高效率
一個(gè)segment由一個(gè).log和一個(gè).index文件組成膀曾,其中.log文件為數(shù)據(jù)文件用來存儲數(shù)據(jù)分段數(shù)據(jù),.index為索引文件保存對應(yīng)的.log文件的索引信息
這兩個(gè)文件的命名規(guī)則:partition全局的第一個(gè)segment從0開始阳啥,后續(xù)的每個(gè)segment文件名為上一個(gè)segment文件的最后一條消息的offset值
通過查找.index文件可以獲知每個(gè)存儲在當(dāng)前segment中的offset在.log文件中的開始位置
每條日志有固定格式:包括offset編號添谊,日志長度,key的長度察迟,通過這個(gè)固定格式的數(shù)據(jù)可以確定出當(dāng)前offset的結(jié)束位置斩狱,從而對數(shù)據(jù)進(jìn)行讀取
Kafka的可靠性保障AR ISR OSR
1,AR
kafka分區(qū)中扎瓶,維護(hù)了一個(gè)AR列表所踊,其中包括了所有的分區(qū)的副本編號,AR分為ISR和OSR
2概荷,ISR
同步列表秕岛,只有當(dāng)所有的ISR內(nèi)的副本都同步了leader中的數(shù)據(jù),數(shù)據(jù)才能被提交误证,才能被消費(fèi)者訪問
3继薛,OSR
非同步列表,OSR內(nèi)的副本是否同步了leader的數(shù)據(jù)愈捅,不影響數(shù)據(jù)的提交遏考,OSR內(nèi)的follower只是盡力的去同步leader,數(shù)據(jù)版本可能落后蓝谨。
最開始所有的副本都在ISR中诈皿,在kafka工作的過程中林束,如果某個(gè)副本同步速度慢于replica.lag.time.max.ms指定的閾值,則被踢出ISR 存入OSR稽亏,如果后續(xù)速度恢復(fù)可以回到ISR中
這種方案是介于leader獨(dú)裁和所有民主方式之間,更加的靈活缕题,相對于zookeeper的過半同意過半存活機(jī)制截歉,提供了更好的可用性。犧牲了一部分的可靠性烟零,換來的可用性對于kafka這樣的消息隊(duì)列來說很有意義
LEO HW
1瘪松,LEO-LogEndOffset
分區(qū)的最新的數(shù)據(jù)的offset,只要有數(shù)據(jù)寫入分區(qū)锨阿,LEO就指向最新的數(shù)據(jù)宵睦,無論這個(gè)數(shù)據(jù)是否在ISR中同步完成
2,HW-HignWatermark
消費(fèi)者能夠看到的最大的offset墅诡,這個(gè)offset或者小于這個(gè)的offset的數(shù)據(jù)可以被消費(fèi)者訪問壳嚎;而大于這個(gè)offset的數(shù)據(jù),要么不存末早,要么沒有同步完成烟馅,外界無法訪問
分區(qū)同步數(shù)據(jù)的截?cái)鄼C(jī)制
如果leader宕機(jī),選舉出新的leader然磷,所有的副本都會講數(shù)據(jù)截?cái)嗟絣eader之前的hw位郑趁,保證所有的副本不會持有未同步完成的數(shù)據(jù),這個(gè)機(jī)制稱之為截?cái)鄼C(jī)制姿搜;此時(shí)即使舊的leader恢復(fù)寡润,稱為follwer,也要先截?cái)鄶?shù)據(jù)到宕機(jī)之前的hw為舅柜,再和新的leader同步數(shù)據(jù)梭纹,保證數(shù)據(jù)的可靠
截?cái)鄼C(jī)制保證了,在leader切換的過程中业踢,數(shù)據(jù)基于HW保持同步栗柒。
Kafka和RabbitMQ的區(qū)別
1,架構(gòu)方面不同
RabbitMQ遵循AMQP協(xié)議知举,RabbitMQ的broker由Exchange,Binding,queue組成瞬沦,其中exchange和binding組成了消息的路由鍵;客戶端Producer通過連接channel和server進(jìn)行通信雇锡,Consumer從queue獲取消息進(jìn)行消費(fèi)(長連接逛钻,queue有消息會推送到consumer端,consumer循環(huán)從輸入流讀取數(shù)據(jù))锰提。rabbitMQ以broker為中心曙痘;有消息的確認(rèn)機(jī)制芳悲。
kafka遵從一般的MQ結(jié)構(gòu),producer边坤,broker名扛,consumer唆香,以consumer為中心拧篮,消息的消費(fèi)信息保存的客戶端consumer上哪审,consumer根據(jù)消費(fèi)的點(diǎn)更扁,從broker上批量pull數(shù)據(jù)凸舵;無消息確認(rèn)機(jī)制疆前。
2戏挡,應(yīng)用場景
RabbitMQ固逗,循AMQP協(xié)議区拳,用于實(shí)時(shí)的對可靠性要求比較高的消息傳遞上拘领。
kafka主要用于處理活躍的流式數(shù)據(jù),大數(shù)據(jù)量的數(shù)據(jù)處理上
3,吞吐量
kafka具有高的吞吐量樱调,內(nèi)部采用消息的批量處理约素,zero-copy機(jī)制,數(shù)據(jù)的存儲和獲取是本地磁盤順序批量操作本涕,具有O(1)的復(fù)雜度业汰,消息處理的效率很高
rabbitMQ在吞吐量方面稍遜于kafka,他們的出發(fā)點(diǎn)不一樣菩颖,rabbitMQ支持對消息的可靠的傳遞样漆,支持事務(wù),不支持批量的操作晦闰;基于存儲的可靠性的要求存儲可以采用內(nèi)存或者硬盤放祟。
Kafka生產(chǎn)者生產(chǎn)數(shù)據(jù)的可靠性
生產(chǎn)者向leader發(fā)送數(shù)據(jù)時(shí),可以選擇需要的可靠性級別
通過request.required.acks參數(shù)設(shè)置(0:至多一次呻右,1:至少一次跪妥,-1:剛好一次)
0(至多一次):
生產(chǎn)者不停向leader發(fā)送數(shù)據(jù),而不需要leader反饋成功消息声滥,這種模式效率最高眉撵,可靠性最低,可能在發(fā)送過程中丟失數(shù)據(jù)落塑∨ε保可能在leader宕機(jī)時(shí)丟失數(shù)據(jù)(可能因?yàn)榫W(wǎng)絡(luò)的不穩(wěn)定丟失數(shù)據(jù)。Leader宕機(jī)后憾赁,宕機(jī)期間沒有接受到數(shù)據(jù)污朽,就丟失了)
1(默認(rèn),至少一次):
producer在ISR中的leader已成功收到數(shù)據(jù)并得到確認(rèn)后才會發(fā)送下一條數(shù)據(jù)龙考,如果等待響應(yīng)超時(shí)蟆肆,生產(chǎn)者自動重發(fā)數(shù)據(jù)矾睦。(不會因?yàn)榫W(wǎng)絡(luò)不穩(wěn)定而丟失,但可能在leader宕機(jī)而新數(shù)據(jù)未同步完成時(shí)炎功,因新的leader選舉后截?cái)辔赐綌?shù)據(jù)而造成丟失數(shù)據(jù)枚冗。如果網(wǎng)絡(luò)不穩(wěn)定,在重發(fā)的過程中亡问,可能會導(dǎo)致多數(shù)據(jù))
-1(恰好一次)
producer需要等待ISR中的leader和所有follower都確認(rèn)接收到數(shù)據(jù)后才算一次發(fā)送完成官紫,才會發(fā)送下一條數(shù)據(jù),如果等待響應(yīng)超時(shí)州藕,生產(chǎn)者自動重發(fā),數(shù)據(jù)可靠性最高(效率很低)。
但是這樣也不能保證數(shù)據(jù)完全不丟失酝陈,例如當(dāng)ISR中只有l(wèi)eader時(shí)床玻,此時(shí),leader宕機(jī)沉帮,如果不允許OSR中的follower成為新的leader可以保障寫入數(shù)據(jù)的一致性锈死,但除非原來的leader恢復(fù),否則集群一直無法恢復(fù)穆壕〈#或者可以允許OSR列表中的follower成為新的leader,但此時(shí)存在寫數(shù)據(jù)不一致的風(fēng)險(xiǎn)喇勋。
kafka還提供了min.insync.replicas參數(shù)缨该,這個(gè)參數(shù)要求ISR列表中至少要有指定數(shù)量個(gè)副本leader才可以接受數(shù)據(jù)
即使配置request.required.acks=-1,min.insync.replicas=2川背,也只能保證第二個(gè)層面的可靠性贰拿,即不丟數(shù)據(jù),但仍可能多數(shù)據(jù)熄云。如果想要實(shí)現(xiàn)恰好一次的語義膨更,則需要在這個(gè)基礎(chǔ)上進(jìn)一步的加上去重機(jī)制
Kafka提供了GUID機(jī)制,能夠在客戶端根據(jù)算法為每條日志增加一個(gè)全局唯一標(biāo)識缴允,重發(fā)時(shí)會保持GUID一致荚守,從而實(shí)現(xiàn)了標(biāo)識每條數(shù)據(jù)。
分布式系統(tǒng)中的不可能三角-CPA定理
Consistency一致性:分布式環(huán)境下练般,任意時(shí)間點(diǎn)中矗漾,數(shù)據(jù)是否一致
Availability可用性:任意節(jié)點(diǎn),是否具有完整的功能
Partition Toleerance分區(qū)容忍性:是否可以采用分布式模式踢俄,容忍多臺機(jī)器一起工作
在分布式系統(tǒng)開發(fā)中缩功,以上三個(gè)特性,最多可以滿足兩個(gè)都办,同時(shí)滿足以上三個(gè)特性的分布式系統(tǒng)是不可能的嫡锌。