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