3、Kafka工作流程分析

Kafka生產過程分析

寫入方式

producer采用推(push)模式將消息發(fā)布到broker,每條消息都被追加(append)到分區(qū)(patition)中庇配,屬于順序寫磁盤(順序寫磁盤效率比隨機寫內存要高,保障kafka吞吐率)

分區(qū)(Partition)

消息發(fā)送時都被發(fā)送到一個topic绍些,其本質就是一個目錄捞慌,而topic是由一些Partition Logs(分區(qū)日志)組成,其組織結構如下圖所示


分區(qū)圖1.png

分區(qū)圖2.png

每個Partition中的消息都是有序的柬批,生產的消息被不斷追加到Partition log上啸澡,其中的每一個消息都被賦予了一個唯一的offset值

分區(qū)的原因

  1. 方便在集群中擴展,每個Partition可以通過調整以適應它所在的機器氮帐,而一個topic又可以有多個Partition組成嗅虏,因此整個集群就可以適應任意大小的數據了;
  2. 可以提高并發(fā)揪漩,因為可以以Partition為單位讀寫了

分區(qū)的原則

  1. 指定了patition旋恼,則直接使用;
  2. 未指定patition但指定key奄容,通過對key的value進行hash出一個patition冰更;
  3. patition和key都未指定,使用輪詢選出一個patition

副本(Replication)

同一個partition可能會有多個replication(對應 server.properties 配置中的 default.replication.factor=N)昂勒。沒有replication的情況下蜀细,一旦broker 宕機,其上所有 patition 的數據都不可被消費戈盈,同時producer也不能再將數據存于其上的patition奠衔。引入replication之后,同一個partition可能會有多個replication塘娶,而這時需要在這些replication之間選出一個leader归斤,producer和consumer只與這個leader交互,其它replication作為follower從leader 中復制數據

寫入流程

寫入流程.png
  1. producer先從zookeeper的 "/brokers/.../state"節(jié)點找到該partition的leader
  2. producer將消息發(fā)送給該leader
  3. leader將消息寫入本地log
  4. followers從leader pull消息
  5. 寫入本地log后向leader發(fā)送ACK
  6. leader收到所有ISR中的replication的ACK后刁岸,增加HW(high watermark脏里,最后commit 的offset)并向producer發(fā)送ACK

Broker 保存消息

存儲方式

物理上把topic分成一個或多個patition(對應 server.properties 中的num.partitions=3配置),每個patition物理上對應一個文件夾(該文件夾存儲該patition的所有消息和索引文件)虹曙,如下
[hadoop@hadoop-100 logs]$ kafka-topics.sh --zookeeper hadoop-101:2181 --create --topic second --partitions 3 --replication-factor 3
Created topic "second".
[hadoop@hadoop-100 logs]$ ll
總用量 312
drwxrwxr-x 2 hadoop hadoop 141 11月 13 17:42 second-0
drwxrwxr-x 2 hadoop hadoop 141 11月 13 17:42 second-1
drwxrwxr-x 2 hadoop hadoop 141 11月 13 17:42 second-2
[hadoop@hadoop-100 logs]$ cd second-0
[hadoop@hadoop-100 second-0]$ ll
總用量 0
-rw-rw-r-- 1 hadoop hadoop 10485760 11月 13 17:42 00000000000000000000.index
-rw-rw-r-- 1 hadoop hadoop 0 11月 13 17:42 00000000000000000000.log
-rw-rw-r-- 1 hadoop hadoop 10485756 11月 13 17:42 00000000000000000000.timeindex
-rw-rw-r-- 1 hadoop hadoop 0 11月 13 17:42 leader-epoch-checkpoint

存儲策略

無論消息是否被消費迫横,kafka都會保留所有消息。有兩種策略可以刪除舊數據

  1. 基于時間:log.retention.hours=168
  2. 基于大性吞肌:log.retention.bytes=1073741824

需要注意的是矾踱,因為Kafka讀取特定消息的時間復雜度為O(1),即與文件大小無關疏哗,所以這里刪除過期文件與提高 Kafka 性能無關

Zookeeper存儲結構

kafka在zookeeper存儲.png

Kafka消費過程分析

kafka提供了兩套consumer API呛讲,高級Consumer API和低級Consumer API

高級API

高級API優(yōu)點

  1. 高級API 寫起來簡單
  2. 不需要自行去管理offset,系統(tǒng)通過zookeeper自行管理
  3. 不需要管理分區(qū),副本等情況圣蝎,.系統(tǒng)自動管理
  4. 消費者斷線會自動根據上一次記錄在zookeeper中的offset去接著獲取數據(默認設置1分鐘更新一下zookeeper中存的offset)
  5. 可以使用group來區(qū)分對同一個topic 的不同程序訪問分離開來(不同的group記錄不同的offset刃宵,這樣不同程序讀取同一個topic才不會因為offset互相影響)

高級API缺點

  1. 不能自行控制offset(對于某些特殊需求來說)
  2. 不能細化控制如分區(qū)、副本徘公、zk等

低級API

低級 API 優(yōu)點

  1. 能夠讓開發(fā)者自己控制offset牲证,想從哪里讀取就從哪里讀取。
  2. 自行控制連接分區(qū)关面,對分區(qū)自定義進行負載均衡
  3. 對zookeeper的依賴性降低(如:offset不一定非要靠zk存儲坦袍,自行存儲offset即可,比如存在文件或者內存中)

低級API缺點
太過復雜等太,需要自行控制offset捂齐,連接哪個分區(qū),找到分區(qū)leader 等

消費者組

消費者組.png

消費者是以consumer group消費者組的方式工作缩抡,由一個或者多個消費者組成一個組奠宜,共同消費一個topic。每個分區(qū)在同一時間只能由group中的一個消費者讀取瞻想,但是多個group可以同時消費這個partition压真。在上圖中,有一個由三個消費者組成的group蘑险,有一個消費者讀取主題中的兩個分區(qū)滴肿,另外兩個分別讀取一個分區(qū)。某個消費者讀取某個分區(qū)佃迄,也可以叫做某個消費者是某個分區(qū)的擁有者泼差。
在這種情況下,消費者可以通過水平擴展的方式同時讀取大量的消息呵俏。另外堆缘,如果一個消費者失敗了,那么其他的group成員會自動負載均衡讀取之前失敗的消費者讀取的分區(qū)

消費方式

consumer采用pull(拉)模式從broker中讀取數據普碎。
push(推)模式很難適應消費速率不同的消費者吼肥,因為消息發(fā)送速率是由broker決定的。它的目標是盡可能以最快速度傳遞消息随常,但是這樣很容易造成consumer來不及處理消息潜沦,典型的表現就是拒絕服務以及網絡擁塞萄涯。而pull模式則可以根據consumer的消費能力以適當的速率消費消息绪氛。
對于Kafka而言,pull模式更合適涝影,它可簡化broker的設計枣察,consumer可自主控制消費消息的速率,同時consumer可以自己控制消費方式——即可批量消費也可逐條消費,同時還能選擇不同的提交方式從而實現不同的傳輸語義序目。
pull模式不足之處是臂痕,如果kafka沒有數據,消費者可能會陷入循環(huán)中猿涨,一直等待數據到達握童。為了避免這種情況,我們在我們的拉請求中有參數叛赚,允許消費者請求在等待數據到達的“長輪詢”中進行阻塞(并且可選地等待到給定的字節(jié)數澡绩,以確保大的傳輸大小)

消費者組案例

需求:測試同一個消費者組中的消費者俺附,同一時刻只能有一個消費者消費
步驟

  1. 在hadoop-100和hadoop-101上修改/opt/module/kafka/consumer.properties肥卡,配置group.id
    group.id=hadoop
  2. 啟動消費者
    [hadoop@hadoop-100 kafka]$ bin/kafka-console-consumer.sh --zookeeper hadoop-100:2181 --topic first --consumer.config config/consumer.properties
    [hadoop@hadoop-101 kafka]$ bin/kafka-console-consumer.sh --zookeeper hadoop-100:2181 --topic first --consumer.config config/consumer.properties
  3. 啟動生產者
    [hadoop@hadoop-102 kafka]$ bin/kafka-console-producer.sh --broker-list hadoop-102:9092 --topic first
  4. 只有一個消費者得到消息


    消費者組案例.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市事镣,隨后出現的幾起案子步鉴,更是在濱河造成了極大的恐慌,老刑警劉巖璃哟,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氛琢,死亡現場離奇詭異,居然都是意外死亡沮稚,警方通過查閱死者的電腦和手機艺沼,發(fā)現死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蕴掏,“玉大人障般,你說我怎么就攤上這事∈⒔埽” “怎么了挽荡?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長即供。 經常有香客問我定拟,道長,這世上最難降的妖魔是什么逗嫡? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任青自,我火速辦了婚禮,結果婚禮上驱证,老公的妹妹穿的比我還像新娘延窜。我一直安慰自己,他們只是感情好抹锄,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布逆瑞。 她就那樣靜靜地躺著荠藤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪获高。 梳的紋絲不亂的頭發(fā)上哈肖,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音念秧,去河邊找鬼淤井。 笑死,一個胖子當著我的面吹牛摊趾,可吹牛的內容都是我干的庄吼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼严就,長吁一口氣:“原來是場噩夢啊……” “哼总寻!你這毒婦竟也來了?” 一聲冷哼從身側響起梢为,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤渐行,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后铸董,有當地人在樹林里發(fā)現了一具尸體祟印,經...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年粟害,在試婚紗的時候發(fā)現自己被綠了蕴忆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡悲幅,死狀恐怖套鹅,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情汰具,我是刑警寧澤卓鹿,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站留荔,受9級特大地震影響吟孙,放射性物質發(fā)生泄漏。R本人自食惡果不足惜聚蝶,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一杰妓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧碘勉,春花似錦巷挥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至晴叨,卻和暖如春凿宾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背兼蕊。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工初厚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人孙技。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓产禾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親牵啦。 傳聞我的和親對象是個殘疾皇子亚情,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內容

  • 姓名:周小蓬 16019110037 轉載自:http://blog.csdn.net/YChenFeng/art...
    aeytifiw閱讀 34,722評論 13 425
  • Kafka簡介 Kafka是一種分布式的,基于發(fā)布/訂閱的消息系統(tǒng)哈雏。主要設計目標如下: 以時間復雜度為O(1)的方...
    Alukar閱讀 3,083評論 0 43
  • 本文轉載自http://dataunion.org/?p=9307 背景介紹Kafka簡介Kafka是一種分布式的...
    Bottle丶Fish閱讀 5,469評論 0 34
  • 大致可以通過上述情況進行排除 1.kafka服務器問題 查看日志是否有報錯楞件,網絡訪問問題等。 2. kafka p...
    生活的探路者閱讀 7,589評論 0 10
  • 今天出去運動了一下裳瘪,好久沒有這么運動了土浸,感覺身體渾濁之氣都吐出來了。排球這項從大學一開始就選擇的球類彭羹,感覺無論什么...
    cocan閱讀 177評論 0 0