Kafka高效讀寫(xiě)數(shù)據(jù)的原因及如何提升Kafka的吞吐量
1、Kafka 為什么能高效讀寫(xiě)數(shù)據(jù)
1)Kafka 本身是分布式集群,可以采用分區(qū)技術(shù),并行度高
2)讀數(shù)據(jù)采用稀疏索引,可以快速定位要消費(fèi)的數(shù)據(jù)
3)順序?qū)懘疟P(pán)
Kafka 的 producer 生產(chǎn)數(shù)據(jù),要寫(xiě)入到 log 文件中,寫(xiě)的過(guò)程是一直追加到文件末端,
為順序?qū)?。官網(wǎng)有數(shù)據(jù)表明,同樣的磁盤(pán),順序?qū)懩艿?600M/s,而隨機(jī)寫(xiě)只有 100K/s。這
與磁盤(pán)的機(jī)械機(jī)構(gòu)有關(guān),順序?qū)懼钥欤且驗(yàn)槠涫∪チ舜罅看蓬^尋址的時(shí)間。

- 4)頁(yè)緩存+ 零拷貝技術(shù)

2、副本數(shù)設(shè)定
一般我們?cè)O(shè)置成2個(gè)或3個(gè),很多企業(yè)設(shè)置為2個(gè)。
副本的優(yōu)勢(shì):提高可靠性;副本劣勢(shì):增加了網(wǎng)絡(luò)IO傳輸。
3、如何提升吞吐量
如何提升吞吐量?
1)提升生產(chǎn)吞吐量
- (1)
buffer.memory:發(fā)送消息的緩沖區(qū)大小,默認(rèn)值是32m,可以增加到64m。 - (2)
batch.size:默認(rèn)是16k。如果batch設(shè)置太小,會(huì)導(dǎo)致頻繁網(wǎng)絡(luò)請(qǐng)求,吞吐量下降;如果batch太大,會(huì)導(dǎo)致一條消息需要等待很久才能被發(fā)送出去,增加網(wǎng)絡(luò)延時(shí)。 - (3)
linger.ms,這個(gè)值默認(rèn)是0,意思就是消息必須立即被發(fā)送。一般設(shè)置一個(gè)5-100毫秒。如果linger.ms設(shè)置的太小,會(huì)導(dǎo)致頻繁網(wǎng)絡(luò)請(qǐng)求,吞吐量下降;如果linger.ms太長(zhǎng),會(huì)導(dǎo)致一條消息需要等待很久才能被發(fā)送出去,增加網(wǎng)絡(luò)延時(shí)。 - (4)
compression.type:默認(rèn)是none,不壓縮,但是也可以使用lz4壓縮,效率還是不錯(cuò)的,壓縮之后可以減小數(shù)據(jù)量,提升吞吐量,但是會(huì)加大producer端的CPU開(kāi)銷(xiāo)。
- (1)
2)增加分區(qū)
3)消費(fèi)者提高吞吐量
- (1)調(diào)整fetch.max.bytes大小,默認(rèn)是50m。
- (2)調(diào)整max.poll.records大小,默認(rèn)是500條。
4、Kafka丟不丟數(shù)據(jù)
1)Producer角度
acks=0,生產(chǎn)者發(fā)送過(guò)來(lái)數(shù)據(jù)就不管了,可靠性差,效率高;acks=1,生產(chǎn)者發(fā)送過(guò)來(lái)數(shù)據(jù)Leader應(yīng)答,可靠性中等,效率中等;acks=-1,生產(chǎn)者發(fā)送過(guò)來(lái)數(shù)據(jù)Leader和ISR隊(duì)列里面所有Follwer應(yīng)答,可靠性高,效率低;- 在生產(chǎn)環(huán)境中,
acks=0很少使用;acks=1,一般用于傳輸普通日志,允許丟個(gè)別數(shù)據(jù);acks=-1,一般用于傳輸和錢(qián)相關(guān)的數(shù)據(jù),對(duì)可靠性要求比較高的場(chǎng)景。
2)Broker角度
- 副本數(shù)大于等于2。
min.insync.replicas大于等于2。
5、Kafka數(shù)據(jù)重復(fù)
去重 = 冪等性 + 事務(wù)

1)冪等性配置參數(shù)
| 參數(shù)名稱(chēng) | 描述 |
|---|---|
| enable.idempotence | 是否開(kāi)啟冪等性,默認(rèn)true,表示開(kāi)啟冪等性。 |
| max.in.flight.requests.per.connection | 1.0.X版本前,需設(shè)置為1,1.0.X之后,小于等于5 |
| retries | 失敗重試次數(shù),需要大于0 |
| acks | 需要設(shè)置為all |
2)Kafka的事務(wù)一共有如下5個(gè)API
// 1初始化事務(wù)
void initTransactions();
// 2開(kāi)啟事務(wù)
void beginTransaction() throws ProducerFencedException;
// 3在事務(wù)內(nèi)提交已經(jīng)消費(fèi)的偏移量(主要用于消費(fèi)者)
void sendOffsetsToTransaction(Map<TopicPartition, OffsetAndMetadata> offsets,
String consumerGroupId) throws ProducerFencedException;
// 4提交事務(wù)
void commitTransaction() throws ProducerFencedException;
// 5放棄事務(wù)(類(lèi)似于回滾事務(wù)的操作)
void abortTransaction() throws ProducerFencedException;
3)小結(jié)
- (1)生產(chǎn)者角度
- acks設(shè)置為-1 (acks=-1)。
- 冪等性(enable.idempotence = true) + 事務(wù) 。
- (3)broker服務(wù)端角度
分區(qū)副本大于等于2 (–replication-factor 2)。
ISR里應(yīng)答的最小副本數(shù)量大于等于2 (min.insync.replicas = 2)。
(3)消費(fèi)者
- 事務(wù) + 手動(dòng)提交offset (enable.auto.commit = false)。
- 消費(fèi)者輸出的目的地必須支持事務(wù)(MySQL、Kafka)。
總結(jié)
本文主要介紹了Kafka的高效讀寫(xiě)數(shù)據(jù)的原因及如何提升Kafka的吞吐量,Kafka通過(guò)分區(qū)、稀疏索引等零拷貝等技術(shù)提高了讀寫(xiě)效率,提升吞吐量可以從生產(chǎn)者和消費(fèi)者兩個(gè)方面入手,增加緩沖區(qū)大小、調(diào)整batch、linger等參數(shù)可以提升生產(chǎn)者端的吞吐量,調(diào)整fetch.max.size等max.poll.records等參數(shù)可以提升消費(fèi)者端的吞吐量,Kafka在生產(chǎn)者、Broker和消費(fèi)者三個(gè)角度都有措施保證數(shù)據(jù)不丟失,Kafka通過(guò)開(kāi)啟冪等性、事務(wù)等措施保證數(shù)據(jù)去重和冪等性。
到此這篇關(guān)于Kafka高效讀寫(xiě)數(shù)據(jù)的原因及如何提升Kafka的吞吐量的文章就介紹到這了,更多相關(guān)Kafka提高讀寫(xiě)效率內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Navicat恢復(fù)數(shù)據(jù)庫(kù)連接及查詢(xún)sql的完美解決辦法
因?yàn)楣窘o電腦加域,導(dǎo)致使用新的用戶(hù)賬戶(hù),原先的很多配置都失效了,這篇文章主要介紹了Navicat恢復(fù)數(shù)據(jù)庫(kù)連接及查詢(xún)sql的解決辦法,需要的朋友可以參考下2023-08-08
DBeaver執(zhí)行外部sql文件詳細(xì)圖文教程
DBeaver最近才使用,以前使用的PL/SQL,有些不是很熟悉,記錄下來(lái),下面這篇文章主要給大家介紹了關(guān)于DBeaver執(zhí)行外部sql文件的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06
Navicat圖形化界面之Navicat?Premium?12?安裝與使用教程
Navicat?premium?是一款數(shù)據(jù)庫(kù)管理工具,它可以讓你以單一程式同時(shí)連線到?MySQL、SQLite、Oracle?及?PostgreSQL?資料庫(kù),讓管理不同類(lèi)型的資料庫(kù)更加的方便,下面通過(guò)本文給大家介紹Navicat?Premium?12?安裝使用教程,需要的朋友參考下吧2021-12-12
圖文詳解如何用IDEA和Navicat導(dǎo)入導(dǎo)出數(shù)據(jù)庫(kù)
這篇文章主要介紹了如何用IDEA和Navicat導(dǎo)入導(dǎo)出數(shù)據(jù)庫(kù)的相關(guān)資料,包括使用數(shù)據(jù)庫(kù)工具界面或mysqldump命令,并提示MySQL版本兼容性問(wèn)題及Navicat導(dǎo)出文件不帶注釋的原因,需要的朋友可以參考下2025-06-06
如何在一個(gè)千萬(wàn)級(jí)的數(shù)據(jù)庫(kù)查詢(xún)中提高查詢(xún)的效率?
今天小編就為大家分享一篇關(guān)于如何在一個(gè)千萬(wàn)級(jí)的數(shù)據(jù)庫(kù)查詢(xún)中提高查詢(xún)的效率?,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03
SQL WHERE IN參數(shù)化編譯寫(xiě)法簡(jiǎn)單示例
這篇文章主要給大家介紹了關(guān)于SQL WHERE IN參數(shù)化編譯寫(xiě)法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用SQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11

