kafka学习汇总系列(一)kafka概述
一、kafka概述
在流式計算中,kafka是用來緩存數據的,storm通過消費kafka的數據進行計算。kafka的初心是,為處理實時數據提供一個統一、高通量、低等待的平臺;
1、kafka是一個分布式消息隊列:kafka對消息保存是根據topic主題進行歸類,發送消息者稱為producer,消息接受者稱為consumer,此外kafka集群有多個kafka實例組成,每個實例(server)稱為broker;
2、kafka的結構關系:kafka集群是有多個broker實例組成,一個broker實例包含多個不同的topic主題,一個topic主題又有多個分區partition,一個partition分區就是一個消息隊列,partition分區可以有0到多個備份,分布在broker集群上,partition分區有主從之分,是通過zookeeper選舉來確定;
3、kafka的核心概念:
- Producer:?特指消息的生產者
- Consumer :特指消息的消費者
- Consumer Group :消費者組,可以并行消費Topic中partition的消息
- Broker:緩存代理,Kafa 集群中的一臺或多臺服務器統稱為 broker
- Topic:特指 Kafka 處理的消息源(feeds of messages)的不同分類
- Partition:Topic 物理上的分組,一個 topic 可以分為多個 partition,每個 partition 是一個有序的隊列。partition 中的每條消息都會被分配一個有序的 id(offset)
- Message:消息,是通信的基本單位,每個 producer 可以向一個 topic(主題)發布一些消息
- Producers(是個動詞):消息和數據生產者,向 Kafka 的一個 topic 發布消息的過程叫做 producers
- Consumers(是個動詞):消息和數據消費者,訂閱 topics 并處理其發布的消息的過程叫做 consumers
二、kafka中核心概念和機構配圖
1、Broker:每個kafka server稱為一個Broker,多個borker組成kafka cluster。一個機器上可以部署一個或者多個Broker,這多個Broker連接到相同的ZooKeeper就組成了Kafka集群。
2、主題Topic
Kafka的核心抽象概念記錄流 – 主題,主題是一種分類或發布的一系列記錄的名義上的名字。Kafka的主題始終是支持多用戶訂閱的; 也就是說,一個主題可以有零個,一個或多個消費者訂閱寫入的數據。一個Broker上可以創建一個或者多個Topic。同一個topic可以在同一集群下的多個Broker中分布。當然,Topic只是一個名義上的組件,真正在Broker間分布式的Partition。
?
3、分區與日志
一個主題對應多個分區,一個分區對應一個日志,Kafka會為每個topic維護了多個分區(partition),每個分區會映射到一個邏輯的日志(log)文件。每個分區是一個有序的,不可變的消息序列,新的消息不斷追加到這個有組織的有保證的日志上。分區會給每個消息記錄分配一個順序ID號 – 偏移量, 能夠唯一地標識該分區中的每個記錄。日志分區是分布式的存在于一個kafka集群的多個broker上。每個partition會被復制多份存在于不同的broker上。這樣做是為了容災。具體會復制幾份,會復制到哪些broker上,都是可以配置的。經過相關的復制策略后,每個topic在每個broker上會駐留一到多個partition:
?
4、保留策略與Offset
Kafka集群保留所有發布的記錄,不管這個記錄有沒有被消費過,Kafka提供可配置的保留策略去刪除舊數據(還有一種策略根據分區大小刪除數據)。例如,如果將保留策略設置為兩天,在記錄公布后兩天內,它可用于消費,之后它將被丟棄以騰出空間。Kafka的性能跟存儲的數據量的大小無關, 所以將數據存儲很長一段時間是沒有問題的。
事實上,保留在每個消費者元數據中的最基礎的數據就是消費者正在處理的當前記錄的偏移量(offset)或位置(position)。這種偏移是由消費者控制:通常偏移會隨著消費者讀取記錄線性前進,但事實上,因為其位置是由消費者進行控制,消費者可以在任何它喜歡的位置讀取記錄。例如,消費者可以恢復到舊的偏移量對過去的數據再加工或者直接跳到最新的記錄,并消費從“現在”開始的新的記錄。
這些功能的結合意味著,實現Kafka的消費者的代價都是很小的,他們可以增加或者減少而不會對集群或其他消費者有太大影響。例如,你可以使用我們的命令行工具去追隨任何主題,而且不會改變任何現有的消費者消費的記錄。
5、Leader與Followers
一個Topic可能有很多分區,以便它能夠支持海量的的數據,更重要的意義是分區是進行并行處理的基礎單元。日志的分區會跨服務器的分布在Kafka集群中,每個分區可以配置一定數量的副本分區提供容錯能力。為了保證較高的處理效率,消息的讀寫都是在固定的一個副本上完成。這個副本就是所謂的Leader,而其他副本則是Follower,而Follower則會定期地到Leader上同步數據。
(1)leader處理所有的讀取和寫入分區的請求,而followers被動的從領導者拷貝數據。
(2)如果leader失敗了,followers之一將自動成為新的領導者。
(3)每個服務器可能充當一些分區的leader和其他分區的follower,這樣的負載就會在集群內很好的均衡分配。
(4)一個分區在同一時刻只能有一個消費者實例進行消費。
?
可以看見我們一共有3個分區分別是0,1,2, replica 有2個:
partition 0 的leader在broker1, follower在broker2
partition 1 的leader在broker2, follower在broker0
partition 2 的leader在broker0, follower在brokder1
一個broker中不會出現兩個一樣的Partition,replica會被均勻的分布在各個kafka server(broker)上 。Kafka并不允許replicas 數設置大于 broker數,因為在一個broker上如果有2個replica其實是沒有意義的,因為再多的replica同時在一臺broker上,隨著該broker的crash,一起不可用。
(1)Leader選舉與ISR
如果某個分區所在的服務器除了問題,不可用,kafka會從該分區的其他的副本中選擇一個作為新的Leader。之后所有的讀寫就會轉移到這個新的Leader上?,F在的問題是應當選擇哪個作為新的Leader。顯然,只有那些跟Leader保持同步的Follower才應該被選作新的Leader。
Kafka會在Zookeeper上針對每個Topic維護一個稱為ISR(in-sync replica,已同步的副本)的集合,該集合中是一些分區的副本。只有當這些副本都跟Leader中的副本同步了之后,kafka才會認為消息已提交,并反饋給消息的生產者。如果這個集合有增減,kafka會更新zookeeper上的記錄。如果某個分區的Leader不可用,Kafka就會從ISR集合中選擇一個副本作為新的Leader。顯然通過ISR,kafka需要的冗余度較低,可以容忍的失敗數比較高。假設某個topic有f+1個副本,kafka可以容忍f個服務器不可用。
(2)為什么不用少數服從多數的方法
少數服從多數是一種比較常見的一致性算法和Leader選舉法。它的含義是只有超過半數的副本同步了,系統才會認為數據已同步;選擇Leader時也是從超過半數的同步的副本中選擇。這種算法需要較高的冗余度。譬如只允許一臺機器失敗,需要有三個副本;而如果只容忍兩臺機器失敗,則需要五個副本。而kafka的ISR集合方法,分別只需要兩個和三個副本。
(3)如果所有的ISR副本都失敗了怎么辦
此時有兩種方法可選,一種是等待ISR集合中的副本復活,一種是選擇任何一個立即可用的副本,而這個副本不一定是在ISR集合中。這兩種方法各有利弊,實際生產中按需選擇。如果要等待ISR副本復活,雖然可以保證一致性,但可能需要很長時間。而如果選擇立即可用的副本,則很可能該副本并不一致。
6 生產者和消費者
(1)生產者
生產者發布數據到他們所選擇的主題。生產者負責選擇把記錄分配到主題中的哪個分區。這可以使用輪詢算法( round-robin)進行簡單地平衡負載,也可以根據一些更復雜的語義分區算法(比如基于記錄一些鍵值)來完成。
(2)消費者
消費者以消費群(consumer group)的名稱來標識自己,每個發布到主題的消息都會發送給訂閱了這個主題的消費群里面的一個消費者實例,即一個消費群只發送一次。消費者的實例可以在單獨的進程或單獨的機器上。
?
轉載于:https://www.cnblogs.com/aoshicangqiong/p/10630841.html
總結
以上是生活随笔為你收集整理的kafka学习汇总系列(一)kafka概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python编写接口初识一
- 下一篇: docker+httpd的安装