首先,简单介绍下kafka。
Kafka是由LinkedIn开发的分布式的、基于发布/订阅的消息系统,以可水平扩展和高吞吐率而被广泛使用。主要设计目标如下:
- 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间复杂度的访问性能。
- 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条以上消息的传输。
- 支持Kafka Server间的消息分区,及分布式消费,同时保证每个Partition内的消息顺序传输。
- 同时支持离线数据处理和实时数据处理。
- Scale out:支持在线水平扩展。
个人认为kafka是个万金油,不仅可以作为消息件,还可以在数据处理时当作分布式管道来运用,还可以作为蓄水池,实在是特别心动。
究竟kafka具体性能如何,还是需要亲自测一下才有底和放心。测试方法主要参考Kafka的创始人之一的Jay Kreps的bechmark。
1 测试环境
见附录。
2 测试内容
测试内容包括:
- producer吞吐率
- producer吞吐率和已存储的数据量间的关系
- producer吞吐率和partition数量的关系
- producer吞吐率和producer数量的关系
- producer吞吐率和同步复制/异步复制的关系
- producer的offset
- consumer吞吐率和consumer数量的关系
- consumer吞吐率和replica数量的关系
- consumer吞吐率和同步复制/异步复制的关系
- consumer的offset
- producer数量对consumer吞吐率的影响
- consumer数量对producer吞吐率的影响
- 消息长度对吞吐率的影响
- snappy压缩率
- 日志过期情况
2.1 producer吞吐率
该项测试只测producer的吞吐率,也就是数据只被持久化,没有consumer读数据。
(1) 吞吐率
重复10次。测试如下:
该测试在1台测试机设置1个producer,向有1个partition,1个replication的topic发送100 million的消息,消息大小100bytes。
图Producer Throughput是吞吐率图。从图中可以看到,吞吐率约500000~600000records/sec。
结论:单独producer运行时吞吐率约700000~800000records/sec。
(2) 已存储的数据量对producer吞吐率的影响
测试如下:
kafka集群,4 broker,4 partition,1 replication
该测试在1台测试机设置1个producer,向有4个partition,1个replication的topic发送1600 million的消息,消息大小1000bytes 。
图Producer Throughput VS Stored Data是吞吐率与数据量大小的关系图。可以明显看到,吞吐率存在一些偏差,kafka作者解释,偏差是由Linux I/O管理造成的,它会把数据缓存起来再批量flush。实际上从图中可以看到,当磁盘数据量达到1T时,吞吐率和磁盘数据只有几百MB时没有明显区别,吞吐率并不受磁盘上所存数据量大小的影响。
结论:producer吞吐率基本不受磁盘上所存数据量大小的影响。
(3) partition数量对producer吞吐率的影响
如果1个Topic对应1个partition ,那这个partition所在磁盘I/O将会成为这个Topic的性能瓶颈,将一个topic拆分为多个partition后,不同的消息可以并行写入不同磁盘的不同partition里,极大的提高了吞吐率。
这里需要注意的是,不同partition需要位于不同的磁盘。如果多个partition位于同一个磁盘,那么意味着有多个进程同时对一个磁盘的多个文件进行读写,使得操作系统会对磁盘读写进行频繁调度,也就是破坏了磁盘读写的连续性。
同一磁盘,测试如下:
(1) 在1台测试机设置1个producer,向有1个partition,1个replication的topic发送100 million的消息,消息大小100bytes ;
(2) partition加1,重复(1)。
不同磁盘,测试如下:
设置1台kafka为1个partition,1个replication;在另一台测试机设置1个producer,向kafka有1个partition,0个replication的topic发送100 million的消息,消息大小100bytes ;
设置2台kafka为2个partition,1个replication;在另一台测试机设置1个producer,向kafka有2个partition,0个replication的topic发送100 million的消息,消息大小100bytes ;
设置3台kafka为3个partition,1个replication;在另