kafka 分区和副本以及kafaka 执行流程,以及消息的高可用
1、Kafka概覽
Apache下的項(xiàng)目Kafka(卡夫卡)是一個(gè)分布式流處理平臺(tái),它的流行是因?yàn)榭ǚ蚩ㄏ到y(tǒng)的設(shè)計(jì)和操作簡單,能充分利用磁盤的順序讀寫特性。kafka每秒鐘能有百萬條消息的吞吐量,因此很適合實(shí)時(shí)的數(shù)據(jù)流處理。例如kafka在線日志收集系統(tǒng)可作為flume的實(shí)時(shí)消息sink端,再通過kafka的消費(fèi)者將消息實(shí)時(shí)寫入hbase數(shù)據(jù)庫中。
卡夫卡以topic分類對(duì)記錄進(jìn)行存儲(chǔ),每個(gè)記錄包含key-value和timestamp。
?
1.1卡夫卡系統(tǒng)的組件、角色
broker: 每個(gè)正在運(yùn)行的kafka節(jié)點(diǎn)
producer:消息生產(chǎn)者
consumer:消息的消費(fèi)者
consumer group:消費(fèi)者組,同一個(gè)消費(fèi)者組只能有一個(gè)consumer能消費(fèi)消息
kafka server :也叫作broker, 已部署kafka的服務(wù)器, 以broker.id來區(qū)分不同的服務(wù)器
topic:主題, 主題中的每條消息包括key-value和timestamp。可以定義多個(gè)topic,每個(gè)topic又可以劃分為多個(gè)分區(qū)
partition:topic下的消息分區(qū),通過key取哈希后把消息映射分發(fā)到一個(gè)指定的分區(qū),每個(gè)分區(qū)都映射到broker上的一個(gè)目錄。一般每個(gè)分區(qū)存儲(chǔ)在一個(gè)broker上
replica:副本, 每個(gè)分區(qū)按照生產(chǎn)者的消息達(dá)到順序存放。每個(gè)分區(qū)副本都有一個(gè)leader
leader replica:leader角色的分區(qū)副本,leader角色的分區(qū)處理消息的讀寫請(qǐng)求. Leader和follower位于不同的broker.
follower replica:follower角色的分區(qū)副本,負(fù)責(zé)從Leader拉取數(shù)據(jù)到本地,實(shí)現(xiàn)分區(qū)副本的創(chuàng)建
zookeeper:嚴(yán)格來說這不是kafka的組件。但是在Kafka集群中, 很有必要通過Zookeeper管理kafka集群的配置、選舉leader,以及在Consumer Group發(fā)生變化時(shí)進(jìn)行rebalance。下面說一下kafka的哪些組件需要注冊(cè)到zookeeper——
為什么要注冊(cè)到zk集群?
1,Kafka集群通過Zookeeper來管理kafka的配置,選舉leader;
2,在Consumer Group發(fā)生變化時(shí)進(jìn)行rebalance
3,所有的topic與broker的對(duì)應(yīng)關(guān)系都由zk維護(hù)
kafka的哪些組件需要注冊(cè)到zookeeper?
(1)Broker注冊(cè)到zk
每個(gè)broker啟動(dòng)時(shí),都會(huì)注冊(cè)到zk中,把自身的broker.id通知給zk。待zk創(chuàng)建此節(jié)點(diǎn)后,kafka會(huì)把這個(gè)broker的主機(jī)名和端口號(hào)記錄到此節(jié)點(diǎn)
(2)Topic注冊(cè)到zk
當(dāng)broker啟動(dòng)時(shí),會(huì)到對(duì)應(yīng)topic節(jié)點(diǎn)下注冊(cè)自己的broker.id到對(duì)應(yīng)分區(qū)的isr列表中;當(dāng)broker退出時(shí),zk會(huì)自動(dòng)更新其對(duì)應(yīng)的topic分區(qū)的ISR列表,并決定是否需要做消費(fèi)者的rebalance
(3)Consumer注冊(cè)到zk
一旦有新的消費(fèi)者組注冊(cè)到zk,zk會(huì)創(chuàng)建專用的節(jié)點(diǎn)來保存相關(guān)信息。如果zk發(fā)現(xiàn)消費(fèi)者增加或減少,會(huì)自動(dòng)觸發(fā)消費(fèi)者的負(fù)載均衡。
(注意,producer不注冊(cè)到zk)
消息如何被消費(fèi)的?
Producer使用push模式將消息發(fā)布到broker,Consumer使用pull模式從broker訂閱并消費(fèi)消息;producer通過聯(lián)系z(mì)k獲取leader角色的消息分區(qū)碼,把消息寫到leader
?
Producer使用push模式將消息發(fā)布到broker
+————+
| broker ? ? |
+————+
? ?| ?|
? ? \/
? ?PULL
? ?| ?|
? ? \/
Consumer使用pull模式從broker訂閱并消費(fèi)消息
?
1.2 卡夫卡的副本機(jī)制簡介
由于Producer和Consumer都只會(huì)與Leader角色的分區(qū)副本相連,所以kafka需要以集群的組織形式提供主題下的消息高可用。kafka支持主備復(fù)制,所以消息具備高可用和持久性。
一個(gè)分區(qū)可以有多個(gè)副本,這些副本保存在不同的broker上。每個(gè)分區(qū)的副本中都會(huì)有一個(gè)作為Leader。當(dāng)一個(gè)broker失敗時(shí),Leader在這臺(tái)broker上的分區(qū)都會(huì)變得不可用,kafka會(huì)自動(dòng)移除Leader,再其他副本中選一個(gè)作為新的Leader。
在通常情況下,增加分區(qū)可以提供kafka集群的吞吐量。然而,也應(yīng)該意識(shí)到集群的總分區(qū)數(shù)或是單臺(tái)服務(wù)器上的分區(qū)數(shù)過多,會(huì)增加不可用及延遲的風(fēng)險(xiǎn)。
(更正:圖中Broker1中的topic1-part1和Broker2中的topic1-part1都是從topic1-part2復(fù)制過來的,所以要改成topic1-part2?)
?
1.3 卡夫卡創(chuàng)建副本的2種模式——同步復(fù)制和異步復(fù)制
Kafka動(dòng)態(tài)維護(hù)了一個(gè)同步狀態(tài)的副本的集合(a set of In-Sync Replicas),簡稱ISR,在這個(gè)集合中的節(jié)點(diǎn)都是和leader保持高度一致的,任何一條消息只有被這個(gè)集合中的每個(gè)節(jié)點(diǎn)讀取并追加到日志中,才會(huì)向外部通知說“這個(gè)消息已經(jīng)被提交”。
只有當(dāng)消息被所有的副本加入到日志中時(shí),才算是“committed”,只有committed的消息才會(huì)發(fā)送給consumer,這樣就不用擔(dān)心一旦leader down掉了消息會(huì)丟失。
消息從leader復(fù)制到follower, 我們可以通過決定Producer是否等待消息被提交的通知(ack)來區(qū)分同步復(fù)制和異步復(fù)制。
同步復(fù)制流程:
????????????? 1.producer聯(lián)系z(mì)k識(shí)別leader
????????????? 2.向leader發(fā)送消息
????????????? 3.leadr收到消息寫入到本地log
????????????? 4.follower從leader pull消息
????????????? 5.follower向本地寫入log
????????????? 6.follower向leader發(fā)送ack消息
????????????? 7.leader收到所有follower的ack消息
????????????? 8.leader向producer回傳ack
?????? 異步復(fù)制流程:
????????????? 和同步復(fù)制的區(qū)別在于,leader寫入本地log之后,
????????????? 直接向client回傳ack消息,不需要等待所有follower復(fù)制完成。
?
既然卡夫卡支持副本模式,那么其中一個(gè)Broker里的掛掉,一個(gè)新的leader就能通過ISR機(jī)制推選出來,繼續(xù)處理讀寫請(qǐng)求。
1.4 卡夫卡判斷一個(gè)broker節(jié)點(diǎn)是否存活,依據(jù)2個(gè)條件:
?????? 1.節(jié)點(diǎn)必須可以維護(hù)和ZooKeeper的連接,Zookeeper通過心跳機(jī)制檢查每個(gè)節(jié)點(diǎn)的連接。
2. 如果節(jié)點(diǎn)是個(gè)follower,他必須能及時(shí)的同步leader的寫操作,延時(shí)不能太久。
Leader會(huì)追蹤所有“同步中”的節(jié)點(diǎn),一旦一個(gè)down掉了,或是卡住了,或是延時(shí)太久,leader就會(huì)把它移除
轉(zhuǎn)載于:https://www.cnblogs.com/liyanbin/p/7815185.html
總結(jié)
以上是生活随笔為你收集整理的kafka 分区和副本以及kafaka 执行流程,以及消息的高可用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于 PHP 与 MYSQL的链接
- 下一篇: 旧的管理方式给部队带来的影响