Kafka線上集群部署方案怎么做

操作系統(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臺。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容