基于 Kafka 的经验:AutoMQ 和 MinIO 如何解决成本和弹性挑战

news2024/11/17 3:53:09

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。

参数 此示例中的默认值 描述 --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 automq 数据 --s3-ops-bucket automq-ops automq-运维

输出结果

执行命令后,它将自动在以下阶段进行:

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"

参数说明

参数名称 必填 描述 --s3-url Yes 由命令行工具 bin/automq-kafka-admin.sh generate-s3-url 生成,包括认证、集群 ID 等信息 --controller-list Yes 您需要提供至少一个地址以用作 CONTROLLER 主机的 IP 和端口列表。格式应为 IP1:PORT1;IP2:端口2;IP3:端口3。 --broker-list Yes 您至少需要一个地址才能用作 BROKER 主机 IP 和端口列表。格式应为 IP1:PORT1;IP2:端口2;IP3:端口3。 --controller-only-mode No 关于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 yes 由 bin/automq-kafka-admin.sh 工具生成,包括身份验证、集群 ID 和其他相关信息。 process.roles yes 同时作为 CONTROLLER 和 BROKER 的主机的配置值可以设置为“CONTROLLER, BROKER”。 node.id yes 整数用于唯一标识 Kafka 集群中的 BROKER 或 CONTROLLER,它们在集群中必须是唯一的。 controller.quorum.voters yes 参与KRAFT选举的主机信息包括nodeid、IP、port信息,例如:0@192.168.0.1:9093、1@192.168.0.2:9093、2@192.168.0.3:9093。 listeners yes 用于侦听的 IP 地址和端口。 advertised.listeners yes BROKER为客户提供访问地址。 log.dirs no 用于存储 KRaft 和代理元数据的目录。 s3.wal.path no 在生产环境中,建议将 AutoMQ WAL 数据存储在专用挂载的原始设备卷上。这种方法可以提供更好的性能,因为 AutoMQ 支持将数据写入原始设备,从而减少延迟。请确保正确配置存储 WAL 数据的路径。 autobalancer.controller.enable no 默认值为 false,这将禁用流量重新平衡。启用自动流量再平衡功能后,AutoMQ 的自动均衡组件将自动迁移分区,确保整体流量均衡。

提示:如果您需要启用连续自平衡或运行 示例:集群节点更改时自平衡。建议在启动期间明确指定控制器的参数。--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 都能提供全面的解决方案,满足现代数据驱动应用程序的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1975285.html

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

相关文章

(2024|ICLR,∞-Diff,无限维平滑扩散,希尔伯特空间,超分辨率,多尺度架构)具有子采样平滑状态的无限分辨率扩散

∞-Diff: Infinite Resolution Diffusion with Subsampled Mollified States 目录 0. 摘要 1. 简介 2. 生成式神经场 3. 无限维扩散模型 3.1 平滑化(Mollificaition) 3.2 无限维度平滑扩散 4. 参数化扩散过程 4.1 神经算子 4.2 多尺度架构 4.3…

element-plus框架+vue3+echart——后台页面

一、图表样式 图表组件:echarts https://echarts.apache.org/examples/zh/index.html element-plus框架: https://www.cwgj.xyz/zh-CN/ 1、折线图 栅格 一共24。 12代表占一半50%, 当页面缩小到一定程度 占整个屏幕的100%。 id"mo…

【Axure教程】拖拉拽编辑页面

低代码开发平台通常提供拖拉拽编辑页面的功能,使用户无需编写大量代码即可创建复杂的应用程序和页面。这种平台的特点是通过图形用户界面来进行开发,用户可以拖拽组件到画布上进行布局和配置。 那今天作者就教大家在Axure里怎么制作拖拉拽动态编辑页面的…

01 LVS负载均衡群集

1.1 LVS群集应用基础 群集的称呼来自于英文单词“Cluster",表示一群、一串的意思,用在服务器领域则表示大量服务器的集合体,以区分于单个服务器。 1.1.1 群集技术概述 LVS(Linux Virtual Server)是Linux虚拟服…

linux下的线程

概念理解 linux下没有线程的概念,只有轻量级进程的概念, 有接口:clone() 是clone()调用,在库中创建栈 源码解析 int clone(int (*fn)(void *), void *child_stack,int flags, void *arg, .../* pid_t *p…

【Spring】详细了解静态代理和动态代理的使用

目录 1.代理模式介绍 2. 静态代理 3.动态代理 3.1 JDK动态代理 3.2 CGLIB动态代理 4. 动态代理和静态代理的区别 1.代理模式介绍 代理模式分为动态代理和静态代理,目的是在不直接暴露真实对象的情况下,通过代理对象来间接访问真实对象,从…

【设计模式】设计模式之观察者模式

文章目录 观察者模式什么是观察者模式引入组成UML图代码实现1. 定义观察者接口2. 定义主题接口3. 实现具体观察者4. 实现具体被观察者5.测试 应用场景优点缺点 观察者模式 什么是观察者模式 观察者模式(Observer Pattern)是一种设计模式 它定义了一种…

vLLMcuda安装笔记

1. 引言 最近在部署Qwen模型时,文档上有提到强烈建议用vLLM来部署模型,按照公开的性能测试数据,用vLLM部署Qwen模型的文本推理速度要比transformers部署快3~4倍。带着这个好奇就开始安装尝试,但试下来这个安装过程并没有那么顺利…

最新个人免签约支付系统源码|PHP源码 | 码支付系统 | ThinkPHP6框架 | 开源

源码介绍: 这个最新的个人专用免签约支付系统源码!是PHP源码写的哦,而且是用ThinkPHP6框架开发的,完全开源的码支付系统。 这个系统适合个人用户使用,作为收款的免签约解决方案。它还加入了监控端,可以拒…

Linux 调试追踪: trace-cmd 和 kernelshark

文章目录 1. 前言2. 概述3. trace-cmd3.1 下载3.2 交叉编译3.3 安装、运行3.3.1 trace-cmd 示范:抓取系统调度信息 4. kernelshark5. 参考资料 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承…

Java多线程-----定时器(Timer)及其实现

目录 一.定时器简介: 二.定时器的构造方法与常见方法: 三.定时器的模拟实现: 思路分析: 代码实现: 在开发中,我们经常需要一些周期性的操作,例如每隔几分钟就进行某一项操作,这…

【QT】常用控件-上

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 目录 👉🏻QWidgetenabledgeometryrect制作上下左右按钮 window frame 的影响window titlewindowIcon代码示例: 通过 qrc 管理图片作为图标 windowOpacitycursor使用qrc自…

Python | Leetcode Python题解之第309题买卖股票的最佳时机含冷冻期

题目: 题解: class Solution:def maxProfit(self, prices: List[int]) -> int:if not prices:return 0n len(prices)f0, f1, f2 -prices[0], 0, 0for i in range(1, n):newf0 max(f0, f2 - prices[i])newf1 f0 prices[i]newf2 max(f1, f2)f0, …

【笔记】《冲击弹性波理论与应用》[2-2] 振动信号分析

1.前级硬件滤波 - 降噪 2.软件降噪 2.1 移动平滑滤波 2.1.1 移动平滑滤波的效果 2.2 经验模态分解法 2.1.1 效果 3 信号分析 除了FFT,最大熵和小波变换现在也很流行。 3.1 最大熵 3.1.1 与FFT的比对 3.2 相关性分析 3.2.1 自相关 3.2.2 互相关 3.3. 小波 非等周期信号 3…

《python语言程序设计》2018第6章第28题 掷骰子 两个色子,分别是1到6

2、3、12 玩家输 7、11玩家赢 4、5、6、8、9、10算1点&#xff0c;之后出7玩家输或者和上一次相同。def rolled(num_t):count 0still_win 0second_win 0still_lose 0second_lose 0while count < num_t:a_1 random.randint(1, 6)b_1 random.randint(1, 6)tTen a_1 b…

力扣-41.缺失的第一个正数

刷力扣热题–第二十五天:41.缺失的第一个正数 新手第二十五天 奋战敲代码&#xff0c;持之以恒&#xff0c;见证成长 1.题目简介 2.题目解答 做这道题有点投机取巧的感觉&#xff0c;要求时间复杂度O(N),且空间复杂度O(1)&#xff0c;那么就是尽可能的去找到更多的可能性&…

C语言程序设计之数组1

程序设计之数组1 问题1_1代码1_1结果1_1 问题1_2代码1_2结果1_2 问题1_3代码1_3结果1_3 问题1_4代码1_4结果1_4 问题1_5代码1_5结果1_5 问题1_1 函数 f u n fun fun 的功能是&#xff1a;移动一位数组中的内容&#xff0c;若数组中有 n n n 个整数&#xff0c;要求把下标从 …

软件测试生命周期、BUG描述与处理策略

软件测试的生命周期 需求分析&#xff1a;需求是否完整、是否正确 测试计划&#xff1a;确定由谁测试、测试的起止时间、设计哪些模块 测试设计、测试开发&#xff1a;写测试用例&#xff08;手工、自动化测试用例&#xff09;、编写测试工具 执行测试用例 测试评估&…

衢州骨伤科医院为98岁高龄老人做髋关节置换,患者第三天便下地行走

灵活迈步、周身整洁、双手提着两口袋鸡蛋......在清晨的菜市场里&#xff0c;王阿婆&#xff08;化名&#xff09;在人群里穿梭&#xff0c;买一些自己和女儿想吃的菜。如果没有看到她的脸&#xff0c;大家都以为她只有 60 多岁&#xff1b;再定睛一看&#xff0c;她虽然脸上布…

Token的原理及区别,以及与Cookie,Session之间的区别?

Token&#xff0c;特别是JSON Web Token&#xff08;JWT&#xff09;&#xff0c;也是一种用于管理用户状态和身份的机制&#xff0c;但它与Cookie和Session的工作方式有所不同。下面将详细解释Token如何管理用户状态和身份。 Token的工作原理 Token是一种无状态的认证机制&am…