从 Kafka 中汲取经验:AutoMQ 和 MinIO 如何解决成本和弹性挑战

共同作者:万凯明
Apache Kafka 是流处理领域的实际标准,因为它拥有卓越的设计和强大的功能。它不仅定义了现代流处理的架构,其独特的分布式日志抽象也为实时数据流处理和分析提供了前所未有的能力。Kafka 的成功在于其满足高吞吐量和低延迟数据处理需求的能力,并且多年来,它发展出了一个极其丰富的供应商生态系统,广泛应用于各种生产场景。
然而,随着云计算和云原生技术的快速发展,Kafka 面临着越来越多的挑战。传统的存储架构难以满足云环境中对成本效益和弹性的需求,促使人们重新评估 Kafka 的存储模型。分层存储曾被视为一种可能的解决方案,试图通过跨不同介质分层数据存储来降低成本并延长数据生命周期。然而,这种方法并没有完全解决 Kafka 的痛点,反而增加了系统的复杂性和操作难度。
AutoMQ 是 Kafka 的一个开源分支,它使用基于对象存储的共享存储架构替换了 Kafka 的存储层,同时重用了 100% 的 Kafka 计算层代码,确保与 Kafka API 协议和生态系统完全兼容。如下图所示,这种创新的共享存储架构不仅通过共享存储实现了技术和成本优势,而且完全解决了 Kafka 原本存在的成本和弹性问题,而不会牺牲延迟。
借助 MinIO 与 AWS S3 API 的完全兼容性,您甚至可以在私有数据中心部署 AutoMQ 集群,以获得一个与 Kafka API 完全兼容的流处理系统,但同时提供更好的成本效益、极强的可扩展性和个位数毫秒级的延迟。本文将指导您如何部署 AutoMQ 集群并将数据存储在 MinIO 上。

使用案例
AutoMQ 创新的解耦存储架构开辟了大量用例,满足了现代数据流和处理环境的需求。
- 经济高效的数据流:AutoMQ 使用对象存储,显著降低了存储大量流数据所需的成本,使其成为预算有限或寻求优化支出的组织的理想选择。
- 满足不断增长的数据需求的可扩展性:AutoMQ 能够轻松扩展,可以处理不断增长的数据负载而不会影响性能,确保组织能够根据需要扩展其数据流。
- 低延迟应用:AutoMQ 实现了个位数毫秒级的延迟,使其适用于需要实时数据处理和分析的应用,例如金融交易、物联网数据流和在线游戏。
- 混合云、多云和私有云:与其他 Kafka 替代方案不同,AutoMQ 的解耦存储模型允许它部署在私有数据中心,支持完全本地部署、混合云和多云环境。这种灵活性对于需要维护数据主权或具有特定监管要求的组织至关重要。
但是为什么将其与 MinIO 一起使用呢?MinIO 原生支持:
- 加密:MinIO 支持 静态 和 传输 中的加密。这确保了数据在从发出调用到对象放置在存储桶的所有事务方面都经过加密。
- 数据腐败保护:物理磁盘上的数据可能由于多种原因而损坏。这可能是由于电压尖峰、固件中的错误、错误的读写等。MinIO 确保这些错误会被捕获并即时修复,以确保数据完整性。
- 擦除编码:MinIO 使用此数据冗余和可用性功能即时重建对象,而不是使用 RAID 确保数据的冗余,RAID 会增加性能的额外开销。
- 安全访问 ACL 和 PBAC:支持具有内置 IDP 的 IAM S3 样式策略,请参阅 MinIO 最佳实践 - 安全和访问控制 以获取更多信息。
- 分层存储:对于不太常访问的数据,您可以将其转移到运行 MinIO 的另一个冷存储中,以便您可以优化最新数据在最佳硬件上的存储,而无需未使用的数据占用空间。
- 对象锁定和保留:MinIO 支持对象锁定(保留),这可以强制执行一次写入多次读取操作,以实现基于持续时间和无限期的法律保留。这允许关键数据保留合规性,并满足 SEC17a-4(f)、FINRA 4511(C) 和 CFTC 1.31(c)-(d) 的要求。
先决条件
- 一个正常运行的 MinIO 环境。如果您还没有设置 MinIO 环境,您可以按照 官方指南 进行安装。TK MinIO 支持各种 复制 功能。以下是一些 最佳实践。
- 要在本地部署,您需要以下内容:
- Linux/Mac/Windows 子系统用于 Linux
- Docker
- Docker Compose 版本 > 2.22.0
- 至少 8 GB 的可用内存
- JDK 17
提示:对于生产环境,建议 使用五个主机部署 AutoMQ。AutoMQ 建议主机应为 Linux amd64 系统,每个系统配备 2 个 CPU 和 16GB 内存。对于测试和开发,您可以使用更少的资源。
- 从 AutoMQ Github 发行版 下载最新的官方二进制安装包以安装 AutoMQ。
- 在 MinIO 中创建两个名为
automq-data
和automq-ops
的存储桶。
- 最后,您需要创建一个访问密钥。导航到 MinIO 控制台中的“用户”面板,然后导航到“创建访问密钥”。请注意,您只能在创建时复制访问密钥的密钥部分,因此请妥善保管访问密钥的两个部分。
安装并启动 AutoMQ 集群
步骤 1:生成 S3 URL
以下安装步骤已在 1.1.0 以下版本的 AutoMQ 上验证。请参阅最新的安装文档以获取更新的安装步骤。AutoMQ 提供了 automq-kafka-admin.sh
工具,该工具允许快速启动 AutoMQ。只需提供包含所需端点和身份验证信息的 S3 兼容 URL,即可一键启动 AutoMQ,无需手动生成集群 ID 或格式化存储。
在终端窗口中,导航到您安装 AutoMQ 二进制文件的位置,然后运行以下命令:
bin/automq-kafka-admin.sh generate-s3-url \
--s3-access-key=XXX \
--s3-secret-key=YYY \
--s3-region=us-east-1 \
--s3-endpoint=http://127.0.0.1:9000 \
--s3-data-bucket=automq-data \
--s3-ops-bucket=automq-ops
使用 MinIO 时,可以使用以下配置来生成特定的 S3 URL。
参数 | 此示例中的默认值 | 描述 |
---|---|---|
--s3-access-key | minioadmin | 一个唯一的标识符,类似于用户名,用于识别发出请求的用户。 |
--s3-secret-key | minioadmin | 一个类似密码的秘密凭据,与访问密钥一起用于签名和验证请求。 |
--s3-region | us-east-1 | us-east-1 是 MinIO 的默认值。如果适用,请使用 MinIO 配置文件中指定的区域。 |
--s3-endpoint | http://10.1.0.240:9000 | 通过运行 sudo systemctl status minio.service 命令,您可以检索端点。 |
--s3-data-bucket | automq-data | |
--s3-ops-bucket | automq-ops |
输出结果
执行该命令后,它将自动进入以下阶段:
- 使用提供的 accessKey 和 secretKey 探索 S3 的基本功能,以验证 AutoMQ 和 S3 之间的兼容性。
- 使用身份和端点信息生成 S3Url。
- 使用 S3Url 获取 AutoMQ 启动命令的示例。在命令中,将 --controller-list 和 --broker-list 替换为实际的 CONTROLLER 和 BROKER 部署需求。
执行结果的截断示例:
############ Ping s3 ########################
[ OK ] Write object
[ OK ] RangeRead object
[ OK ] Delete object
[ OK ] CreateMultipartUpload
[ OK ] UploadPart
[ OK ] CompleteMultipartUpload
[ OK ] UploadPartCopy
[ OK ] Delete objects
############ String of s3url ################
Your s3url is:
s3://127.0.0.1:9000?s3-access-key=XXX-secret-key=YYY-region=us-east-1&s3-endpoint-protocol=http&s3-data-bucket=automq-data&s3-path-style=false&s3-ops-bucket=automq-ops&cluster-id=GhFIfiqTSkKo87eA0nyqbg
...
如果出现以下错误消息,而不是以上结果:
[ FAILED ] Delete objects
FAILED: Caught exception Failed to Delete objects on S3. Here are your parameters about S3: s3 parameters{endpoint='https://127.0.0.1:9000', region='us-east-1', bucket='automq-data', isForcePathStyle=false, credentialsProviders=[org.apache.kafka.tools.automq.GenerateS3UrlCmd$$Lambda$112/0x000000800109cdc8@5cbd159f], tagging=null}.
Here are some advices:
You are using https endpoint. Please make sure your object storage service supports https.
forcePathStyle is set as false. Please set it as true if you are using minio.
请确保您使用的是访问密钥,而不是用户名和密码。此外,在撰写本文时,AutoMQ 似乎不支持 https。
步骤 2:生成启动命令列表
将上一步生成的命令中的 --controller-list 和 --broker-list 替换为您主机的信息。具体来说,将它们替换为环境准备中提到的 3 个 CONTROLLER 和 2 个 BROKER 的 IP 地址,使用默认端口 9092 和 9093。如果您在本地运行,则需要使用您的私有 IP 地址,而不是您的公共 IP 地址。
然后将 s3-path-style 更改为 true。
在终端窗口中运行编辑后的命令
bin/automq-kafka-admin.sh generate-start-command \
--s3-url="s3://127.0.0.1:9000?s3-access-key=XXX-secret-key=YYY&s3-region=us-east-1&s3-endpoint-protocol=http&s3-data-bucket=automq-data&s3-path-style=true&s3-ops-bucket=automq-ops&cluster-id=GhFIfiqTSkKo87eA0nyqbg" \
--controller-list="192.168.0.1:9093;192.168.0.2:9093;192.168.0.3:9093" \
--broker-list="192.168.0.4:9092;192.168.0.5:9092"
参数说明
参数名称 | 必填 | 描述 |
---|---|---|
--s3-url | 是 | 由命令行工具 bin/automq-kafka-admin.sh generate-s3-url 生成,其中包含身份验证、集群 ID 和其他信息 |
--controller-list | 是 | 您需要提供至少一个地址用作 CONTROLLER 主机的 IP 和端口列表。格式应为 IP1:PORT1;IP2:PORT2;IP3:PORT3。 |
--broker-list | 是 | 您需要至少一个地址用作 BROKER 主机 IP 和端口列表。格式应为 IP1:PORT1;IP2:PORT2;IP3:PORT3。 |
--controller-only-mode | 否 | CONTROLLER 节点是否专门充当 CONTROLLER 角色的决定是可配置的。默认情况下,此设置是 false,这意味着已部署的 CONTROLLER 节点也会同时承担 BROKER 角色。 |
输出结果
执行命令后,它会生成用于启动 AutoMQ 的命令。您截断的终端响应应类似于以下内容
To start an AutoMQ Kafka server, please navigate to the directory where your AutoMQ tgz file is located and run the following command.
Before running the command, make sure that JDK17 is installed on your host. You can verify the Java version by executing 'java -version'.
bin/kafka-server-start.sh --s3-url="s3://127.0.0.1:9000?s3-access-key=XXX-secret-key=YYY&s3-region=us-east-1&s3-endpoint-protocol=http&s3-data-bucket=automq-data&s3-path-style=true&s3-ops-bucket=automq-ops&cluster-id=GhFIfiqTSkKo87eA0nyqbg" --override process.roles=broker,controller --override node.id=0 --override controller.quorum.voters=0@192.168.0.1:9093,1@192.168.0.2:9093,2@192.168.0.3:9093 --override listeners=PLAINTEXT://192.168.0.1:9092,CONTROLLER://192.168.0.1:9093 --override advertised.listeners=PLAINTEXT://192.168.0.1:9092
...
提示:node.id
的默认生成从 0 开始。
步骤 3:启动 AutoMQ
要启动集群,请在指定的 CONTROLLER 或 BROKER 主机上执行上一步中的命令列表。例如,要在 192.168.0.1 上启动第一个 CONTROLLER 进程,请运行生成的启动命令列表中的第一个命令。
bin/kafka-server-start.sh --s3-url="s3://127.0.0.1:9000?s3-access-key=XXX&s3-secret-key=YYYY&s3-region=us-east-1&s3-endpoint-protocol=http&s3-data-bucket=automq-data&s3-path-style=false&s3-ops-bucket=automq-ops&cluster-id=GhFIfiqTSkKo87eA0nyqbg" --override process.roles=broker,controller --override node.id=0 --override controller.quorum.voters=0@192.168.0.1:9093,1@192.168.0.2:9093,2@192.168.0.3:9093 --override listeners=PLAINTEXT://192.168.0.1:9092,CONTROLLER://192.168.0.1:9093 --override advertised.listeners=PLAINTEXT://192.168.0.1:9092
参数说明
使用启动命令时,未指定的参数将默认为 Apache Kafka® 的默认配置。对于 AutoMQ 引入的新参数,将使用 AutoMQ 提供的默认值。要覆盖默认设置,您可以在命令末尾添加额外的 --override key=value 参数。
参数名称 | 必填 | 描述 |
---|---|---|
s3-url | 是 | 由 bin/automq-kafka-admin.sh 工具生成,包括身份验证、集群 ID 和其他相关信息。 |
process.roles | 是 | 充当 CONTROLLER 和 BROKER 的主机的配置值可以设置为“CONTROLLER, BROKER”。 |
node.id | 是 | 整数用于在 Kafka 集群中唯一标识 BROKER 或 CONTROLLER,在集群中必须唯一。 |
controller.quorum.voters | 是 | 参与 KRAFT 选举的主机信息包括 nodeid、IP 和端口信息,例如:0@192.168.0.1:9093, 1@192.168.0.2:9093, 2@192.168.0.3:9093。 |
listeners | 是 | 用于监听的 IP 地址和端口。 |
advertised.listeners | 是 | BROKER 为客户端提供访问地址。 |
log.dirs | 否 | 存储 KRaft 和代理元数据的目录。 |
s3.wal.path | 否 | 在生产环境中,建议将 AutoMQ WAL 数据存储在专用的挂载原始设备卷上。这种方法可以提供更好的性能,因为 AutoMQ 支持将数据写入原始设备,从而减少延迟。请确保正确配置存储 WAL 数据的路径。 |
autobalancer.controller.enable | 否 | 默认值为 false,禁用流量重新平衡。启用自动流量重新平衡后,AutoMQ 的自动平衡器组件将自动迁移分区以确保整体流量平衡。 |
提示:如果您需要启用持续的自平衡或运行 示例:集群节点更改时的自平衡。建议在启动时为 Controller 明确指定参数。--override autobalancer.controller.enable=true。
在后台运行
要在后台运行,请在命令末尾添加以下代码
command > /dev/null 2>&1 &
数据卷路径
在 Linux 上使用 lsblk 命令查看本地数据卷;未分区块设备即为数据卷。在以下示例中,vdb 是一个未分区的原始块设备。
vda 253:0 0 20G 0 disk
├─vda1 253:1 0 2M 0 part
├─vda2 253:2 0 200M 0 part /boot/efi
└─vda3 253:3 0 19.8G 0 part /
vdb 253:16 0 20G 0 disk
默认情况下,AutoMQ 存储元数据和 WAL 数据的位置在 /tmp 目录中。但是,请注意,如果 /tmp 目录安装在 tmpfs 上,则不适合生产环境。
为了更好地适应生产或正式测试环境,建议修改配置如下:为元数据目录 log.dirs 和 WAL 数据目录 s3.wal.path(用于写入数据的原始设备)指定其他位置。
bin/kafka-server-start.sh ...\
--override s3.telemetry.metrics.exporter.type=prometheus \
--override s3.metrics.exporter.prom.host=0.0.0.0 \
--override s3.metrics.exporter.prom.port=9090 \
--override log.dirs=/root/kraft-logs \
--override s3.wal.path=/dev/vdb \
> /dev/null 2>&1 &
提示:要将 s3.wal.path
更改为实际的本地原始设备名称,请确保指定的 文件路径指向具有超过 10GB 可用空间的本地 SSD 存储。例如,将 AutoMQ 写入前日志 (WAL) 存储在本地 SSD 磁盘上: --override s3.wal.path=/home/admin/automq-wal
最终想法
至此,您已成功在 MinIO 上部署了 AutoMQ 集群,该集群提供了一个低成本、高性能且高效扩展的 Kafka 集群。
MinIO 增强其与 AutoMQ 集成的突出功能之一是其强大的消息传递和通知系统。MinIO 提供了一个事件通知系统,可以与 Apache Kafka API 无缝集成,从而实现实时事件处理和分析。这种集成允许组织建立事件驱动的架构,可以立即对对象存储中的更改做出反应。
此外,MinIO 对服务器端复制的广泛支持确保您的 AutoMQ 数据可以跨多个区域和数据中心复制,从而提供增强的持久性和可用性。此复制功能对于维护业务连续性和灾难恢复计划至关重要,确保您的数据流保持不间断且能够抵御故障。
结合这些功能,MinIO 不仅解决了与 Kafka 相关的存储挑战,还增强了数据流架构的整体功能。无论您是处理高吞吐量的数据流还是需要严格的数据一致性和可用性保证,MinIO 和 AutoMQ 共同提供了一个满足现代数据驱动应用程序需求的全面解决方案。
如果您在实施过程中有任何疑问,请随时通过 hello@min.io 或我们的 Slack 频道与我们联系。我们很乐意提供帮助。