Kafka中topic的Partition,Kafka为什么这么快,Consumer的负载均衡及consumerGroup的概念(来自学习笔记)
1.1. Kafka中topic的Partition
? 在Kafka文件存儲(chǔ)中,同一個(gè)topic下有多個(gè)不同partition,每個(gè)partition為一個(gè)目錄,partiton命名規(guī)則為topic名稱(chēng)+有序序號(hào),第一個(gè)partiton序號(hào)從0開(kāi)始,序號(hào)最大值為partitions數(shù)量減1。
? 每個(gè)partion(目錄)相當(dāng)于一個(gè)巨型文件被平均分配到多個(gè)大小相等segment(段)數(shù)據(jù)文件中。但每個(gè)段segment file消息數(shù)量不一定相等,這種特性方便old segment file快速被刪除。默認(rèn)保留7天的數(shù)據(jù)。
? 每個(gè)partiton只需要支持順序讀寫(xiě)就行了,segment文件生命周期由服務(wù)端配置參數(shù)決定。(什么時(shí)候創(chuàng)建,什么時(shí)候刪除)
數(shù)據(jù)有序的討論?
一個(gè)partition的數(shù)據(jù)是否是有序的? 間隔性有序,不連續(xù)
針對(duì)一個(gè)topic里面的數(shù)據(jù),只能做到partition內(nèi)部有序,不能做到全局有序。
特別加入消費(fèi)者的場(chǎng)景后,如何保證消費(fèi)者消費(fèi)的數(shù)據(jù)全局有序的?偽命題。
只有一種情況下才能保證全局有序?就是只有一個(gè)partition。
其它:
2.Kafka為什么這么快
2.1. 首先簡(jiǎn)單介紹一下Kafka的架構(gòu)和涉及到的名詞:
以上幾乎是我們?cè)谑褂肒afka的過(guò)程中可能遇到的所有名詞,同時(shí)也無(wú)一不是最核心的概念或組件,感覺(jué)到從設(shè)計(jì)本身來(lái)說(shuō),Kafka還是足夠簡(jiǎn)潔的。這次本文圍繞Kafka優(yōu)異的吞吐性能,逐個(gè)介紹一下其設(shè)計(jì)與實(shí)現(xiàn)當(dāng)中所使用的各項(xiàng)“黑科技”。
Broker
不同于Redis和MemcacheQ等內(nèi)存消息隊(duì)列,Kafka的設(shè)計(jì)是把所有的Message都要寫(xiě)入速度低容量大的硬盤(pán),以此來(lái)?yè)Q取更強(qiáng)的存儲(chǔ)能力。實(shí)際上,Kafka使用硬盤(pán)并沒(méi)有帶來(lái)過(guò)多的性能損失,“規(guī)規(guī)矩矩”的抄了一條“近道”。
首先,說(shuō)“規(guī)規(guī)矩矩”是因?yàn)镵afka在磁盤(pán)上只做Sequence I/O,由于消息系統(tǒng)讀寫(xiě)的特殊性,這并不存在什么問(wèn)題。關(guān)于磁盤(pán)I/O的性能,引用一組Kafka官方給出的測(cè)試數(shù)據(jù)(Raid-5,7200rpm):
Sequence I/O: 600MB/s
Random I/O: 100KB/s
所以通過(guò)只做Sequence I/O的限制,規(guī)避了磁盤(pán)訪(fǎng)問(wèn)速度低下對(duì)性能可能造成的影響。
接下來(lái)我們?cè)倭囊涣腒afka是如何“抄近道的”。
首先,Kafka重度依賴(lài)底層操作系統(tǒng)提供的PageCache功能。當(dāng)上層有寫(xiě)操作時(shí),操作系統(tǒng)只是將數(shù)據(jù)寫(xiě)入PageCache,同時(shí)標(biāo)記Page屬性為Dirty。當(dāng)讀操作發(fā)生時(shí),先從PageCache中查找,如果發(fā)生缺頁(yè)才進(jìn)行磁盤(pán)調(diào)度,最終返回需要的數(shù)據(jù)。實(shí)際上PageCache是把盡可能多的空閑內(nèi)存都當(dāng)做了磁盤(pán)緩存來(lái)使用。同時(shí)如果有其他進(jìn)程申請(qǐng)內(nèi)存,回收PageCache的代價(jià)又很小,所以現(xiàn)代的OS都支持PageCache。
使用PageCache功能同時(shí)可以避免在JVM內(nèi)部緩存數(shù)據(jù),JVM為我們提供了強(qiáng)大的GC能力,同時(shí)也引入了一些問(wèn)題不適用與Kafka的設(shè)計(jì)。
· 如果在Heap內(nèi)管理緩存,JVM的GC線(xiàn)程會(huì)頻繁掃描Heap空間,帶來(lái)不必要的開(kāi)銷(xiāo)。如果Heap過(guò)大,執(zhí)行一次Full GC對(duì)系統(tǒng)的可用性來(lái)說(shuō)將是極大的挑戰(zhàn)。
· 所有在在JVM內(nèi)的對(duì)象都不免帶有一個(gè)Object Overhead(千萬(wàn)不可小視),內(nèi)存的有效空間利用率會(huì)因此降低。
· 所有的In-Process Cache在OS中都有一份同樣的PageCache。所以通過(guò)將緩存只放在PageCache,可以至少讓可用緩存空間翻倍。
· 如果Kafka重啟,所有的In-Process Cache都會(huì)失效,而OS管理的PageCache依然可以繼續(xù)使用。
PageCache還只是第一步,Kafka為了進(jìn)一步的優(yōu)化性能還采用了Sendfile技術(shù)。在解釋Sendfile之前,首先介紹一下傳統(tǒng)的網(wǎng)絡(luò)I/O操作流程,大體上分為以下4步。
整個(gè)過(guò)程共經(jīng)歷兩次Context Switch,四次System Call。同一份數(shù)據(jù)在內(nèi)核Buffer與用戶(hù)Buffer之間重復(fù)拷貝,效率低下。其中2、3兩步?jīng)]有必要,完全可以直接在內(nèi)核區(qū)完成數(shù)據(jù)拷貝。這也正是Sendfile所解決的問(wèn)題,經(jīng)過(guò)Sendfile優(yōu)化后,整個(gè)I/O過(guò)程就變成了下面這個(gè)樣子。
通過(guò)以上的介紹不難看出,Kafka的設(shè)計(jì)初衷是盡一切努力在內(nèi)存中完成數(shù)據(jù)交換,無(wú)論是對(duì)外作為一整個(gè)消息系統(tǒng),或是內(nèi)部同底層操作系統(tǒng)的交互。如果Producer和Consumer之間生產(chǎn)和
費(fèi)進(jìn)度上配合得當(dāng),完全可以實(shí)現(xiàn)數(shù)據(jù)交換零I/O。
3.Consumer的負(fù)載均衡
當(dāng)一個(gè)group中,有consumer加入或者離開(kāi)時(shí),會(huì)觸發(fā)partitions均衡.均衡的最終目的,是提升topic的并發(fā)消費(fèi)能力,步驟如下:
1、 假如topic1,具有如下partitions: P0,P1,P2,P3
2、 加入group中,有如下consumer: C1,C2
3、 首先根據(jù)partition索引號(hào)對(duì)partitions排序: P0,P1,P2,P3
4、 根據(jù)consumer.id排序: C0,C1
5、 計(jì)算倍數(shù): M = [P0,P1,P2,P3].size / [C0,C1].size,本例值M=2(向上取整)
6、 然后依次分配partitions: C0 = [P0,P1],C1=[P2,P3],即Ci = [P(i * M),P((i + 1) * M -1)]
總結(jié)
以上是生活随笔為你收集整理的Kafka中topic的Partition,Kafka为什么这么快,Consumer的负载均衡及consumerGroup的概念(来自学习笔记)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 信用卡积分可以干什么
- 下一篇: Kafka整体结构图、Consumer与