kafka的高性能

目录
  1. kafka高性能的原因?
  2. kafka消费的模型?
  3. 如何实现一个mq,思路?
 
kafka高性能的原因?
  1. 缓存:   缓存采用操作系统的页缓存
  2. io性能的提高:
  3. 顺序 读写:追加写
    1. (1)  producer生产的数据顺序追加到partition文件,顺序写;
    2. (2) consumer读取数据,自带offet偏移量,接着上次的位置,顺序读;
    3. (3) 充分利用磁盘的特性,避免了随机io,还可以通过设置 batch.sizelinger.ms实现组提交的方式较少io的次数,这是基础;
  4. 零拷 贝技术:读写避免复制,从磁盘直接发送给consumer的内核socket缓冲区;
    1. (1) producer生产的数据持久化到broker,(采用mmap文件映射),实现顺序的快速写入;
    2. (2) consuner从broker读取数据,采用sendfile,将磁盘文件数据通过页缓存直接读到内核缓冲区后,直接转到socket buffer进行网络发送;
  5. partition分区:水平分区,把一个topic拆分为多个分区,可以实现并行的写入和消费,扩张能力也很强;
  6. 消息的存储机制 :分段保存。LogSegment —>partition (*.index + *.log)
    1. 如果只是一个文件,该文件会越来越大,导致一下问题:
    2. 磁盘空间;
    3. 大文件查询:磁盘io,效率低;                                      
    4. 文件的处理:只放入一个文件,不利于于旧的数据的回收;
kafka的高性能
mmap(memory mapped files ): 简单的描述,将磁盘文件映射到内存,修改内存就能修改磁盘文件,也可以用于直接发送;
通过mmap,进程可以像读写内存一样,读写硬盘。通过这种模式,省去了用户态到内核态的复制开销;
 
零拷贝技术的实现:
java中的NIO里的FileChannel的transferTo和transferFrom支持零拷贝;
具体实现:通过操作系统的page缓存来实现物理内存的直接映射,完成映射后,对物理内存的操作修改回直接同步到硬盘上;
 在非堆开辟 一块内存空间,这块内存空间和内核有映射,相当于写在了内核空间了,内核可以直接访问,直接落盘处理;

 
mmap和sendfile总结
  • 1、都是linux内核提供,实现零拷贝技术;
  • 2、sendfile是将读到内核空间的数据,转到socket buffer,进行网络发送;
  • 3、mmap将磁盘文件映射到内存,支持读和写,对内存的操作会反映在磁盘文件上;
rocketmq在消费消息时,使用了mmap,kafka使用了sendfile();
 
 
 
Kafka安全级别的设置:
acks_config 来设置:
  • 0: 不需要等待确认kafkabroker的确认;
  • 1: 等待leader的确认;
  • -1:等待所有的副本replica的确认,级别最高;
 
监控工具
  • kafka manager
  • kafka offset monitor
  • kafka monitor