Kafka優化總結、Kafka數據丟失解決方案、重複消費解決方案

一、Kafka優化總結

翻譯原文如下:

https://www.infoq.com/articles/apache-kafka-best-practices-to-optimize-your-deployment

1. 設置日誌配置參數以使日誌易於管理

kafka 日誌文檔 https://kafka.apache.org/documentation/#log

kafka 壓縮基礎知識  https://kafka.apache.org/documentation/#design_compactionbasics

 

2. 瞭解 kafka 的 (低) 硬件需求

CPU :除非需要SSL和日誌壓縮,否則Kafka不需要強大的CPU。使用的內核越多,並行性能越好,大多數情況下壓縮,壓縮也不會產生影響,應該使用LZ4 編碼器來提供最佳性能。

RAM:對特別重的負載生產負載,使用32GB一上的機器,將提高客戶端吞吐量

磁盤:如果在RAIO設置中使用多個驅動器,就該Kafka大顯身手。由於Kafka的順序磁盤I/O範式,所有SSD不會提供太多的優勢,不應該使用NAS

網絡和文件系統:建議使用XFS,如果條件允許,還可以將集羣放在單個數據中心。應儘量提供更多的網絡帶寬。

  • Apache Kafka 的基準測試:每秒 200 萬次寫 (在 3 臺廉價的機器上)

    https://engineering.linkedin.com/kafka/benchmarking-apache-kafka-2-million-writes-second-three-cheap-machines

  • 在 AWS 上的 Apache Kafka 負載測試

    https://grey-boundary.io/load-testing-apache-kafka-on-aws/

  • 性能測試

    https://cwiki.apache.org/confluence/display/KAFKA/Performance+testing

3. 充分利用 Apache ZooKeeper

Zookeeper 節點的數量最大應該是五個。一個節點適合於開發環境,三個節點對於大多數產品Kafka集羣足夠了,雖然一個大型Kafka集羣可能需要5個節點來減少延遲,必須考慮節點負載,近期版本的Kafka對Zookeeper的負載要低很多,早期版本使用Zookeeper來存儲消費者偏移量。

爲Zookeeper 提供最強大的網絡帶寬。使用最好的磁盤,分別存儲日誌、隔離Zookeeper進程、禁用交換,這些也會減少延遲。

4. 以正確的方式設置複製和冗餘

5. 注意主題配置

6. 使用並行處理

7. 帶着安全性思維配置和隔離 Kafka

8. 通過提高限制避免停機 Ulimit

  1. 1、創建一個新的文件:/etc/security/limits.d/nofile.conf

  2. 2、輸入內容:

    • soft nofile 128000
      
      hard nofile 128000

       

  3. 3、重新啓動系統或重新登錄。

  4. 4、通過以下命令來驗證

  5. ulimit  -a 

     

9. 保持低網絡延遲

10. 利用有效的監控和警報

通過 Instaclustr 控制檯中顯示的 Kafka 監控圖示例:監視系統指標 (如網絡吞吐量、打開的文件句柄、內存、負載、磁盤使用情況和其他因素) 是必不可少的,同時還要密切關注 JVM 統計數據,包括 GC 暫停和堆使用情況。儀表板和歷史回溯工具能夠加速調試過程,可以提供大量的價值。與此同時,應該配置 Nagios 或 PagerDuty 等警報系統,以便在出現延遲峯值或磁盤空間不足等症狀時發出警告

二、Kafka數據丟失解決方案

producer 數據不丟失:

1. 同步模式:配置=1 (只有Leader收到,-1 所有副本成功,0 不等待)Leader Partition掛了,數據就會丟失

解決:設置 -1 保證produce 寫入所有副本算成功 producer.type = sync request.required.acks=-1

2. 異步模式,當緩衝區滿了,如果配置爲0(沒有收到確認,一滿就丟棄),數據立刻丟棄

解決:不限制阻塞超時時間。就是一滿生產者就阻塞

producer.type = async

request.required.acks=1

queue.buffering.max.ms=5000

queue.buffering.max.messages=10000

queue.enqueue.timeout.ms = -1

batch.num.messages=200

Customer 不丟失數據

在獲取kafka的消息後正準備入庫(未入庫),但是消費者掛了,那麼如果讓kafka自動去維護offset ,它就會認爲這條數據已經被消費了,那麼會造成數據丟失。

解決:使用kafka高級API,自己手動維護偏移量,當數據入庫之後進行偏移量的更新(適用於基本數據源)

流式計算。高級數據源以kafka爲例,由2種方式:receiver (開啓WAL,失敗可恢復) director (checkpoint保證)

流處理中的幾種可靠性語義:

1. at most once  每條數據最多被處理一次(0次或1次),會出現數據丟失的問題

2. at least once 每條數據最少被處理一次(1次或更多),這個不會出現數據丟失,但是會出現數據重複

3. exactly once 每種數據只會被處理一次,沒有數據丟失,沒有數據重複,這種語義是大家最想實現的,也是最難實現的

但是開啓WAL後,依舊存在數據丟失問題,原因是任務中斷時receiver 也被強行終止了,將會造成數據丟失

在Streaming程序的最後添加代碼,只有在確認所有receiver都關閉的情況下才終止程序

 

 

三、Kafka特點、優點、應用場景

1、kafka 特點

分佈式:1.多分區 2. 多副本  3. 多訂閱者(訂閱者數量小於等於partition數量)4. 基於Zookeeper調度

高性能:1. 高吞吐量 2. 低延遲  3. 高併發 4. 時間複雜度爲O(1)

持久性與擴展性:1. 數據可持久化  2. 容錯性(多副本和Consumer Group 支持了容錯性) 3.支持在線水平擴展(Broker 有一個或多個Partition ,Topic 有一個或多個Partition,Consumer Group 變化,我們增加了新的機器,就可以放新的topic和新的Partition)4. 消息自動平衡(消息在服務端進行平衡,consumer在消費的時候進行平衡)

Kafka 高級特性--消息事務

數據傳輸的事務定義:

最多一次:消息不會被重複發送、最多被傳輸一次、但也有可能一次不傳輸

最少一次:消息不會被漏發送,最少被傳輸一次,但也有可能重複傳輸(消費端需要判斷處理)

精確的一次(Exactly once):不會漏傳輸也不會重複傳輸,每個消息都傳輸被一次而且僅僅傳輸一次

事務保證

Produce冪等處理、多分區原子寫入(事務要保證kafka下每一分區的原子寫入,原子是一個讀取--處理--寫入操作)

事務保證--避免殭屍實例

每個事務Producer 分配一個transactional.id ,在進程重新啓動時能夠識別相同的Producer實例

kafka 增加了一個與transactional.id 相關的epoch, 存儲每個transactional.id 內部元數據

一旦epoch 被觸發,任何具有相同的transactional.id 和更舊的epoch的Producer 被視爲殭屍,Kafka會拒絕來自這些Procedure的後續事務寫入

kafka高性能--零拷貝

網絡傳輸持久性日誌塊(消息)

零拷貝建立在:Java Nio channel.transforTo()方法  實際是調用  Linux sendfile 系統調用

文件傳輸到網絡的公共數據路徑

1. 操作系統將數據從磁盤讀入到內核空間的頁緩存

2. 應用程序將數據從內核空間讀入到用戶空間緩存中

3. 應用程序將數據寫回到內核空間到socket 緩存中

4. 操作系統將數據從socket緩衝區複製到網卡緩衝區,一便將數據經網絡發出

零拷貝過程:(內核空間和用戶空間零拷貝)

1.操作系統將數據從磁盤讀入到內核空間的頁緩存

2.將數據的位置和長度的信息的描述符增加至內核空間(socket緩存區)

3.操作系統將數據從內核拷貝到網卡緩衝區,以便將數據經網絡發出

2、Kafka優點

高吞吐量、低延遲、高併發、高性能的消息中間件。Kafka 集羣甚至可以做到每秒幾十萬、上百萬的超高併發寫入

頁面緩存技術+磁盤順序寫+零拷貝技術

3、Kafka 應用場景

1. 消息對列

 2. 行爲跟蹤(用戶的行爲跟蹤直接發送到topic ,時時處理或離線數據存儲)

3. 元數據監控(操作信息運維數據監控)

4. 日誌收集

5. 流處理(收集上游流數據,經過處理,發佈到新的topic 中,進行處理,中間可以進行實時計算、數據處理)

6. 事件源(將狀態轉移作爲記錄,按照時間順序的序列,我們可以回溯整個時間的變更)

7. 持久性日誌(commit log ,就是說在節點之後進行一個持久性日誌記錄,日誌可以在節點間備份一份數據,並且給故障節點間恢復提供一種機制)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章