- 高效使用磁盤
- 零拷貝
- 批處理和壓縮
- Partition
- ISR
- .高效使用磁盤
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中的)