Kafka高效讀寫數據的原因及如何提升Kafka的吞吐量
1、Kafka 為什么能高效讀寫數據
1)Kafka 本身是分布式集群,可以采用分區(qū)技術,并行度高
2)讀數據采用稀疏索引,可以快速定位要消費的數據
3)順序寫磁盤
Kafka 的 producer 生產數據,要寫入到 log 文件中,寫的過程是一直追加到文件末端,
為順序寫。官網有數據表明,同樣的磁盤,順序寫能到 600M/s,而隨機寫只有 100K/s。這
與磁盤的機械機構有關,順序寫之所以快,是因為其省去了大量磁頭尋址的時間。

- 4)頁緩存+ 零拷貝技術

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

1)冪等性配置參數
| 參數名稱 | 描述 |
|---|---|
| enable.idempotence | 是否開啟冪等性,默認true,表示開啟冪等性。 |
| max.in.flight.requests.per.connection | 1.0.X版本前,需設置為1,1.0.X之后,小于等于5 |
| retries | 失敗重試次數,需要大于0 |
| acks | 需要設置為all |
2)Kafka的事務一共有如下5個API
// 1初始化事務
void initTransactions();
// 2開啟事務
void beginTransaction() throws ProducerFencedException;
// 3在事務內提交已經消費的偏移量(主要用于消費者)
void sendOffsetsToTransaction(Map<TopicPartition, OffsetAndMetadata> offsets,
String consumerGroupId) throws ProducerFencedException;
// 4提交事務
void commitTransaction() throws ProducerFencedException;
// 5放棄事務(類似于回滾事務的操作)
void abortTransaction() throws ProducerFencedException;
3)小結
- (1)生產者角度
- acks設置為-1 (acks=-1)。
- 冪等性(enable.idempotence = true) + 事務 。
- (3)broker服務端角度
分區(qū)副本大于等于2 (–replication-factor 2)。
ISR里應答的最小副本數量大于等于2 (min.insync.replicas = 2)。
(3)消費者
- 事務 + 手動提交offset (enable.auto.commit = false)。
- 消費者輸出的目的地必須支持事務(MySQL、Kafka)。
總結
本文主要介紹了Kafka的高效讀寫數據的原因及如何提升Kafka的吞吐量,Kafka通過分區(qū)、稀疏索引等零拷貝等技術提高了讀寫效率,提升吞吐量可以從生產者和消費者兩個方面入手,增加緩沖區(qū)大小、調整batch、linger等參數可以提升生產者端的吞吐量,調整fetch.max.size等max.poll.records等參數可以提升消費者端的吞吐量,Kafka在生產者、Broker和消費者三個角度都有措施保證數據不丟失,Kafka通過開啟冪等性、事務等措施保證數據去重和冪等性。
到此這篇關于Kafka高效讀寫數據的原因及如何提升Kafka的吞吐量的文章就介紹到這了,更多相關Kafka提高讀寫效率內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Navicat圖形化界面之Navicat?Premium?12?安裝與使用教程
Navicat?premium?是一款數據庫管理工具,它可以讓你以單一程式同時連線到?MySQL、SQLite、Oracle?及?PostgreSQL?資料庫,讓管理不同類型的資料庫更加的方便,下面通過本文給大家介紹Navicat?Premium?12?安裝使用教程,需要的朋友參考下吧2021-12-12

