(一)Kafka生產(chǎn)優(yōu)化之如何全面規(guī)劃 Kafka 的線上部署方案
如何全面規(guī)劃 Kafka 的線上部署方案
一、操作系統(tǒng)
先說(shuō)結(jié)論:建議部署在 Linux 上。
由于以下三個(gè)原因
- I/O 模型
- 數(shù)據(jù)網(wǎng)絡(luò)傳輸效率
- Kafka的社區(qū)支持度
① I/O 模型層面
I/O 模型是操作系統(tǒng)執(zhí)行 IO 指令的方法。
分別有五種類(lèi)型
- 阻塞式 IO
- 非阻塞式 IO
- IO 多路復(fù)用
- 信號(hào)驅(qū)動(dòng) IO
- 異步 IO
可以簡(jiǎn)單認(rèn)為后面的模型比前面的模型要更高效,epoll 模型介于第三種和第四種之間,select 屬于第三種。
Kafka 的客戶(hù)端底層使用了 Java 的 selector,而 selector 在 Linux 的實(shí)現(xiàn)是 epoll,在 Windows 上實(shí)現(xiàn)機(jī)制為 select。因此 Kafka 部署在 Linux 會(huì)有更高效的 I/O 性能。
② 網(wǎng)絡(luò)傳輸效率
數(shù)據(jù)在磁盤(pán)和網(wǎng)絡(luò)之間進(jìn)行傳輸時(shí)候,在 Linux 上可以享受到零拷貝機(jī)制帶來(lái)的快捷和便利高效,而 Windows 則不行。
③ 社區(qū)支持度
Linux 平臺(tái)出現(xiàn)的問(wèn)題,社區(qū)會(huì)優(yōu)先解決。
Windows 平臺(tái)出問(wèn)題,一般不會(huì)解決。
二、磁盤(pán)
先說(shuō)結(jié)論:
- 選用普通機(jī)械硬盤(pán)即可。
- 如果資金充裕可以將硬盤(pán)組 Raid;
- 如果資金緊張,不使用 Raid 方案也可以保證讀寫(xiě)性能。
問(wèn)題一:選用普通機(jī)械硬盤(pán)還是固態(tài)硬盤(pán)?
使用普通機(jī)械硬盤(pán)即可,Kafka 存儲(chǔ)方式為順序讀寫(xiě),機(jī)械硬盤(pán)的最大劣勢(shì)在于隨機(jī)讀寫(xiě)慢。所以使用機(jī)械硬盤(pán)并不會(huì)造成性能低下。
問(wèn)題二:是否需要將磁盤(pán)組 raid?
raid 的優(yōu)勢(shì)在于:提供冗余磁盤(pán)存儲(chǔ)空間,提供負(fù)載均衡。
但是 Kafka 自身已經(jīng)有冗余機(jī)制,而且通過(guò)分區(qū)的設(shè)計(jì),實(shí)現(xiàn)了負(fù)載均衡的功能。所以如果有經(jīng)濟(jì)能力可以放在組 raid 的存儲(chǔ)空間上,如果考慮性?xún)r(jià)比,可以直接不做 raid。
三、磁盤(pán)容量
先說(shuō)結(jié)論,需要考慮的因素有以下幾個(gè):
- 每天的消息數(shù)
- 每條消息大小
- 副本數(shù)
- 消息保留時(shí)間
- 是否啟用壓縮
問(wèn)題討論:Kafka 需要多大的存儲(chǔ)空間?
設(shè)計(jì)場(chǎng)景:日志數(shù)據(jù)每天向 kafka 發(fā)送 1 億條數(shù)據(jù),每條數(shù)據(jù)有兩個(gè)副本防止數(shù)據(jù)丟失,數(shù)據(jù)保存兩周,每條消息平均大小為 1KB。
每天 1 億條 1KB 消息,保存兩周兩份,則每天總大小為:1 億*1KB*2/1000/1000=200GB
kafka 除了消息數(shù)據(jù)還有其他類(lèi)型的數(shù)據(jù),故增加 10%的冗余空間,則需要 220GB
兩周時(shí)間則為 220GB*14≈3TB
如果啟用壓縮,壓縮比約在 0.75 左右,則總存儲(chǔ)空間規(guī)劃為 3TB*0.75=2.25TB
四、帶寬
先說(shuō)結(jié)論:
如果網(wǎng)絡(luò)為萬(wàn)兆帶寬,基本不會(huì)出現(xiàn)網(wǎng)絡(luò)瓶頸,如果數(shù)據(jù)量特別大,按照下文中的設(shè)計(jì)場(chǎng)景進(jìn)行計(jì)算。
如果網(wǎng)絡(luò)為百兆或者千兆帶寬,在處理較大數(shù)據(jù)量場(chǎng)景下會(huì)出現(xiàn)網(wǎng)絡(luò)瓶頸,可按照下面的傳統(tǒng)經(jīng)驗(yàn)公式進(jìn)行計(jì)算處理,也可按照下述場(chǎng)景按照自己生產(chǎn)實(shí)際情況進(jìn)行設(shè)計(jì)。
經(jīng)驗(yàn)公式:
服務(wù)器臺(tái)數(shù) = 2 × (生產(chǎn)者峰值生產(chǎn)速率 × 副本數(shù) ÷ 100) + 1
帶寬情況最容易成為 kafka 的瓶頸。
設(shè)計(jì)場(chǎng)景:如果機(jī)房為千兆帶寬,我們需要在一小時(shí)內(nèi)處理 1TB 的數(shù)據(jù),需要多少臺(tái) kafka 服務(wù)器?
由于帶寬為千兆網(wǎng),1000Mbps=1Gbps,則每秒鐘每個(gè)服務(wù)器能收到的數(shù)據(jù)量為 1Gb=1000Mb
假設(shè) Kafka 占用整個(gè)服務(wù)器網(wǎng)絡(luò)的 70%(其他 30%為別的服務(wù)預(yù)留),則 Kafka 可以使用到 700Mb 的帶寬,但是如果從常規(guī)角度考慮,我們不能總讓 Kafka 頂滿(mǎn)帶寬峰值,所以需要預(yù)留出 2/3 甚至 3/4 的資源,也就是說(shuō),Kafka 單臺(tái)服務(wù)器使用帶寬實(shí)際應(yīng)為 700Mb/3=240Mb
1 小時(shí)需要處理 1TB 數(shù)據(jù),1TB=1024*1024*8Mb=8000000Mb,則一秒鐘處理數(shù)據(jù)量為:8000000Mb/3600s=2330Mb 數(shù)據(jù)。
需要的服務(wù)器臺(tái)數(shù)為:2330Mb/240Mb≈10 臺(tái)。
考慮到消息的副本數(shù)如果為 2,則需要 20 臺(tái)服務(wù)器,副本如果為 3,則需要 30 臺(tái)服務(wù)器。
五、內(nèi)存
先說(shuō)結(jié)論:建議安裝 Kafka 的服務(wù)器節(jié)點(diǎn)的內(nèi)存至少大于等于 16G。
Kafka 的內(nèi)存由堆內(nèi)存+頁(yè)緩存組成。
① 堆內(nèi)存配置
建議每個(gè)節(jié)點(diǎn) 10G-15G
需要在kafka-server-start.sh進(jìn)行修改
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; thenexport KAFKA_HEAP_OPTS="-Xmx10G -Xms10G"fi
② Kafka 的 GC 情況查詢(xún)
通過(guò) jps 命令查看 Kafka 的進(jìn)程號(hào)
[atguigu@hadoop102 kafka]$ jps2321 Kafka5255 Jps1931 QuorumPeerMain
根據(jù) Kafka 進(jìn)程號(hào),查看 Kafka 的 GC 情況
[atguigu@hadoop102 kafka]$ jstat -gc 2321 1s 10S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT0.0 7168.0 0.0 7168.0 103424.0 60416.0 1986560.0 148433.5 52092.0 46656.1 6780.0 6202.2 13 0.531 0 0.000 0.5310.0 7168.0 0.0 7168.0 103424.0 60416.0 1986560.0 148433.5 52092.0 46656.1 6780.0 6202.2 13 0.531 0 0.000 0.5310.0 7168.0 0.0 7168.0 103424.0 60416.0 1986560.0 148433.5 52092.0 46656.1 6780.0 6202.2 13 0.531 0 0.000 0.5310.0 7168.0 0.0 7168.0 103424.0 60416.0 1986560.0 148433.5 52092.0 46656.1 6780.0 6202.2 13 0.531 0 0.000 0.5310.0 7168.0 0.0 7168.0 103424.0 60416.0 1986560.0 148433.5 52092.0 46656.1 6780.0 6202.2 13 0.531 0 0.000 0.5310.0 7168.0 0.0 7168.0 103424.0 61440.0 1986560.0 148433.5 52092.0 46656.1 6780.0 6202.2 13 0.531 0 0.000 0.5310.0 7168.0 0.0 7168.0 103424.0 61440.0 1986560.0 148433.5 52092.0 46656.1 6780.0 6202.2 13 0.531 0 0.000 0.5310.0 7168.0 0.0 7168.0 103424.0 61440.0 1986560.0 148433.5 52092.0 46656.1 6780.0 6202.2 13 0.531 0 0.000 0.5310.0 7168.0 0.0 7168.0 103424.0 61440.0 1986560.0 148433.5 52092.0 46656.1 6780.0 6202.2 13 0.531 0 0.000 0.5310.0 7168.0 0.0 7168.0 103424.0 61440.0 1986560.0 148433.5 52092.0 46656.1 6780.0 6202.2 13 0.531 0 0.000 0.531
名詞解釋?zhuān)?/p>
- S0C:第一個(gè)幸存區(qū)的大小
- S1C:第二個(gè)幸存區(qū)的大小
- S0U:第一個(gè)幸存區(qū)的使用大小
- S1U:第二個(gè)幸存區(qū)的使用大小
- EC:伊甸園區(qū)的大小
- EU:伊甸園區(qū)的使用大小
- OC:老年代大小
- OU:老年代使用大小
- MC:方法區(qū)大小
- MU:方法區(qū)使用大小
- CCSC:壓縮類(lèi)空間大小
- CCSU:壓縮類(lèi)空間使用大小
- YGC:年輕代垃圾回收次數(shù)
- YGCT:年輕代垃圾回收消耗時(shí)間
- FGC:老年代垃圾回收次數(shù)
- FGCT:老年代垃圾回收消耗時(shí)間
- GCT:垃圾回收消耗總時(shí)間
③ Kafka 的堆內(nèi)存占用查詢(xún)
根據(jù) Kafka 進(jìn)程號(hào),查看 Kafka 的堆內(nèi)存
[atguigu@hadoop102 kafka]$ jmap -heap 2321Attaching to process ID 2321, please wait...Debugger attached successfully.Server compiler detected.JVM version is 25.212-b10using thread-local object allocation.Garbage-First (G1) GC with 8 thread(s)Heap Configuration:MinHeapFreeRatio = 40MaxHeapFreeRatio = 70MaxHeapSize = 2147483648 (2048.0MB)NewSize = 1363144 (1.2999954223632812MB)MaxNewSize = 1287651328 (1228.0MB)OldSize = 5452592 (5.1999969482421875MB)NewRatio = 2SurvivorRatio = 8MetaspaceSize = 21807104 (20.796875MB)CompressedClassSpaceSize = 1073741824 (1024.0MB)MaxMetaspaceSize = 17592186044415 MBG1HeapRegionSize = 1048576 (1.0MB)Heap Usage:G1 Heap:regions = 2048capacity = 2147483648 (2048.0MB)used = 246367744 (234.95458984375MB)free = 1901115904 (1813.04541015625MB)11.472392082214355% usedG1 Young Generation:Eden Space:regions = 83capacity = 105906176 (101.0MB)used = 87031808 (83.0MB)free = 18874368 (18.0MB)82.17821782178218% usedSurvivor Space:regions = 7capacity = 7340032 (7.0MB)used = 7340032 (7.0MB)free = 0 (0.0MB)100.0% usedG1 Old Generation:regions = 147capacity = 2034237440 (1940.0MB)used = 151995904 (144.95458984375MB)free = 1882241536 (1795.04541015625MB)7.471886074420103% used13364 interned Strings occupying 1449608 bytes
④ Kafka 頁(yè)緩存
頁(yè)緩存是 Linux 系統(tǒng)服務(wù)器的內(nèi)存。我們只需要保證 1 個(gè) segment(默認(rèn)值為 1G)中 25%的數(shù)據(jù)在內(nèi)存中就好。
綜合上述,Kafka 在大數(shù)據(jù)場(chǎng)景下能夠流暢穩(wěn)定運(yùn)行至少需要 11G,建議安裝 Kafka 的服務(wù)器節(jié)點(diǎn)的內(nèi)存至少大于等于 16G。
六、CPU 選擇
先說(shuō)結(jié)論:建議 Kafka 服務(wù)器 CPU 核數(shù)在 32 以上。
觀察所有的 Kafka 與線程相關(guān)的配置,一共有以下幾個(gè)
| 參數(shù)名 | 備注 | 默認(rèn)值 |
|---|---|---|
num.network.threads | 服務(wù)器用于接收來(lái)自網(wǎng)絡(luò)的請(qǐng)求并向網(wǎng)絡(luò)發(fā)送響應(yīng)的線程數(shù) | 3 |
num.io.threads | 服務(wù)器用于處理請(qǐng)求的線程數(shù),其可能包括磁盤(pán) I/O | 8 |
num.replica.fetchers | 副本拉取線程數(shù),調(diào)大該值可以增加副本節(jié)點(diǎn)拉取的并行度 | 1 |
num.recovery.threads.per.data.dir | 每個(gè)數(shù)據(jù)目錄在啟動(dòng)時(shí)用于日志恢復(fù)和在關(guān)閉時(shí)刷新的的線程數(shù) | 1 |
log.cleaner.threads | 用于日志清理的后臺(tái)線程數(shù) | 1 |
background.threads | 用于各種后臺(tái)處理任務(wù)的線程數(shù) | 10 |
其中,第 4 個(gè)參數(shù)在啟動(dòng)和關(guān)閉時(shí)候才會(huì)使用,日志清理也是在一定時(shí)間間隔才會(huì)有。所以,常駐線程應(yīng)該有至少 22 個(gè)以上。
在生產(chǎn)環(huán)境中,建議 CPU 核數(shù)最少為 16 核,建議 32 核以上,方可保證大數(shù)據(jù)環(huán)境中的 Kafka 集群正常處理與運(yùn)行。
