当前位置: 首页 > news >正文

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

在这里插入图片描述

http://www.lryc.cn/news/612888.html

相关文章:

  • QML与C++交互的方式
  • Kafka数据生产和发送
  • 基于Spring Cloud Stream与Kafka的事件驱动微服务架构设计与实战指南
  • 【Kafka系列】第二篇| Kafka 的核心概念、架构设计、底层原理
  • MQTT:Dashboard访问授权
  • MQTT:Dashboard黑名单与连接抖动
  • 【LeetCode】set和map相关算法题 前K个高频单词、随机链表的复制、两个数组的交集、环形链表
  • Flink-1.19.0源码详解9-ExecutionGraph生成-后篇
  • VScode使用jupyter notebook,配置内核报错没有torch解决
  • 贪心算法分析与解决指南
  • 1.电动汽车动力电池系统技术介绍与分类
  • 机器视觉系统工业相机的成像原理及如何选型
  • OpenCV图像处理入门实战指南
  • 为什么需要日志收集系统
  • 【运维】自动化生产环境部署工作流
  • Mac/Windows跨平台PDF与AI高效解决方案
  • day 48 模型的可视化与推理
  • 连续最高天数的销售额(动态规划)
  • 3D 软件在游戏开发中的全链路应用:从原型到上线的实战解析
  • 音乐创作好助手—— 蘑兔音乐
  • 【自动驾驶】《Sparse4Dv3》代码学习笔记
  • uniapp/uniappx实现图片或视频文件选择时同步告知权限申请目的解决华为等应用市场上架审核问题
  • 行业应用案例:MCP在不同垂直领域的落地实践
  • 学深度学习,有什么好的建议或推荐的书籍?
  • 深入解析Java类加载机制:双亲委派模型的设计与实现
  • 开源大模型实战:GPT-OSS本地部署与全面测评
  • Android 之 Jetpack - Lifecycle
  • 告别复杂配置!cpolar让Prometheus监控突破网络限制
  • 【PHP 接口(Interface)完全入门指南】
  • 力控汽车零部件冲压MES系统方案