Kafka高性能的特点及条件
Kafka是一个高吞吐量分布式消息中间件,并且提供了消息的持久化功能。其高可行有两个重要的特点:
- 利用了磁盘连续读写性能显著高于随机读写性能的特点
- 并发,将一个topic拆分为多个partition
磁盘的连续性
要充分利用磁盘连续读写高性能的特点,就意味着要减少操作系统对磁盘的重新调度。kakfa内部的实现非常巧妙:
- 生产者:网络==>pagecache(内存)==>磁盘
- 消费者:磁盘===>网络,使用sendfile将磁盘数据直接拷贝到网卡发送缓冲区
这样的设计使得写磁盘的机会仅仅是pagecache需要flush到磁盘的时候,保证了大多数时候磁盘可以连续地读取,而且直 接复制到网卡,避免消费影响到生产(写入内存)。另外,使用文件系统pagecache而不是自建缓存,还利用pagecache对于sendfile来说是透明的优势,也就是在没有消息堆积时,数据流动实际时pagecahe直接到网卡,减少磁盘io又保证及时消费。
topic的拆分
kafka读写的单位是partition,将一个topic拆分为多个partition提高了系统的吞吐量,这里有一个前提条件是不同的partition要分布在不同在磁盘上。如果多个partition位于一个磁盘上就以为这有多个进程同时对一个磁盘的多个文件进行读写,使得操作系统对磁盘的读写进行频繁的调度,破坏了磁盘读写的连续性。
具体的配置上是将不同磁盘的多个目录配置到broker的log.dirs,例如:
log.dirs=/disk1/logs,/disk2/logs,/disk3/logs
kafka会在新建partition的时候,将新partition分布在partition最少的目录上,因此,一般不能将同一个磁盘的多个目录设置到log.dirs。
kafka在虚拟机环境的优化
kafka在虚拟机环境的优化有三点:
- 组建较大集群,并保证同一个topic的不同partition位于不同虚拟机(所以在不同的磁盘)
- 监控,对于消费过慢的partition(所在的broker),暂停写入(生产),等待消费
- 将kafka安装在系统盘,数据盘(/opt)完全用于消息存储。数据盘上不安装其他服务
内存相关设置
pagecache是linux内核的低优先级缓存,在内存空间富裕的情况下才能获得较大的空间。并且kafka不自建缓存,堆空间需求也比较小。因此建议保留物理内存的1/2以上给系统,以便保证pagecache的分配。