kafka高性能詳解

  • 高效使用磁盤
  • 零拷貝
  • 批處理和壓縮
  • Partition
  • ISR
     
  1. .高效使用磁盤

      1.1. 順序寫磁盤 順序寫磁盤性能高於隨機寫內存
      1.2.Append Only 數據不更新,無記錄級的數據刪除(只會整個segment刪除)
      1.3.充分利用Page Cache
             I/O Scheduler將連續的小塊寫組裝成大塊的物理寫從而提高性能
             I/O Scheduler會嘗試將一些寫操作重新按順序排好,從而減少磁盤頭的移動時間
            充分利用所有空閒內存(非JVM內存)
                  應用層cache也會有對應的page cache與之對應,直接使用page cache可增大可用cache
                  如使用heap內的cache,會增加GC負擔
            讀操作可直接在page cache內進行。如果進程重啓,JVM內的cache會失效,但page cache仍然可用
            可通過如下參數強制flush,但並不建議這麼做
                   log.flush.interval.messages=10000
                   log.flush.interval.ms=1000
      1.4.支持多Directory(可使用多Drive)

     2. 零拷貝

         2.1. 傳統模式下數據從文件傳輸到網絡需要4次數據拷貝,4次上下文切換和2次系統調用
               File.read(fileDesc, buf, len);
               Socket.send(socket, buf, len);

           

2.2.通過NIO的transferTo/transferFrom調用操作系統的sendfile實現零拷貝。總共發生2次內
核數據拷貝,2次上下文切換和1次系統調用,消除了CPU數據拷貝.

public void transferTo(long position, long count, WritableByteChannel target);

3.批處理和壓縮

    Producer和Consumer均支持批量處理數據,從而減少了網絡傳輸的開銷
    Producer可將數據壓縮後發送給broker,從而減少網絡傳輸代價。目前支持Snappy, Gzip和LZ4壓縮

4.Partition

     通過Partition實現了並行處理和水平擴展
     Partition是Kafka(包括Kafka Stream)並行處理的最小單位
    不同Partition可處於不同的Broker(節點),充分利用多機資源
     同一Broker(節點)上的不同Partition可置於不同的Directory,如果節點上有多個Disk Drive,可將不同的Drive對應不同的     Directory,從而使Kafka充分利用多Disk Drive的磁盤優勢

5.ISR
5.1.ISR實現了可用性和一致性的動態平衡
      replica.lag.time.max.ms=10000
      replica.lag.max.messages=4000(新版本已經去除,只用時間控制)

5.2.ISR可容忍更多的節點失敗
     Majority Quorum如果要容忍f個節點失敗,則至少需要2f+1個節點
     ISR如果要容忍f個節點失敗,至少需要f+1個節點

5.3.如何處理Replica Crash
     Leader crash後,ISR中的任何replica皆可競選成爲Leader
    如果所有replica都crash,可選擇讓第一個recover的replica或者第一個在ISR中的replica成爲leader
    unclean.leader.election.enable=true(選擇讓第一個啓動的replica成爲leader不管是不是isr中的)

 

 

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