kafka的高性能
目录
-
kafka高性能的原因?
-
kafka消费的模型?
-
如何实现一个mq,思路?
kafka高性能的原因?
-
页 缓存: 缓存采用操作系统的页缓存
-
io性能的提高:
-
顺序 读写:追加写
-
(1) producer生产的数据顺序追加到partition文件,顺序写;
-
(2) consumer读取数据,自带offet偏移量,接着上次的位置,顺序读;
-
(3) 充分利用磁盘的特性,避免了随机io,还可以通过设置 batch.size和 linger.ms实现组提交的方式较少io的次数,这是基础;
-
-
零拷 贝技术:读写避免复制,从磁盘直接发送给consumer的内核socket缓冲区;
-
(1) producer生产的数据持久化到broker,(采用mmap文件映射),实现顺序的快速写入;
-
(2) consuner从broker读取数据,采用sendfile,将磁盘文件数据通过页缓存直接读到内核缓冲区后,直接转到socket buffer进行网络发送;
-
-
partition分区:水平分区,把一个topic拆分为多个分区,可以实现并行的写入和消费,扩张能力也很强;
-
消息的存储机制 :分段保存。LogSegment —>partition (*.index + *.log)
-
如果只是一个文件,该文件会越来越大,导致一下问题:
-
磁盘空间;
-
大文件查询:磁盘io,效率低;
-
文件的处理:只放入一个文件,不利于于旧的数据的回收;
-
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