操作系統(tǒng)
目前常見的操作系統(tǒng)有三種:Linux、Windows和macOs,相比之下Linux系統(tǒng)要更適合,當然部署在Linux上的生產(chǎn)環(huán)境是最多的。
Linux系統(tǒng)的優(yōu)勢主要集中在下面的三個方面上:
- I/O模型的使用
- 數(shù)據(jù)網(wǎng)絡傳輸效率
- 社區(qū)支持度
I/O模型的使用
主流的I/O模型通常有五種:阻塞式I/O、非阻塞式I/O、I/O多路復用、信號驅動I/O和異步I/O。
每種 I/O 模型都有各自典型的使用場景,Java 中Socket對象的阻塞模式和非阻塞模式就對應于前兩種模型;Linux系統(tǒng)中的系統(tǒng)調(diào)用select函數(shù)就屬于I/O多路復用模型;epoll系統(tǒng)調(diào)用介于第三種和第四種之間;第五種模型,很少有l(wèi)inux系統(tǒng)支持,反而是windows系統(tǒng)提供了一個叫IOCP線程模型屬于這一種。
Kafka底層使用了Java的selector,selector在Linux上的實現(xiàn)機制式epoll,而在Windows平臺上的實現(xiàn)機制是select。因此在這一點上將Kafka部署在Linux上是有優(yōu)勢的,因為能獲得更高效的I/O性能。
數(shù)據(jù)網(wǎng)絡傳輸效率
Kafka需要在磁盤和網(wǎng)絡之間進行大量的數(shù)據(jù)傳輸,Linux提供了零拷貝(Zero Copy)技術,而在Windows上必須使用Java 8的60更新版本才能使用這個技術。
社區(qū)支持度
社區(qū)目前對Windows平臺上發(fā)現(xiàn)的Kafka Bug不做任何承諾。
磁盤
SSD與機械硬盤
kafka使用磁盤的方式多是順序讀寫操作,一定程度上規(guī)避了機械磁盤最大的劣勢,即隨機讀寫慢。從這一點上來說,機械硬盤物美價廉,而它因易損壞而造成的可靠性差等缺陷,又由Kafka在軟件曾冕提供機制來保證,故使用普通的機械磁盤是很劃算的。
當然,一般我們認為SSD順序寫TPS大約是HDD的四倍,讓出現(xiàn)生產(chǎn)者阻塞寫入負載偏高是可縱向擴展使用SSD,當然也可橫向擴展,增加更多的broker和HDD分散負載
磁盤陣列(RAID)
使用RAID的兩個主要優(yōu)勢:
- 提供冗余的磁盤存儲空間
- 提供負載均衡
對于Kafka而言,一方面Kafka自己實現(xiàn)了冗余機制來提高可靠性;另一方面通過分區(qū)的概念,Kafka也能在軟件層面自行實現(xiàn)負載均衡。因此在線上環(huán)境使用RAID似乎變得不是那么重要了。
- 追求性價比的公司可以不搭建RAID,使用普通磁盤組成存儲空間即可。
- 使用機械磁盤完全能夠勝任Kafka線上環(huán)境。
磁盤容量
預估容量時,一般要考慮的方面:
- 新增的消息數(shù)
- 消息留存時間
- 平均消息大小
- 備份數(shù)
- 是否啟用壓縮
例如:公司業(yè)務每天需要向Kafka集群發(fā)送一億條消息,每份消息保存兩份以防止消息丟失,另外消息默認保存兩周時間。假設一條消息的平均大小是1KB。
每天一億條1kb大小的消息,保存兩份,那么一天使用的磁盤容量大概是 1億 * 1KB * 2 / 1000 / 1000 = 200GB。一般情況下Kafka集群除了消息數(shù)據(jù)還有其他類型的數(shù)據(jù),比如索引數(shù)據(jù)等,故我們再為這些數(shù)據(jù)預留出10%的磁盤空間,因此每天的總存儲容量就是220GB。保存兩周,即增提容量為220GB * 14,大約3TB左右。Kafka支持數(shù)據(jù)壓縮,假設壓縮比是0.75,最后你需要規(guī)劃的容量大概就是0.75 * 3 = 2.25TB。
帶寬
假如你要用一批千兆網(wǎng)卡的服務器處理一個業(yè)務的數(shù)據(jù),其業(yè)務目標或SLA式在一小時內(nèi)處理1TB的業(yè)務數(shù)據(jù),那么需要多少臺服務來完成的這個業(yè)務?
服務器網(wǎng)卡帶寬是1Gbps,即每秒處理1Gb的數(shù)據(jù),假設每臺Kafka服務器都是安裝在專屬的機器上,也是就是說每臺Kafka機器上沒有混布其他服務。通常情況下你只能假設Kafka會用到70%的寬帶資源,因為總要為其他應用程序或進程留一些資源。根據(jù)實際使用經(jīng)驗,超過70%的閾值就有網(wǎng)絡丟包的可能性了,故70%的設定是一個比較合理的值,也是就是單臺Kafka服務器最多也就能使用大約700Mb的帶寬資源。
當然這只是他能使用的最大帶寬資源,不能讓Kafka服務器常規(guī)性使用這么多資源,故通常要再額外預留出2/3的資源,即單臺服務器使用帶寬700Mb/3 ≈ 240Mbps。這里的2/3其實是相當保守的,你可以結合自己機器的使用情況酌量減少此值。
根據(jù)我們的業(yè)務目標,一個小時內(nèi)處理1TB數(shù)據(jù),那么一秒大概需要處理1 * 1024 * 1024 * 8 / 60 / 60 ≈ 2336 Mb 的數(shù)據(jù),除以240,約等于10臺服務器。如果消息還需要額外復制兩份,那么總的服務器臺數(shù)還要乘以3,即30臺。