Kafka中的數(shù)據(jù)稱為message,就類似于record和row。Message是以batches的形式寫入Kafka,batch就是一組數(shù)據(jù),他們被寫入同一個topic和partition。 Message被寫入topic,topic又被分成了partition。每個partition可以在不同的server上。
分批次寫入消息是為了提高效率。
topic:主題,一個主題代表了一類消息,就像數(shù)據(jù)庫中的表一樣。
Partition:分區(qū),一個主題有若干個分區(qū),同一個主題的分區(qū)可以不分布在同一個機器上,單一主題中的分區(qū)有序,但是無法保證所有的分區(qū)有序。
Producer用來創(chuàng)造消息。默認情況下,producer不care往哪個partition中寫,一個topic中message會被均勻的分配到partition中。通過message key,partitioner會生成這個key的hash并把message寫到特定的partition中。
Consumer讀取數(shù)據(jù)。一個consumer會subscribe到一個或多個topic下,并以message被produce的順序讀取。通過跟蹤message offset,consumer記錄哪些消息已經(jīng)被消費過。每個message有一個獨立的offset,對于每個partition,通過存儲最后消費消息的offset在zookeeper或kafka中,consumer可以停止重啟是不失去上次讀取的位置。
Consumer組成了consumer group,group保證了每個partition只有一個成員進行消費。如果一個consumer失敗,group中的consumer會rebalance partition。
一個kafka的server稱為一個broker。一個partition在cluster中被歸在一個broker下,這個broker被稱為partition的leader。一個partition可以被assign到多個broker下,這樣partition就會被復(fù)制。
Replica:副本,分為leader和follower,leader對外提供服務(wù)。
為什么要用kafka:多個生產(chǎn)者,多個消費者,磁盤存儲,可拓展性高,高性能。
把partition從一個consumer分配到另一個consumer稱為rebalance。Rebalance保證了consumer group的高可用和高拓展性。在rebalance過程中,consumer不消費消息。
offset:在partition中給message連續(xù)的id,用來識別每條消息。
Zookeeper的作用:在集群不同節(jié)點間建立coordination。同時,如果哪個節(jié)點失敗,我們還可以通過zookeeper從之前committed offset中恢復(fù)因為zookeeper周期性的commit offset。如果kafka的cluster有什么更改,zookeeper會通知所有node這一更改比如增刪broker或topic。
ISR:In-Sync Replicas, 是和leader同步的復(fù)制的分區(qū),這些followers和leader有著相同的message。
QueueFullException:當(dāng)producer以broker無法接受的速度發(fā)送消息是會出現(xiàn),解決方案是增加broker的數(shù)量。
Retention Period: retention period 可以幫助保持所有published的消息并不在乎消息是否被消費。這些記錄可以通過retention period的配置進行銷毀來騰出一些空間。
多分區(qū)多副本的好處:kafka通過給topic指定多個分區(qū)分布在多個broker上,并發(fā)能力較好(負載均衡)。partition可以指定replica數(shù),增加了消息存儲的安全性,提高了容災(zāi)能力,不過也增加了存儲空間。