借助高效的消息队列对事务流进行可靠的实时处理,是提升各类 IT 系统整体功效的重要方法之一。我们在流行的 Kafka 系统基础上导入英特尔® 傲腾™ 持久内存打造的全新开源 Pafka 系统,不仅能帮助用户突破传统消息队列中的性能瓶颈并降低其 TCO,还能让用户以零代码的改造成本迁移到新系统并利用好新系统。”
郑曌,第四范式技术副总裁,基础技术负责人
在大数据价值愈发凸显、适用于海量数据处理的分布式系统架构愈来愈流行的今天,事务 (Event) 的快速传递与交互,已成为各类 IT 系统,尤其是数据驱动的系统发挥更强效能的一大关键因素。作为主流的开源分布式事件流及消息队列 (Message Queue,MQ) 系统,Apache Kafka 堪称正当红的“技术明星”,已被全球数千家企业用于高性能数据传输、流分析、数据集成等场景,以支撑他们关键业务的顺畅运作。
不过,随着数据体量和维度,以及相对应 IT 系统规模的迅速增长,用户在 Kafka 部署中如果还采用传统存储设备,那么在读写性能上就有可能面临越来越严峻的挑战,其典型表现就是在用户业务规模不断扩展时,由 Kafka 构建的消息队列系统在吞吐量等性能指标上将很难跟上业务的需求,用户为此往往需要采用扩大消息队列集群的方案来缓解压力,但这种做法又会造成总体拥有成本 (Total Cost of Ownership,TCO) 的增加。
为了在充分发挥 Kafka 既有优势的同时破解这一难题,领先的人工智能平台与技术服务提供商第四范式 (北京) 技术有限公司 (以下简称 “第四范式”) 与英特尔携手,在 Kafka 系统的基础上双管齐下,包括在硬件上导入基于全新高性能、低时延存储介质的英特尔® 傲腾™ 持久内存,以及借助英特尔开源的持久内存开发套件 (Persistent Memory Development Kit,以下简称 PMDK) 开展多方位的软件优化,进而构建了全新的开源 Pafka 系统1。
验证测试的结果表明,与 Kafka 系统相比,经过软硬协同优化的 Pafka 系统在读写性能上收获了显著的增益,其单节点吞吐量的大幅提升,可为多样化的消息队列应用场景提供更为经济高效的弹性解决方案,使用户系统能够更好地兼顾性能、可用性、可扩展性以及 TCO。
背景与挑战:筑就高效事务流水线,Kafka 亟需更优存储基座
当前业界,若谈起消息中间件,必言 Apache Kafka。这个开源分布式事件流及消息队列系统的影响力之强,以致于不论是深耕分布式架构和大数据应用多年的互联网企业,还是将云化、数字化和智能化转型视为未来核心竞争力的传统企业,也不论其核心业务是在线金融交易,还是物流交通系统,是零售订单管理,抑或智能健康监控,他们几乎都在普遍采用由 Kafka 构建的消息队列系统,来驱动往来纵横的数据事务流,将种类繁多、功能各异的应用组件连接起来,形成其高效、可靠的技术基石。
以电商平台为例,当其开始运转时,Kafka 系统就犹如工厂流水线一样,推动各类事务在会员系统、订单系统、支付系统、仓储系统、物流系统以及客服系统等不同组件之间的高速流转,并获得相应处理。换言之,在应用组件之间建立这种畅通的通信机制,打造高效事务流水线,正是提升各类 IT 系统整体运行效率的必备举措。
当然,Kafka 赢得众多企业青睐的原因,也离不开它相比其它同类吞吐能力更高、可用性更强、扩展性更优及可持久化存储等特点,而这些优势的根源,则在于它能让消息队列系统的生产者 (Producer) 与消费者 (Consumer) 对事务流进行高效、持久与可靠地读写—它在设计中采用了将事务数据追加写入 (Append Write) 文件,以及通过相应偏移量 (Offset) 从文件读取事务数据的方式。这一方式不仅带来数据持久化的能力,还实现了读写操作互不阻塞、数据大小不影响性能且采用线性访问存储设备等收益,进而还提升了 Kafka 系统的性能表现。
这一设计,也让存储设备的三种能力,即读写速度 (尤其是写入速度)、持久性以及存储容量,成为 Kafka 系统性能 (吞吐量、时延等) 的关键决定要素。如图一所示,由 Kafka 构建的消息队列系统就犹如工厂中的仓库一般,入库、出库速度越快,存放越可靠,仓储容量越大,在工厂运作中发挥的作用也就越显著。
正因为 Kafka 非常倚重存储设备的这三种能力,随之而来且越来越明显的一个问题就是,以机械硬盘 (Hard Disk Drive,以下简称 HDD) 或固态盘 (Solid State Drive,以下简称 SSD) 来作为存储设备的 Kafka 消息队列系统,可能会让用户面临如下挑战:
- 受限于硬件特性,HDD 和 SSD 在性能,如每秒输入 / 输出操作 (Input / Output Operations Per Second,IOPS) 和时延等方面,始终逊于动态随机存取存储器 (Dynamic Random Access Memory,以下简称 DRAM) 这种更靠近处理器的内存型组件,当应用场景对吞吐量、时延等性能有着更为苛刻的要求时,Kafka 系统就可能成为整体系统的瓶颈;
- 当用户需要增加 Kafka 系统的容量来进一步扩展吞吐量时,通常只能采用增加集群规模,实施横向扩展的方案来予以应对,这不免会带来用户 TCO 的增加,且在数据量高峰过后也会带来硬件的过量冗余,造成资源浪费。
为助力用户充分利用 Kafka 的既有优势,并更好地破解其潜在的性能瓶颈,进而构建性能和成本更优、综合竞争力更强的消息队列系统,第四范式携手英特尔,以 Kafka 系统为基础,导入英特尔® 傲腾™ 持久内存打造了全新的开源 Pafka 系统。该系统借助傲腾™ 持久内存产品在性能上更接近 DRAM,在容量上数倍于 DRAM 且具备数据持久化能力的综合优势,不仅能有效改善用户消息队列在吞吐量、时延等方面的性能,也能帮助用户大幅减少硬件投入成本;同时,它与 Kafka 良好的兼容性,也让用户无需修改原有的、基于 Kafka 系统的业务代码,以零代码改造成本实现向 Pafka 系统的迁移。
解决方案:基于英特尔® 傲腾™ 持久内存,第四范式打造全新开源 Pafka 系统
由第四范式开发和开源的 Pafka 系统基本架构如图二所示:它与 Kafka 系统类似,在分布式方案部署的 Pafka 集群中,每一个节点都被称为 Broker,每个 Broker 由多个 Partition (分区) 组成,每个 Partition 又可分为若干个 Segment (分段)。当生产者发布一段消息数据后,数据会被分割为若干片段,追加写入各个 Partition 中。
传统上,Segment 通过 Java Filechannel 等文件读写接口存储在 HDD、SSD 等较传统的存储设备上,而 Pafka 系统基于 PMDK 的优化,加入了 MixChannel 来实现基于异构存储设备的读写操作,使数据既能存储在 HDD 或 SSD 上,也可以存储在基于创新存储介质的英特尔® 傲腾™ 持久内存上,MixChannel 可以对不同的接口实施统一管理,这使得多级存储架构的实现变得更为便捷。
基于上述架构,正在颠覆传统内存-存储架构的英特尔® 傲腾™ 持久内存,可让用户在更靠近处理器的位置实现对更大体量数据的高效访问,从而使基于傲腾™ 持久内存的消息队列能更快地获得所需的计算能力,这就为 Pafka 系统的存储性能飞跃奠定了坚实的基础。英特尔® 傲腾™ 持久内存存储密度更高、单位存储成本更低且单模组容量最高可达 512GB 的特性,及其持久化存储能力则有助于用户更为经济地扩展消息队列的容量,并满足消息队列持久化存储的要求。
为了充分发挥傲腾™ 持久内存的上述硬件特性及其优势,英特尔还支持第四范式开展了多项软件优化工作,包括前文提及的开发面向英特尔® 傲腾™ 持久内存的文件读写接口、实施基于分级存储的架构优化,还有自动化的后台数据迁移策略等,这些优化可让傲腾™ 持久内存的各项特性在 Pafka 系统中物尽其用。
■ 面向英特尔® 傲腾™ 持久内存的文件读写接口
为提升 Pafka 系统在英特尔® 傲腾™ 持久内存上的读写性能和稳定性,双方携手通过 PMDK 等工具开发了面向傲腾™ 持久内存的文件读写接口并实施性能优化,细节包括:
- Pmemchannel 接口:Pafka 系统使用 PMDK llpl2 的 libpmem 接口重写部分代码,将 MemoryBlock 对象作为傲腾™ 持久内存 Channel 数据读写的基础;同时引入 MixChannel 的概念,协同不同存储介质的数据读写,并加入新的 PMemchannel 接口,其可将 MemoryBlock 对象封装成兼容 Java FileChannel 的接口,原先使用 Kafka 的用户只需做少量适配工作即可使用;
- 持久化元数据:Pafka 系统为每个 Segment 分配了一个基于傲腾™ 持久内存的 MemoryBlock 对象,并基于这一映射关系自动为每次写入的数据进行持久化,同时使用 PMDK pcj ObjectDirectory 来维护映射关系;
- 性能优化:Pafka 系统还采用了直接映射傲腾™ 持久内存的地址到网络 Buffer 的设计来实现零拷贝 (zero-copy),通过避免数据多次拷贝来提升性能;此外,为避免 MemoryBlock 在 Pafka 系统运行时动态分配的额外开销,系统会在初始化时预先分配一定比例的内存池 (MemPool),在写数据时快速分配给 MemoryBlock。
■ 基于分级存储的架构优化
全新 Pafka 系统采用了分级存储架构 (Tiered Storage Architecture) 的设计,可以较低成本提升消息队列的性能。随着英特尔® 傲腾™ 持久内存的采用,消息队列系统在存储设备上的选择已变得更为丰富。在新的设计中,可以允许用户使用傲腾™ 持久内存作为第一级高速持久化存储,使用 HDD 或 SSD 作为第二级存储介质,从而形成容量与性能的平衡。
基于分级存储策略,Pafka 系统会将较新的数据存储在傲腾™ 持久内存上,而将较旧的数据迁移到速度较慢的 SSD 或 HDD,这一迁移过程会通过迁移阈值 (storage.migrate.threshold) 来进行控制。
■ 自动化的后台数据迁移策略
基于分级存储架构,Pafka 系统还构建了自动化的后台数据迁移策略。如图四所示,事务数据写入会优先选择性能较高的英特尔® 傲腾™ 持久内存,傲腾™ 持久内存被写满后才会写入 SSD 或 HDD;而后台的数据迁移机制使得傲腾™ 持久内存上的数据量大于迁移阈值时,迁移机制就会启动把较旧数据迁移到 SSD 或 HDD 的动作;反之,当傲腾™ 持久内存上存储的数据量小于迁移阈值时,相对较新的数据会从 SSD 或 HDD 反向迁移到傲腾™ 持久内存上。
效果验证:先进存储基座与多维软件优化带来全面性能提升
借助更先进、高效的存储硬件基座与多方位的软件调优支持,Pafka 系统可为用户带来性能更优、成本更经济的消息队列方案。对此,第四范式与英特尔一起已基于多种场景进行了验证。
■ 基于英特尔® 傲腾™ 持久内存的 Pafka 系统读写性能验证
读写性能是用户在使用消息队列时重点关注的指标,为此,验证测试针对不同规模 (Broker 节点数量与消费者数量),分别基于英特尔的 NVMe SSD 和英特尔® 傲腾™ 持久内存两种存储设备,在 Kafka 和 Pafka 系统上进行了读写性能的对比测试,测试以吞吐量作为性能指标。参与测试的各组对存储设备与消息队列软件的设置如下:
- 配置 1:全部数据置于 NVMe 固态盘,采用 Kafka 系统;
- 配置 2:全部数据置于英特尔® 傲腾™ 持久内存,采用 Kafka 系统;
- 配置 3:全部数据置于英特尔® 傲腾™ 持久内存,采用 Pafka 系统。
首先,在数据写入性能对比上,测试结果如图五所示3:
- 从 NVMe SSD 升级换用英特尔® 傲腾™ 持久内存后,Kafka 系统性能提升高达 1.46 倍至 1.48 倍;
- 采用英特尔® 傲腾™ 持久内存后再搭配以 Pafka 系统,借助其各种软件层面的优化,相比于傲腾™ 持久内存 + Kafka 的组合,性能可进一步提升高达 1.4 倍至 1.8 倍;
- 综合而言,融合英特尔® 傲腾™ 持久内存与软件调优后的 Pafka 系统,在数据写入性能上远优于使用 NVMe SSD 的 Kafka 系统,性能可提升至其 2 倍至 2.61 倍。
在数据读取性能对比上,测试结果则如图六所示3:
- Kafka 系统搭配英特尔® 傲腾™ 持久内存的性能,相比其与 NVMe SSD 的组合提升高达 2.29 倍至 2.48 倍;
- 综合而言,搭配傲腾™ 持久内存的 Pafka 系统在数据读取性能上同样远优于使用 NVMe SSD 的 Kafka 系统,性能可达其 2.29 倍至 2.49 倍。
从上述数据读写性能的对比测试结果可看出:
- 来自英特尔® 傲腾™ 持久内存的硬件优势,无论在数据的写入还是读取场景中,都可以帮助消息队列获得显著的性能增益,这是 Pafka 系统获得性能优势的硬件基座;
- 基于英特尔® 傲腾™ 持久内存的文件读写接口等软件调优手段,可帮助消息队列在数据写入场景中进一步提升性能增益,结合英特尔® 傲腾™ 持久内存在容量上的优势,可更有效地帮助用户应对突发性高流量等场景的需要。
■ 针对突发性高流量场景的性能验证
突发性高流量场景在目前各类互联网应用中的出现越来越频繁。例如在电商平台中,商家每隔一段时间会开展特定的促销活动,此时平台短期内会有突发性的高流量产生。要应对这一场景,传统的消息系统就需要额外配备节点,可由于高吞吐需求只是间隔性出现,这些节点在平时就处于空闲状态。
基于英特尔® 傲腾™ 持久内存的 Pafka 系统可帮助用户有效应对这一问题。一方面,借助傲腾™ 持久内存在单节点吞吐量上的优势,新系统在相同成本情况下能够为用户提供更大的吞吐量。如在 MemArk 社区4 发布的技术博文中,有数据显示:要实现同样的吞吐量,基于英特尔® 傲腾™ 持久内存的 Pafka 系统硬件成本仅需传统 Kafka 方案 (基于 SSD) 的 9%5。
另一方面,分级存储的架构优化也为 Pafka 系统应对突发性高流量场景提供了更可靠的保障。在一项测试中,测试者分别设定了两种不同状况的数据峰值,并设定迁移阈值为 0.5,即预留一半英特尔® 傲腾™ 持久内存来处理高吞吐需求。测试结果表明,基于英特尔® 傲腾™ 持久内存的 Pafka 系统可以帮助用户在短时间内应对多个高吞吐需求6。
这一结果就充分见证了 “傲腾™ 持久内存 + Pafka 系统” 在节支方面的突出优势—过去用户们在面对突发性高流量场景时,比较常见的做法就是采购大量高成本的物理机资源,以扩大集群规模的方式来应对。这种做法的问题,就是添置的物理机会在流量峰值过去后处于闲置状态,这不仅会造成硬件采购成本的大幅提升,也会带来运维成本的增加。而今,新方案的引入,英特尔® 傲腾™ 持久内存在容量、性能上的优势可以让用户仅小幅增加成本就能满足突发性高流量场景需求,大大降低了 TCO7。
■ 针对稳定高吞吐需求场景的验证
在一些稳定的业务平台上,如在线音乐、视频网站的 AI (Artificial Intelligence,人工智能) 推荐系统等,它们需要将以往预测结果、预测请求以及行为反馈数据形成消息队列,并传递给自动特征工程和自动模型训练组件,等消费者来完成下一步特征工程的构建和训练任务,因此系统可能会在长时间内都有稳定高吞吐的数据压力。
在这种场景下,用户同样可选择基于英特尔® 傲腾™ 持久内存的 Pafka 系统,来提升整体吞吐量并降低相应的 TCO:与基于 SSD 和 HDD 等传统存储设备的消息队列相比8,当数据全部置于英特尔® 傲腾™ 持久内存时,Pafka 系统在单服务器上一个 socket 的吞吐和延迟的性能提升可达 20 倍左右,同时单节点吞吐性能的提升,也使用户在消息队列集群上的硬件投入成本可减少 10 倍以上;而在迁移成本上,由于 Pafka 系统是基于 Kafka 系统改造,用户原有业务代码无需修改,能做到零代码改造迁移至新系统。
未来展望
凭借出色的性能增益以及可观的 TCO 优势,第四范式基于英特尔® 傲腾™ 持久内存和 PMDK 开发、开源的 Pafka 系统已在某些应用场景中进行了验证测试并达成了预期的结果。基于此,第四范式及英特尔等合作伙伴正针对 Pafka 系统开展更多软硬件优化及积极部署举措,包括第四范式已计划在下一代 SageOne 产品中搭载基于英特尔® 傲腾™ 持久内存的 Pafka 系统,并准备在零售、银行等行业的 AI 应用中重点推广与落地。
面向未来更为多样化及更为严苛的应用需求,英特尔还将与第四范式一起,继续推动 Pafka 系统的持续迭代更新以及在各类规模化、商用化场景中的应用,让更多行业企业基于更优的成本和更平滑的迁移,用上性能、可用性和可靠性更优的消息队列,为他们 IT 系统中高效事务流水线的打造献技献力。