AutoMQ vs. Apache Kafka 性能对比
对比结论
100x 效率提升
-
相比 Apache Kafka 300 倍的分区迁移效率: AutoMQ 分区迁移速度相比 Apache Kafka 提升约 300 倍。AutoMQ 将 Kafka 高风险的常规运维动作,变成了可自动化,基本无感的低风险运维操作。
-
4min 从零到 1GiB/s 的极致弹性: AutoMQ 集群自动应急弹性从 0 MiB/s 到 1 GiB/s 仅需 4 分钟。它使得系统可以快 速扩容响应突发流量。
-
相比 Apache Kafka 200 倍的冷读效率: AutoMQ 读写分离,相比 Apache Kafka 发送耗时降低 200 倍,追赶吞吐提高 5 倍。AutoMQ 可以轻松的应对在线消息削峰填谷和离线批处理的场景。
10x 成本节约
-
相比 Apache Kafka 2 倍吞吐极限: 相同的硬件规格,AutoMQ 极限吞吐是 Apache Kafka 的 2 倍,发送耗时 P999 为 Apache Kafka 的 1 / 4。在实时流计算场景,使用 AutoMQ 可以用更低的成本,更快的得到计算结果。
-
相比 Apache Kafka 1/11 的账单费用: AutoMQ 充分利用 Auto Scaling 和对象存储,相比 Apache Kafka 实现 11 倍的降本。使用 AutoMQ 无需再为峰值准备容量,实现真正的计算和存储按量付费。
测试准备
基准测试在 Linux Foundation's OpenMessaging Benchmark 的基础上进行增强,模拟真实用户场景提供了动态工作负载。所有测试场景均可以在 Github 代码库中找到配置和负载。
配置参数
AutoMQ 默认数据强刷盘再响应,使用配置如下:
acks=all
flush.message=1
AutoMQ 通过 EBS 底层的多副本机制来保障数据高可靠,在 Kafka 侧无需多副本配置。
Apache Kafka 选择 3.6.0 版本,并参考 Confluent 的建议不设置 flush.message = 1,使用三副本内存异步刷盘来保障数据的可靠性(机房掉电故障会造成数据丢失),配置如下:
acks=all
replicationFactor=3
min.insync.replicas=2
机器规格
从成本效益来说,小规格机型 + EBS 比带 SSD 的大规格机器更优。
以小规格 r6in.large + EBS vs. 大规格 i3en.2xlarge + SSD 为例:
-
i3en.2xlarge,8 核,64 GB 内存,网络基准带宽 8.4 Gps,自带两块 2.5 TB 的 NVMe SSD,硬盘最大吞吐 600 MB/s;价格 $0.9040/h。
-
r6in.large * 5 + 5 TB EBS,10 核,80GB 内存,网络基准带宽 15.625 Gbps,EBS 基准带宽 625 MB/s;价格 (计算)0.1743 * 5 + (存储)0.08 * 5 * 1024 / 24 / 60 = $1.156/h。
初看两者的价格和性能相差无几。考虑到实际生产中希望数据保存更久的时间,使用 i3en.2xlarge 只能水平扩容计算节点来提升集群的存储空间,浪费了计算资源。如果使用 r6in.large + EBS,只需要调整 EBS 的容量即可。
因此从成本、性能综合考虑, AutoMQ 和 Apache Kafka 计算均选择 r6in.large 作为 Broker 弹性最小单元,存储选择 GP3 类型的 EBS 和 Standard S3。
-
r6in.large:2 核,16 GB 内存,网络基准带宽 3.125 Gbps,EBS 基准带宽 156.25 MB/s;价格 $0.1743/h。
-
GP3 EBS:免费额度 3000 IOPS,125 MB/s 带宽;价格 存储 $0.08 GB 每月,额外带宽 $0.040 MB/s 每月,额外 IOPS $0.005 每月。
AutoMQ 和 Apache Kafka 对 EBS 的定位不同:
-
AutoMQ 用 EBS 作为写入缓冲区,因此 EBS 只需配置 3 GB 存储空间,IOPS 和带宽使用免费额度即可。
-
Apache Kafka 数据都存储在 EBS 上,EBS 空间由具体测试场景的流量和保存时间决定。额外购买 EBS 带宽 31 MB/s,进一步提高 Apache Kafka 的单位成本吞吐。
100x 效率提升
秒级分区迁移
在生产环境中,一个 Kafka 集群通常会服务多个业务,业务的流量波动和分区分布可能造成集群容量不足或者机器热点,Kafka 运维人员需要通过集群扩容,并且将热点分区迁移到空闲的节点,来保障集群的服务可用性。
分区迁移的时间决定了应急和运维效率:
-
分区迁移的时间越短,集群从扩容到容量满足诉求的时间越短,服务受损的时间越短。
-
分区迁移越快,运维人员观测的时间更短,可以更快的得到运维反馈决策后续的动作。
300x 效率提升,AutoMQ 相比 Apache Kafka 30 GiB 分区迁移耗时从 12min 下降到 2.2s。
测试
本测试测量 AutoMQ 和 Apache Kafka 在带日常发送消费流量场景下,迁移一个具备 30 GiB 数据的分区到一个不存在该分区副本的节点的迁移耗时和影响。具体的测试场景为:
-
2 台 r6in.large 作为 broker,在其上创建:
-
1 个单分区单副本的 Topic A,并以 40 MiB/s 吞吐持续读写。
-
1 个 4 分区单副本的 Topic B,并以 10 MiB/s 吞吐持续读写,作为背景流量。
-
-
13 分钟后,将 Topic A 的唯一一个分区迁移到另一个节点,迁移吞吐限制 100 MiB/s。
Apache Kafka 每台 broker 额外分别挂载一块 320GB 156MiB/s gp3 EBS 用于存储数据。
驱动文件:apache-kafka-driver.yaml,automq-for-kafka-driver.yaml
负载文件:partition-reassignment.yaml
AutoMQ 安装配置文件:partition-reassignment.yaml
对比项 | AutoMQ | Apache Kafka |
---|---|---|
迁移耗时 | 2.2s | 12min |
迁移影响 | 最大发送延时 2.2s | 12min 内持续发送耗时 1ms ~ 90ms 抖动 |
分析
AutoMQ 分区迁移只需要将 EBS 中缓冲的数据上传到 S3 即可在新的节点安全打开,500 MiB 的数据通常在 2 秒内即可完成上传。AutoMQ 分区的迁移耗时和分区的数据量无关,分区迁移时间平均下来在 1.5 秒左右。AutoMQ 分区在迁移过程中向客户端返回 NOT_LEADER_OR_FOLLOWER 错误码,在迁移完成后客户端更新到新的 Topic 路由表,客户端内部重试发送到新的节点,因此该分区的此刻的发送延迟会上涨,迁移完成后恢复到日常水位。
Apache Kafka 分区迁移需要将分区的副本拷贝到新的节点,拷贝历史数据的同时还要追赶新写入的数据,迁移的耗时 = 分区数据量 / (迁移吞吐限制 - 分区写入吞吐),在实际生产环境中,分区迁移往往是小时级的,本测试中的 30 GiB 的分区迁移耗时就到了 12 分钟。除了迁移耗时长以外,Apache Kafka 迁移需要从硬盘读取冷数据,即使在设置了 throttle 的情况下,仍旧会因为抢占 page cache 导致发送延迟的抖动,影响服务质量,体现在图中为绿色曲线抖动的部分。
0 -> 1 GiB/s 极致弹性
Kafka 运维人员通常会根据历史经验准备 Kafka 集群容量,然而总会有一些非预期中的热门事件和活动导致集群流量陡增。这时候就需要快速的将集群扩容并重平衡分区,来应对突发流量。
极致弹性,AutoMQ 集群自动应急弹性从 0 MiB/s 到 1 GiB/s 仅需 4 分钟。
测试
本测试的目的是测量 AutoMQ 的 Auto Scaling 应急弹性功能自动从 0 MiB/s 到 1 GiB/s 的弹性速度。具体的测试场景为:
-
集群初始只有 1 个 Broker,设置 Auto Scaling 应急弹性容量为 1 GiB/s,创建一个 1000 分区的 Topic。
-
启动 OpenMessaging 直接将发送流量设置为 1 GiB/s。
驱动文件:apache-kafka-driver.yaml,automq-for-kafka-driver.yaml
AutoMQ 安装配置文件:emergency-scaling.yaml
分析项 | 监控报警 | 批量扩容 | Auto Balancing | 总计 |
---|---|---|---|---|
0 -> 1 GiB/s 弹性耗时 | 70s | 80s | 90s | 4min |
分析
AutoMQ 的集群容量通常通过 Auto Scaling 的目标跟踪策略将集群水位维持在 80%。在非预期流量陡增场景,目标跟踪策略无法满足及时满足容量诉求,Auto Scaling 提供应急策略,当集群水位超过 90% 时,直接将集群弹性到目标容量。
本测试中 Auto Scaling 应急策略 4 分钟就将集群容量弹性到目标容量:
-
70s:AWS CloudWatch 监控最高的监控精度为 1 分钟。监控采集到集群水位超过 90%,并产生报警。
-
80s:AWS 批量扩容节点到目标容量,Broker 完成节点注册。
-
90s:AutoMQ 的 Auto Balancing 检测到节点间流量不均衡,完成流量自动重平衡。
-
集群容量满足 1 GiB/s 诉求,发送耗时回归基准时间。
追赶读(Catch-up Read)
追赶读是消息和流系统常见的场景:
-
对于消息来说,消息通 常用作业务间的解耦和削峰填谷。削峰填谷要求消息队列能将上游发送的数据堆积住,让下游慢慢的消费,这时候下游追赶读的数据都是不在内存中的冷数据。
-
对于流来说,周期性的批处理任务需要从几个小时甚至一天前的数据开始扫描计算。
-
额外还有故障场景:消费者宕机故障若干小时后恢复重新上线;消费者逻辑问题,修复后,回溯消费历史数据。
追赶读主要关注两点:
-
追赶读的速度:追赶读速度越快,消费者就能更快从故障中恢复,批处理任务就能更快产出分析结果。
-
读写的隔离性:追赶读需要尽量不影响生产的速率和延时。
200x 效率提升,AutoMQ 读写分离相比 Apache Kafka 在追尾读场景,发送耗时从 800ms 下降到 3ms,追赶时间从 215 min 缩短到 42 min。
测试
本测试测量 AutoMQ 和 Apache Kafka 在相同集群规模下的追赶读性能,测试场景如下:
-
集群部署 20 台 Broker,创建 1 个 1000 分区的 Topic。
-
以 800 MiB/s 的吞吐持续发送。
-
在发送 4 TiB 数据后,拉起消费者,从最早的位点开始消费。
Apache Kafka 每台 broker 额外分别挂载一块 1000GB 156MiB/s gp3 EBS 用于存储数据。
驱动文件:apache-kafka-driver.yaml,automq-for-kafka-driver.yaml
负载文件:catch-up-read.yaml
AutoMQ 安装配置文件:catch-up-read.yaml
对比项 | 追赶读过程中发送耗时 | 追赶读过程中对发送流量影响 | 追赶读峰值吞吐 |
---|---|---|---|
AutoMQ | 小于 3ms | 读写隔离,维持 800 MiB/s | 2500 ~ 2700 MiB/s |
Apache Kafka | 大约 800ms | 相互影响,下跌到 150 MiB/s | 2600 ~ 3000 MiB/s (牺牲写入) |