当前位置: 首页 > 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.dtcms.com/a/318863.html

相关文章:

  • JAVA第六学:数组的使用
  • 【C++】哈希表原理与实现详解
  • 基于langchain的两个实际应用:[MCP多服务器聊天系统]和[解析PDF文档的RAG问答]
  • 智能制造的中枢神经工控机在自动化产线中的关键角色
  • 行业应用案例:MCP在不同垂直领域的落地实践
  • 二叉树算法之【中序遍历】
  • OpenAI重磅发布:GPT最新开源大模型gpt-oss系列全面解析
  • SpringBoot请求重定向目标地址不正确问题分析排查
  • 六类注定烂尾的甲方软件外包必看!这类甲方不要理-优雅草卓伊凡
  • 上门家教 app 用户端系统模块设计
  • 区块链简介
  • C++位图(Bitmap)与布隆过滤器(Bloom Filter)详解及海量数据处理应用
  • java excel转图片常用的几种方法
  • 分布式接口限流与防重复提交实现方案
  • 快速搭建vue3+flask实现一个异物检测项目
  • RP2040下的I2S Slave Out,PIO状态机(四)
  • MT信号四通道相关性预测的Informer模型优化研究
  • 此芯p1开发板使用OpenHarmony时llama.cpp不同优化速度对比(GPU vs CPU)
  • 掌握工程化固件烧录,开启你的技术进阶之路-FPGA ISE(xilinx)
  • 微软推出“愤怒计划“:利用AI工具实现恶意软件自主分类
  • Daemon Tools for Mac —— 专业虚拟光驱与磁盘映像工具
  • 手机控制断路器:智能家居安全用电的新篇章
  • Casrel关系抽取
  • 如何快速开发符合Matter标准的智能家居设备?
  • 在 openEuler 24.03 (LTS) 上安装 FFmpeg 的完整指南
  • 接入小甲鱼数字人API教程【详解】
  • 物联网架构全解析:华为“1+2+1”与格行随身WiFi,技术如何定义未来生活?
  • 优选算法 力扣 LCR 179. 查找总价格为目标值的两个商品 双指针降低时间复杂度 C++题解 每日一题
  • 界面组件DevExpress WPF中文教程:网格视图数据布局 - 紧凑模式
  • 代企业开发钉钉数据对接