AutoMQ-Kafka的替代方案实战
AutoMQ无缝兼容kafka,并且借助S3实现数据统一存储。这个确实解决了大问题!
1. Kafka的挑战
- 横向扩展困难:扩容kafka需要手动创建分区迁移策略和复制分区数据。这个过程不仅风险高、资源密集而且耗时。
- 存储成本高:计算和存储在kafka中是紧密耦合的,这意味着必须同时横向扩展。这中耦合通常会导致资源浪费。此外为保证低延迟和高吞吐量,通常会产生大量的存储费用。
- 自恢复能力较弱:kafka无法从数据热点、容量不均等异常状态中进行自我修复。
- 数据倾斜:kafka无法自动纠正涉及数据倾斜和热点分区的场景,导致性能下降和运营效率低下问题。
- 磁盘读取限制:由于页缓存污染,在kafka中读取历史数据可能会严重影响写入性能。这种降低不仅影响kafka本身,还会将问题影响到上下游系统。
- 资源使用效率低下:kafka紧密耦合的存储和计算模型缺乏弹性。用户必须经常性的冗余配置才能满足峰值需求,这个导致大量资源浪费。此外,数据倾斜和流量不均可能会导致集群效率进一步降低和资源无法充分利用。
2.AutoMQ优势
2.1 核心架构特性
- 存算分离架构:①存储层:基于基于对象存储(如 AWS S3、阿里云 OSS)实现流式数据持久化,替代本地磁盘,降低存储成本达 90%;②计算层:复用 Apache Kafka 100% 的计算逻辑,保持协议兼容性;③通过云盘(如 EBS)作为高性能 WAL(预写日志),保证写入低延迟。
- 无状态Broker:①Broker 节点不存储数据,扩容时无需数据迁移,实现秒级弹性伸缩(例如 3 节点承载 10 倍流量冲击);②故障恢复时,直接通过共享存储重建节点,避免传统 Kafka 的副本同步延迟。
2.2 性能与成本优势
- 10倍成本优化:①存储成本:对象存储单价仅为云盘的 1/8(如阿里云 OSS 0.12元/GiB/月 vs ESSD 1元/GiB/月);②流量成本:消除跨可用区数据复制流量(传统 Kafka 需多副本冗余存储);③ 资源利用率:支持抢占式实例(Spot Instances),进一步降低计算成本。
- 高吞吐与低延迟:①批处理优化:消息集(MessageSet)抽象实现批量压缩(支持 LZ4、ZStandard)与传输,减少 I/O 次数;②零拷贝技术:通过 Linux sendfile 系统调用,数据直接从页缓存发送到网络,避免用户态拷贝;③冷热分离:热数据由内存缓存(Log Cache)处理,冷数据直读对象存储,互不干扰。
2.3 自动化与运维简化
- 智能负载均衡:①内置自动分区重分配,替代 Kafka 的 Cruise Control,无需手动迁移数据;②支持动态流量调度,防止分区热点问题(如某 Broker 流量突增)。
- 故障自愈:①结合云盘(EBS)的多重挂载能力,宕机节点数据秒级切换到新节点;②对象存储提供 11 个 9 的数据持久性,避免数据丢失风险;③监控集成:原生支持 Prometheus 和 OpenTelemetry 指标,实现实时监控与告警。
2.4 生态兼容性
- 100% Kafka协议兼容:①无缝迁移现有 Kafka 应用:命令行工具(如 kafka-topics.sh)、客户端 API 无需修改;②支持所有 Kafka 生态组件(如 Connect、Streams)。
- 多云适配:支持 AWS S3、阿里云 OSS、GCP 等主流对象存储,跨云部署无绑定风险。
2.5 适用场景
2.6 AutoMQ vs Kafka
2.7 总结
AutoMQ通过存算分离架构与深度云远程优化,在保持Kafka生态兼容性的同时实现了:
- 10倍成本降低(对象存储+无副本冗余)
- 100倍弹性升级(秒级扩缩容+无状态Broker)
- 零运维负担(自动负载均衡+故障自愈)
- 生产级可靠性(跨AZ容灾+数据持久性11个9)
3.部署
3.1 先决条件
Docker Compose 版本 > 2.22.0
至少 8GB 可用内存
3.2 docker安装
docker安装,参考:https://blog.csdn.net/taotao_guiwang/article/details/135508643
docker可用镜像:https://blog.csdn.net/taotao_guiwang/article/details/140767744
3.3 automq安装
- docker-compose-cluster.yaml:
这个摘取的官方资料,但是也有一些改造:①automq各节点开放9092、9093接口;②各节点“–override advertised.listeners=”改成实际地址,如“PLAINTEXT://10.86.97.210:9192”。
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.# Single-node AutoMQ setup with MinIO for quick starts
version: "3.8"x-common-variables: &common-envKAFKA_S3_ACCESS_KEY: minioadminKAFKA_S3_SECRET_KEY: minioadminKAFKA_HEAP_OPTS: -Xms1g -Xmx4g -XX:MetaspaceSize=96m -XX:MaxDirectMemorySize=1G# Replace CLUSTER_ID with a unique base64 UUID using "bin/kafka-storage.sh random-uuid"CLUSTER_ID: 5XF4fHIOTfSIqkmje2KFlgservices:# MinIO service for S3 storageminio:container_name: "minio"image: minio/minio:RELEASE.2025-05-24T17-08-30Zenvironment:MINIO_ROOT_USER: minioadminMINIO_ROOT_PASSWORD: minioadminMINIO_DOMAIN: minioports:- "9000:9000" # MinIO API- "9001:9001" # MinIO Consolecommand: [ "server", "/data", "--console-address", ":9001" ]networks:automq_net:healthcheck:test: [ "CMD", "curl", "-f", "http://minio:9000/minio/health/live" ]interval: 5stimeout: 5sretries: 3# Create needed bucketsmc:container_name: "mc"image: minio/mc:RELEASE.2025-05-21T01-59-54Zdepends_on:minio:condition: service_healthyentrypoint: >/bin/sh -c "until (/usr/bin/mc alias set minio http://minio:9000 minioadmin minioadmin) do echo '...waiting...' && sleep 1; done;/usr/bin/mc rm -r --force minio/automq-data;/usr/bin/mc rm -r --force minio/automq-ops;/usr/bin/mc mb minio/automq-data;/usr/bin/mc mb minio/automq-ops;/usr/bin/mc policy set public minio/automq-data;/usr/bin/mc policy set public minio/automq-ops;tail -f /dev/null"networks:- automq_net# Three nodes for AutoMQ clusterserver1:container_name: "automq-server1"image: automqinc/automq:1.5.1stop_grace_period: 1menvironment:<<: *common-envports:- "9092:9092"- "9093:9093"command:- bash- -c- |/opt/automq/kafka/bin/kafka-server-start.sh \/opt/automq/kafka/config/kraft/server.properties \--override cluster.id=$$CLUSTER_ID \--override node.id=0 \--override controller.quorum.voters=0@server1:9093,1@server2:9093,2@server3:9093 \--override controller.quorum.bootstrap.servers=server1:9093,server2:9093,server3:9093 \--override advertised.listeners=PLAINTEXT://10.86.97.210:9092 \--override s3.data.buckets='0@s3://automq-data?region=us-east-1&endpoint=http://minio:9000&pathStyle=true' \--override s3.ops.buckets='1@s3://automq-ops?region=us-east-1&endpoint=http://minio:9000&pathStyle=true' \--override s3.wal.path='0@s3://automq-data?region=us-east-1&endpoint=http://minio:9000&pathStyle=true'networks:automq_net:depends_on:- minio- mcserver2:container_name: "automq-server2"image: automqinc/automq:1.5.1stop_grace_period: 1menvironment:<<: *common-envports:- "9192:9092"- "9193:9093"command:- bash- -c- |/opt/automq/kafka/bin/kafka-server-start.sh \/opt/automq/kafka/config/kraft/server.properties \--override cluster.id=$$CLUSTER_ID \--override node.id=1 \--override controller.quorum.voters=0@server1:9093,1@server2:9093,2@server3:9093 \--override controller.quorum.bootstrap.servers=server1:9093,server2:9093,server3:9093 \--override advertised.listeners=PLAINTEXT://10.86.97.210:9192 \--override s3.data.buckets='0@s3://automq-data?region=us-east-1&endpoint=http://minio:9000&pathStyle=true' \--override s3.ops.buckets='1@s3://automq-ops?region=us-east-1&endpoint=http://minio:9000&pathStyle=true' \--override s3.wal.path='0@s3://automq-data?region=us-east-1&endpoint=http://minio:9000&pathStyle=true'networks:automq_net:depends_on:- minio- mcserver3:container_name: "automq-server3"image: automqinc/automq:1.5.1stop_grace_period: 1menvironment:<<: *common-envports:- "9292:9092"- "9293:9093"command:- bash- -c- |/opt/automq/kafka/bin/kafka-server-start.sh \/opt/automq/kafka/config/kraft/server.properties \--override cluster.id=$$CLUSTER_ID \--override node.id=2 \--override controller.quorum.voters=0@server1:9093,1@server2:9093,2@server3:9093 \--override controller.quorum.bootstrap.servers=server1:9093,server2:9093,server3:9093 \--override advertised.listeners=PLAINTEXT://10.86.97.210:9292 \--override s3.data.buckets='0@s3://automq-data?region=us-east-1&endpoint=http://minio:9000&pathStyle=true' \--override s3.ops.buckets='1@s3://automq-ops?region=us-east-1&endpoint=http://minio:9000&pathStyle=true' \--override s3.wal.path='0@s3://automq-data?region=us-east-1&endpoint=http://minio:9000&pathStyle=true'networks:automq_net:depends_on:- minio- mcnetworks:automq_net:name: automq_netdriver: bridgeipam:driver: defaultconfig:- subnet: "10.6.0.0/16"gateway: "10.6.0.1"
- 安装:
docker-compose -f docker-compose-cluster.yaml up -d
- minio访问
http://10.86.97.210:9001/
账号、密码:minioadmin
4.Springboot集成
集成方法与kafka一样,详见下文,springboot集成部分:https://blog.csdn.net/taotao_guiwang/article/details/149832883
5.工具调用
6.相关资源
docker镜像,如果镜像网站不好用,可以下载后,手动加载:
镜像见,百度网盘:https://pan.baidu.com/s/16OsmYtorstnra0ycJlqgtQ?pwd=3rbh
加载方法:
docker load -i mc.RELEASE.2025-05-21T01-59-54Z.tar
docker load -i minio.RELEASE.2025-05-24T17-08-30Z.tar
docker load -i automq:1.5.1.tar
# 查看镜像
docker images