基于 Kafka 的经验:AutoMQ 和 MinIO 如何解决成本和弹性挑战
AutoMQ 是 Kafka 的一个开源分支,它以基于对象存储的共享存储架构取代了 Kafka 的存储层,同时 100% 复用了 Kafka 的计算层代码,保证了与 Kafka API 协议和生态系统的完全兼容性。得益于 MinIO 与 AWS S3 API 的完全兼容性,您甚至可以在私有数据中心部署 AutoMQ 集群,以获得与 Kafka API 完全兼容的流式处理系统,但提供更好的成本效益、
Apache Kafka 因其出色的设计和强大的功能而成为流式处理的事实标准。它不仅定义了现代流式处理的架构,而且其独特的分布式日志抽象还为实时数据流处理和分析提供了前所未有的功能。Kafka 的成功在于它能够满足高吞吐量和低延迟的数据处理需求,多年来,它形成了极其丰富的供应商生态系统,广泛应用于各种生产场景。然而,随着云计算和云原生技术的快速发展,Kafka 面临的挑战越来越多。传统的存储架构正在努力满足云环境中对成本效益和弹性的需求,这促使人们重新评估 Kafka 的存储模型。分层存储曾经被视为一种可能的解决方案,它试图通过在不同介质之间分层数据存储来降低成本并延长数据的生命周期。然而,这种方法并没有完全解决Kafka的痛点,反而增加了系统的复杂性和操作难度。AutoMQ 是 Kafka 的一个开源分支,它以基于对象存储的共享存储架构取代了 Kafka 的存储层,同时 100% 复用了 Kafka 的计算层代码,保证了与 Kafka API 协议和生态系统的完全兼容性。如下图所示,这种创新的共享存储架构不仅通过共享存储实现了技术和成本优势,而且在不牺牲时延的情况下,完全解决了Kafka中原有的成本和弹性问题。得益于 MinIO 与 AWS S3 API 的完全兼容性,您甚至可以在私有数据中心部署 AutoMQ 集群,以获得与 Kafka API 完全兼容的流式处理系统,但提供更好的成本效益、极高的可扩展性和个位数毫秒的延迟。本文将指导您如何部署 AutoMQ 集群并将其数据存储在 MinIO 上。
使用案例
AutoMQ 创新的分解存储架构开辟了大量用例,可满足现代数据流和处理环境的需求:
1 . 经济高效的数据流:AutoMQ 对对象存储的使用大大降低了存储大量流数据的成本,使其成为预算受限的组织或寻求优化支出的组织的理想选择。
2 . 可扩展性,满足不断增长的数据需求:AutoMQ 能够轻松向外扩展,可以在不影响性能的情况下处理不断增加的数据负载,从而确保组织可以根据需要增加数据流。
3 . 低延迟应用程序:AutoMQ实现了个位数毫秒的时延,适用于需要实时数据处理和分析的应用,如金融交易、物联网数据流、在线游戏等。
4 . 混合云、多云和私有云: 与 Kafka 的其他替代方案不同,AutoMQ 的分解存储模型允许其部署在私有数据中心,支持完全本地、混合和多云环境。对于需要维护数据主权或具有特定监管要求的组织来说,这种灵活性至关重要。
但为什么要将它与 MinIO 一起使用呢?开箱即用的 MinIO 包括
-
加密:MinIO 支持静态加密和传输中加密。这确保了从发出调用的那一刻起,数据在事务的所有方面都得到了加密,直到对象被放入存储桶。
-
Bitrot 保护:物理磁盘上的数据可能损坏的原因有多种。这可能是由于电压尖峰、固件中的错误、误定向的读取和写入等原因造成的。MinIO 确保这些内容在动态中被捕获和修复,以确保数据的完整性。
-
纠删码:MinIO 不是使用 RAID 确保数据冗余,这会增加额外的性能开销,而是使用此数据冗余和可用性功能来动态重建对象,而无需任何额外的硬件或软件。
-
安全访问 ACL 和 PBAC:支持内置 IDP 的 IAM S3 样式策略,有关更多信息,请参阅 MinIO 最佳实践 - 安全性和访问控制。
-
分层:对于不经常访问的数据,您可以将数据抽取到-另一个运行 MinIO 的冷存储中,这样您就可以在最佳硬件上优化最新数据,而不会占用未使用的数据空间。
-
对象锁定和保留:MinIO 支持对象锁定(保留),它强制执行一次写入并准备好许多操作,以实现基于持续时间和无限期的法律保留。这允许关键数据保留合规性,并满足 SEC17a-4(f)、FINRA 4511(C) 和 CFTC 1.31(c)-(d) 要求。
先决条件
-
正常运行的 MinIO 环境。如果您尚未设置 MinIO 环境,可以按照官方指南进行安装。TK MinIO支持广泛的复制功能。以下是一些最佳实践。
-
若要在本地部署,需要满足以下条件:To deploy locally you will need the following:
| 适用于 Linux 的 Linux/Mac/Windows 子系统
| Docker 码头工人
| Docker Compose 版本 > 2.22.0
| 至少 8 GB 的可用内存
| JDK 17
提示:对于生产环境,建议有 5 台主机来部署 AutoMQ。AutoMQ 建议主机应为 Linux amd64 系统,每个系统都有 2 个 CPU 和 16GB 内存。对于测试和开发,您可以用更少的钱过日子。
-
从 AutoMQ Github Releases 下载最新的官方二进制安装包以安装 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。
输出结果
执行命令后,它将自动在以下阶段进行:
1 . 使用提供的 accessKey 和 secretKey 探索 S3 的基本功能,以验证 AutoMQ 和 S3 之间的兼容性。
2 . 使用身份和终端节点信息生成 S3Url。
3 . 使用 S3Url 获取 AutoMQ 的 Startup 命令示例。在命令中,将 --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 替换为您的主机信息。具体来说,使用默认端口 9092 和 9093,将它们替换为环境准备中提到的 3 个 CONTROLLER 和 2 个 BROKER 的 IP 地址。如果您在本地运行,则需要使用您的私有 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"
参数说明
输出结果
执行该命令后,它会生成用于启动 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 参数。
提示:如果您需要启用连续自平衡或运行 示例:集群节点更改时自平衡。建议在启动期间明确指定控制器的参数。--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 Write-Ahead-Log (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 都能提供全面的解决方案,满足现代数据驱动应用程序的需求。
更多推荐
所有评论(0)