Pafka: 高性能消息队列系统 Kafka 在持久内存上的优化版本
来源:原创 如需转载,请注明来自 memark.io 技术社区
简介
由 MemArk 开源的 Pafka 项目(https://github.com/4paradigm/pafka)是流行的流式开源处理平台 Apache Kafka(https://kafka.apache.org/) 的一个基于持久内存的演进版本。Kafka是一个开源的分布式事件流/消息队列系统,用于高效,可靠地处理实时数据流,在工业界中有非常广泛的落地应用场景。 但是,由于其持久化逻辑的存在,其性能(吞吐和延迟)常常受到磁盘的制约。在实际使用场景中, 为了增加 Kafka 集群的总体吞吐量,企业不得不扩大集群规模,增加了企业的总成本。另一方面,持久内存具有高速持久化的特性,其能达到几倍甚至几十倍于传统硬盘和SSD的持久化性能。因此,基于持久内存的 Kafka 的改造版本 — Pafka,正是利用了高速持久化的特性,大幅提升单节点吞吐,从而优化在集群上的总投入成本。
总体来说,Pafka带来了如下优势
- 相比较于目前数据中心常见的 SATA SSD 的配置,Pafka在单服务器的一个 socket 上的吞吐和延迟的改善均能达到 20 倍左右。
- 由于大幅提升了单节点的吞吐,因此在集群规模总投资上,相比较于 Kafka 系统,Pafka可以减少硬件投入成本 10 倍以上。
- Pafka 直接基于 Kafka 改造,用户原有的基于 Kafka 的业务代码无需修改,可以零代码改造成本迁移到 Pafka 系统。
Pafka 架构简介
Kafka 整个系统总体上分为客户端和服务器端(brokers)。客户端的机器又分为生产者和消费者的角色。我们对于 Kafka 的改造集中于服务器端,服务器端是真正制约整个 Kafka 集群性能的瓶颈所在。如下图所示,服务器端部署为一个 Kafka 集群,取决于集群的性能和高可用性需求,内部可能有几个至上百上千个的 brokers。Brokers 内部划分为了不同的 partitons,进一步划分为 segments,来进行具体的消息数据的持久化存储。我们对于 Kafka 的改造主要集中在 segment 的存储数据结构上的改造。原来的 segment 只能存储在 HDD/SSD 等持久化设备上,我们使用 PMDK 来进行持久化操作,同时引入 MixChannel 的概念,并且通过根据数据 locality 的特性引入一个调度器,来实现 segment 存储在 HDD/SSD 传统的外部存储设备,或者是在持久内存上。通过以上改造,Pafka 就可以使用持久内存作为其数据持久化的后端,实现高性能的数据持久化。

Pafka vs Kafka 测试
相对于Kafka,在性能以及TCO方面,Pafka都有显著优势。下面分别介绍一下我们得到的一些初步性能和TCO分析结果。
性能
我们在内部服务器上进行了一些初步实验。 一台服务器用作Kafka代理服务器,另外两台服务器用作客户端。 每个客户端服务器运行16个客户端,以使服务器吞吐量达到饱和。 我们使用的是Kafka自带的ProducerPerformance和ConsumerPerformance,数据大小为1024。
服务器规格
项目 | 配置 |
CPU | Intel(R) Xeon(R) Gold 6252 Processor (24 cores/48 threads) * 2 |
Memory | 376 GB |
Network | Mellanox ConnectX-5 100 GBps |
PMem | 128 GB x 6 = 768 GB (注意其实只使用了一个socket上的持久内存) |
持久化设备性能比较
除了基于持久内存的 Pafka 以外,我们使用 Kafka 在不同持久化设备上来进行比较,其中包括基于 HDD, HDD RAID-5, SATA SSD, NVMe SSD。以下表格列出了不同持久化设备的实际裸测性能。
存储类型 | 写 (MB/s) | 读 (MB/s) |
HDD | 32k: 5.7 320k: 37.5 3200k: 78.3 | 86.5 |
HDD RAID-5 | 530 | 313 |
SATA SSD | 458 | 300 |
NVMe SSD | 2,421 | 2,547 |
PMem(单个 CPU socket) | 9,500 | 37,120 |
对于HDD,我们分别使用32k,320k和3200k的批处理大小进行写入,而随着我们增加批处理大小,读取不会发生太大变化。 对于其他存储类型,我们使用32k的批处理大小,因为增加到更大的批处理大小不会显着提高性能。 对于PMem,我们使用pmdk llpl的PersistentMemoryBlock作为性能基准。
性能结果

如图所示,Pafka 的消费者吞吐率几乎达到了网络性能瓶颈(100 Gbps〜= 12.5 GB / s)。另一方面,相比较于目前数据中心对于高速存储需求常用的 STAT SSD ,Pafka 的吞吐和延迟性能表现均可以达到 20 倍的改进。
成本比较
持久性内存最显著的优点之一是节省了总体拥有成本(TCO)。与原来基于HDD/SDD的Kafka相比,基于持久内存的 Pafka 通过在单个服务器上提供更高的吞吐量来降低成本。
假设我们的目标是提供20 GB /秒的整体吞吐率(瓶颈可以是生产者或消费者,具体取决于存储类型)。 我们将基于 PMem 的 Pafka 与基于 SATA SSD 的Kafka 进行了比较。以下是我们用于硬件成本估算的关键信息:
– 基于 SATA SSD 的 Kafka:单个服务器的硬件成本估计为10,000美元。
– 基于持久内存的 Pafka:我们为相同的服务器配置配备了额外的128 GB x 6 = 768 GB PMem(6 根持久内存条在一个 socket 上,实际中可以使用两个 sockets 进一步提升单节点性能)。 这种由持久内存支持的服务器的硬件成本估计为13,500美元
下图显示,为了实现20 GB /秒的总吞吐率,基于 SATA SSD 的服务器和基于持久内存的服务器的数量分别为 45 和 3。 此外,就硬件成本而言,传统的Kafka(SATA SSD)需要花费为 45 万美元,而我们的 Pafka(持久内存)解决方案仅需花费 4.05 万美元。 Pafka解决方案将硬件成本大大降低到传统Kafka解决方案的9%。

了解更多
欢迎加入以下 Pafka 社区,参与我们的讨论:
- Pafka v0.1.0 已经开源上线,Github repo:https://github.com/4paradigm/pafka
- MemArk 持久内存技术论坛:https://discuss.memark.io/
- Slack channel:https://join.slack.com/t/memarkworkspace/shared_invite/zt-o1wa5wqt-euKxFgyrUUrQCqJ4rE0oPw
One thought on “Pafka: 高性能消息队列系统 Kafka 在持久内存上的优化版本”