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.pswp.cn/bicheng/92871.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92871.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Numpy科学计算与数据分析:Numpy线性代数基础与实践

Numpy线性代数实践&#xff1a;从矩阵乘法到特征值 学习目标 通过本课程&#xff0c;学员将掌握Numpy中处理线性代数问题的基本方法&#xff0c;包括矩阵乘法、求解线性方程组以及计算特征值和特征向量。本课程将通过理论与实践相结合的方式&#xff0c;帮助学员深入理解这些…

CrackMapExec--安装、使用

用途限制声明&#xff0c;本文仅用于网络安全技术研究、教育与知识分享。文中涉及的渗透测试方法与工具&#xff0c;严禁用于未经授权的网络攻击、数据窃取或任何违法活动。任何因不当使用本文内容导致的法律后果&#xff0c;作者及发布平台不承担任何责任。渗透测试涉及复杂技…

深入理解模板方法模式:框架设计的“骨架”艺术

目录 前言 一、模板方法模式的核心思想 二、模板方法模式的结构组成 1. 抽象类&#xff08;Abstract Class&#xff09; 2. 具体子类&#xff08;Concrete Class&#xff09; 三、C 实现示例&#xff1a;咖啡与茶的制作流程 步骤 1&#xff1a;定义抽象类&#xff08;饮料…

LinkedList 深度解析:核心原理与实践

文章目录 一、底层数据结构与特性 1. 核心数据结构 2. 关键特性 二、核心操作机制解析 1. 添加元素机制 2. 删除元素机制 三、性能关键点分析 1. 时间复杂度对比 2. 空间开销 四、线程安全解决方案 1. 同步包装器 2. 使用并发集合 五、经典面试题解析 1. ArrayList 和 LinkedLi…

Jmeter性能测试之安装及启动Jmeter

1. 安装JDK Jmeter依赖JDK环境,如果电脑没有JDK,需要安装JDK.如下是Jmeter版本与JDK版本对应关系. 2. Jmeter下载安装 下载链接&#xff1a;https://archive.apache.org/dist/jmeter/binaries/ windows下载.zip压缩包Linux下载.tar压缩包 下一步下一步就行 3. 配置环境变…

ShadowKV 机制深度解析:高吞吐长上下文 LLM 推理的 KV 缓存“影子”方案

背景与核心思想简介 在LLM的长上下文推理中&#xff0c;KV Cache成为影响速度和内存的关键因素。每生成一个新token&#xff0c;模型需要对所有先前token的键&#xff08;Key&#xff09;和值&#xff08;Value&#xff09;向量执行自注意力计算。传统方法会将所有过去的K/V向量…

spring-ai整合PGVector实现RAG

背景 最近公司的产品和业务线&#xff0c;要求往ai方向靠拢&#xff0c;在研发各种智能体&#xff0c;整理下最近学习的过程&#xff0c;将一部分内容整理出来&#xff0c;分享给需要的同学。 这篇文章将会提供详细的例子以及踩坑说明。主要内容是整合spring-ai&#xff0c;同…

Git 乱码文件处理全流程指南

一、问题背景与核心目标 1.1 问题描述 在 Git 仓库中发现了一个异常乱码文件&#xff1a; "\001\342\240\025\250\325\3738\f\036\035\006\004\240\002\240\002\b\003\004\340\002\340\002\340\002\034\034\001\001\004:\016\020\001\005\016\016\016\211\266\257\211\266…

JavaScript垃圾回收机制

1.垃圾回收的概念 1.1 什么是垃圾回收机制&#xff1a; GC 即 Garbage Collection &#xff0c;程序工作过程中会产生很多"垃圾"&#xff0c;这些垃圾是程序不用的内存或者是之前用过了&#xff0c;以后不会再用的内存空间&#xff0c;而 GC 就是负责回收垃圾的&…

工业相机选择规则

一、相机分辨率选择相机分辨率指的是相机传感器捕捉图像细节的能力&#xff0c;具体来说就是传感器上有效像素的总数量。可以把它理解为构成数字图像的“小方块”&#xff08;像素&#xff09;有多少个。工业领域内相机的分辨率的选择根据更具产品需要的精度要求和产品大小来确…

【Web安全】csrf、ssrf和xxe的区别

CSRF、SSRF 和 XXE 是三种不同类型的网络安全漏洞&#xff0c;它们的原理、攻击目标、利用方式和危害场景均有显著区别。以下从核心定义、原理、场景等维度详细对比三者的差异。一、核心定义与原理对比漏洞类型全称核心定义核心原理CSRF跨站请求伪造攻击者诱导用户在已登录的情…

【Lua】XLua一键构建工具

将以下代码放入Editor文件夹&#xff0c;点击菜单栏的XLua/一键生成代码和热补丁 即可。using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using UnityEditor; using UnityEngine;/// <summary> /// XLua自动化构建工具 //…

20250808:EasyGBS 对接大华 ICC 平台问题处理

最近有个现场在对接大华 ICC 平台时&#xff0c;客户反馈&#xff1a;EasyGBS 级联成功&#xff0c;但 ICC 显示下级离线。EasyGBS 成功对接过很多家国标平台&#xff0c;但这种情况确实少见。我们远程过去确认配置无误后&#xff0c;就进行了抓包&#xff0c;拿到包我就纳闷了…

js使用webscoket时使用自定义二进制包协议时并发问题处理

this.server new WebSocket.Server({ port: this.port });this.server.on(connection, (ws, req) > {const uniqueId dataUtil.uuid();ws.id uniqueId;global.serverSession.set(uniqueId, ws);logger.debug({ message: 客户端已连接, traceId: ws.id, address: req.sock…

元数据管理与数据治理平台:Apache Atlas 分类传播 Classification Propagation

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。Apache Atlas 框架是一套可扩展的核心基础治理服务&#xff0c;使企业能够有效、高效地满足 Hadoop 中的合规性要求&#xff0c;并支持与整个企…

TSF应用开发与运维部署

架构演进历程&#xff1a;单体架构-->SOA架构-->微服务架构-->Service Mesh腾讯微服务平台TSF (Tencent Service Framework) 是一个围绕应用和微服务的 PaaS 平台。提供服务全生命周期管理能力和数据化运营支持。提供多维度应用、服务、机器的监控数据&#xff0c;助力…

linux开发之mmap内存映射

mmap概念 mmp是 将文件或设备直接映射到进程的虚拟内存空间 的一种机制&#xff0c;可实现程序像访问内存一样访问文件&#xff0c;而不需要传统的 read()/write()系统调用 文件内容被映射到进程的地址空间&#xff0c;读写文件就像操作内存一样&#xff0c;操作系统负责自动同…

CPP继承

继承 一、继承概述 1、为什么需要继承 如下示例&#xff0c;Person 类、Student 类、Teacher 类有大量重复的代码&#xff0c;造成代码冗余&#xff0c;降低开发效率。我们可以通过继承来解决这一问题。在面向对象的编程语言中&#xff0c;继承是一个核心概念。主要作用将重复的…

模块 PCB 技术在未来通信领域的创新突破方向

未来通信领域对数据传输速率、信号稳定性及设备集成度的要求持续攀升&#xff0c;模块 PCB 作为通信设备的关键组件&#xff0c;其技术创新成为推动行业发展的核心动力。猎板 PCB 凭借深厚的技术积累与持续的研发投入&#xff0c;在模块 PCB 技术创新方面取得诸多突破&#xff…

mysql的InnoDB索引总结

MySQL InnoDB索引知识点总结 1. 索引类型 1.1 聚簇索引&#xff08;Clustered Index&#xff09; 定义与特性 定义&#xff1a;聚簇索引是InnoDB的默认存储方式&#xff0c;数据行按照主键的顺序物理存储在磁盘上特性&#xff1a; 每个InnoDB表只能有一个聚簇索引数据页中的记录…