kafka 为何读写都很快
kafaka的写入很快 也很快 有啥秘诀
写入
- Kafka磁盘顺序写保证写数据性能
- Kafka的producer生产数据,要写入到log文件中,写的过程是一直追加到文件末端,为顺序写
- Kafka 是不会删除数据的,它会把所有的数据都保留下来,每个消费者(Consumer)对每个 Topic 都有一个 offset 用来表示读取到了第几条数据
- Kafka 的数据并不是实时的写入硬盘 ,文件直接通过mmap内存映射文件, 对物理内存的操作会被同步到硬盘上。producer.type 来flush
- kafka数据持久化是直接持久化到Pagecache中,I/O Scheduler
- kafka进行数据压缩减少网络 IO
Pagecache
* I/O Scheduler 会将连续的小块写组装成大块的物理写从而提高性能
* I/O Scheduler 会尝试将一些写操作重新按顺序排好,从而减少磁盘头的移动时间
* 充分利用所有空闲内存
* 读操作可直接在 Page Cache 内进行。如果消费和生产速度相当,甚至不需要通过物理磁盘(直接通过 Page Cache)交换数据
数据压缩
* 如果每个消息都压缩,但是压缩率相对很低,所以 Kafka 使用了批量压缩,即将多个消息一起压缩而不是单个消息压缩
* Kafka 允许使用递归的消息集合,批量的消息可以通过压缩的形式传输并且在日志中也可以保持压缩格式,直到被消费者解压缩
* Kafka 支持多种压缩协议,包括 Gzip 和 Snappy 压缩协议
零拷贝技术
- 消费者发送请求给kafka服务
- kafka服务去os cache缓存读取数据(缓存没有就去磁盘读取数据)
- 从磁盘读取了数据到os cache缓存中
- os cache直接将数据发送给网卡
- 通过网卡将数据传输给消费者
稀疏索引
- kafka里面每一条消息,都有自己的offset(相对偏移量),存在物理磁盘上面,
*在position Position:物理位置(磁盘上面哪个地方)也就是说一条消息就有两个位置:offset:相对偏移量(相对位置)position:磁盘物理位置 - 稀疏索引: Kafka中采用了稀疏索引的方式读取索引,kafka每当写入了4k大小的日志(.log),就往index里写入一个记录索引。其中会采用二分查找
高并发网络设计
- Kafka利用NIO 超高并发网络设计
总结
- Kafka 速度的秘诀在于,它把所有的消息都变成一个批量的文件,并且进行合理的批量压缩,减少网络 IO 损耗,
- 通过 mmap 提高 I/O 速度,写入数据的时候由于单个 Partion 是末尾添加所以速度最优;
- 读取数据的时候配合 sendfile 直接暴力输出。
本文来自博客园,作者:vx_guanchaoguo0,转载请注明原文链接:https://www.cnblogs.com/guanchaoguo/p/16497456.html