Kafka高性能之道
高效使用磁盘
零拷贝
批处理和压缩
Partition
ISR
高效使用磁盘
》顺序写cipan
》Append Only(数据不更新,无记录级的数据删除,只会整个segment删除)
》充分利用Page Cache
》支持多Directory(可使用多Drive)
零拷贝
》传统模式下数据从文件传输到网络需要4次数据拷贝,4次上下文切换和2次系统调用
DMA先将文件拷贝到linux内核的Read buffer,cpu再将Read buffer里面的文件拷贝到Application buffer,cpu再将Application buffer里面的我呢件拷贝到Socket buffer,DMA再将Socket buffer里面的文件拷贝到网络接口的Nic buffer中。
》Kafka的零拷贝是指cpu不参加了拷贝,它通过NIO的transfer To/transferFrom调用操作系统的sendfile(内核级命令)实现零拷贝。总共发生2次内核数据拷贝,2次上下文切换和1次系统调用,消除了CPU数据拷贝
批处理和压缩
》Produce和Consumer均支持批量处理数据,从而减少了网络传输的开销
》Producer可将数据压缩后发送给broker,从而减少网络传输代价。目前支持Snappy,Gzip和LZ4压缩。
Partition
》通过Partition实现了并行处理和水平扩展
》Partition是Kafka(包括Kafka Stream)并行处理的最小单元
》不同Partition可处于不同的Broker(节点),充分利用多机资源
》同一Broker上的不同Partition可置于不同的Directory,如果节点上由多个Disk Drive,可将不同的Drive对应不同的Directory,从而使Kafka从分利用多Disk Drive的磁盘优势
ISR
ISR实现了可用性和一致性的动态平衡
》replica.lag.time.max.ms = 10000;
》replica.lag.max.messages=4000;
ISR可容忍更多的节点失败
》Majority Quorum如果要容忍f个节点失败,则需要2f+1个节点
》ISR如果要容忍f个节点失败,至少需要f+1个节点
如何处理Replica Crash
》Leader crash后,ISR中的任何replica皆可竞选成为Leader
》如果所有replica都crash,可选择让每一个recover的replica或者第一个在ISR中的replica成为Leader
》unclean.leader.election.enable