原理剖析:AutoMQ 如何基于裸设备实现高性能的 WAL

s3-streams:支持使用Amazon本机API来往S3的流式读写 s3流 支持使用Amazon的本机API对S3进行流式读写。 当涉及到S3时,Amazon很难做任何类似流的操作(鉴于每个请求都需要Content-Length标头的一般限制)。 我们提供了本机流类( Readable和Writable ),它们包装了aws-sdk S3请求和响应,从而使您的生活更轻松。 重要说明:该库使用streams3 API。 为了提供与较旧版本的node的兼容性,我们使用 。 这不太可能对您的代码有任何影响,但尚未经过良好测试。 如果使用的是node 0.8 ,则必须确保npm的版本至少为1.4.6 。 特征: 本机读取流 本机写入流, 智能管道。 用法 npm install s3-streams 写流 创建要上传到S3的流: var S3 = require ( 'aws-sdk' ) . S3 , S3S = require ( 's3-st 立即下载

1. 引言

AutoMQ 是一个建立在 S3 Stream 流存储库基础上的 Apache Kafka 云原生重塑解决方案。S3 Stream 利用云盘和对象存储,将对象存储作为主存储,将云盘作为缓冲区,实现了低延迟、高吞吐、“无限”容量和低成本的流式存储。
Delta WAL 作为 S3 Stream 的一部分,是 AutoMQ 的核心组件之一。它基于云盘,具有持久化、低延迟、高性能的特性,是 Main Storage(对象存储)上层的写入缓冲区。本文将重点介绍 Delta WAL 的实现原理。

2. 什么是 Delta WAL

Delta WAL 在 AutoMQ 中的主要职责是作为持久化写入缓冲区,配合 Log Cache 将写入的数据以 WAL 的形式在云盘上做高效的持久化。在云盘上持久化成功后才会返回客户端成功。而数据的读取则均会从内存中读取并返回客户端。
AutoMQ S3Stream 设计了冷热隔离的缓存 Log Cache(缓存新写入数据)和 Block Cache(缓存从对象存储中拉取的数据)。Log Cache 中的数据在 WAL 的数据没有上传到对象存储之前在内存中不会失效。如果从 Log Cache 无法读取到数据,则改为从 Block Cache 中读取数据。Block Cache 会通过预读、批量读等手段保证冷读时读取数据也尽量在内存命中,从而确保冷读时读取的性能。
Delta WAL 作为 S3Stream 中支持高性能持久化 WAL 的组件,主要用于将 Log Cache 中的数据高效地持久化到裸设备上。

3. 为什么基于裸设备

Delta WAL 构建在云盘之上,绕过了文件系统,直接使用 Direct IO 对裸设备进行读写。这种设计选择有以下三个优势:

  • 避免 Page Cache 污染

  • 提高写入性能

  • 宕机后恢复更快

3.1 避免 Page Cache 污染

Kafka broker 在处理生产消息的请求时,会将数据写入 Page Cache,并异步地将数据写入磁盘;同样的,在处理消费请求时,如果数据不存在于 Page Cache 中,会从磁盘将数据读入 Page Cache。这种机制就会导致,当消费者追赶读(catch-up read)时,会把将从磁盘读取的数据放入 Page Cache,产生污染,影响实时的读写。而使用 Direct IO 进行读写时,绕过了 Page Cache,避免了这个问题,保证了实时读写与追赶读互不干扰。
在 AutoMQ 性能白皮书中,我们详细对比了 Kafka 与 AutoMQ 在追赶读时的性能表现。结果见下表:

从中可以看到,AutoMQ 很好地做到了读写隔离,在追赶读时,实时读写性能几乎不受影响;而 Kafka 在追赶读时,会导致发送消息延迟大幅增加,流量下跌严重。

3.2 提高写入性能

绝大多数文件系统在读写时都会有一定的额外开销:比如文件系统的元数据操作、记录 Journal 等。这些操作会占用一部分磁盘的带宽与 IOPS,同时写入路径也会变得更长。而使用裸设备进行读写,避免了这些开销,写入延迟更低。下表对比了在文件系统与裸设备上进行写入的性能表现。可以看到,相较于文件系统,裸设备的写入延迟明显更低,性能更好。

注:基于 fio 测试,运行指令为 sudo fio -direct=1 -iodepth=4 -thread -rw=randwrite -ioengine=libaio -bs=4k -group_reporting -name=test -size=1G -numjobs=1 -filename={path}

3.3 宕机后恢复更快

当使用文件系统时,如果 OS Crash,在重启后,需要进行文件系统的检查与恢复,这个过程可能会非常耗时,与文件系统上的数据与元数据的大小成正比。
而使用裸设备时,不需要进行文件系统的检查与恢复,宕机后恢复更快。

4. 设计目标

Delta WAL 作为 S3 Stream 中的组件有如下设计目标:

  • 轮转写入,存储空间需求不大。 Delta WAL 作为数据写入对象存储前的缓冲区,不会存储很多数据(默认每攒够 512 MiB 即上传到对象存储)。因此,可以采用轮转写入的模式(类似于 Ring Buffer),不需要太大的存储空间(默认 2 GiB)。

  • 充分发挥云盘性能。 目前大多数云厂商的云盘都会提供一部分免费的 IOPS 与带宽,例如,AWS EBS GP3 会提供免费的 3000 IOPS 与 125 MiB/s 的带宽。这就需要 Delta WAL 充分利用云盘的能力,尽可能地使用免费的 IOPS 与带宽来提高性能。

  • 支持从非优雅关闭中恢复,且速度尽可能快。 当发生宕机等非预期问题,导致 AutoMQ 非优雅关闭时,Delta WAL 需要在重启后尽可能快地恢复到正常状态,且不会丢失数据。

5. 具体实现

Delta WAL 的源码可以在 s3stream 仓库中找到。接下来我们将从上至下介绍 Delta WAL 的具体实现。

5.1 接口

Delta WAL 的接口定义在 WriteAheadLog.java。其中有如下几个主要的方法:

public interface WriteAheadLog {
    AppendResult append(ByteBuf data) throws OverCapacityException;

    interface AppendResult {
        long recordOffset();
        CompletableFuture<CallbackResult> future();

        interface CallbackResult {
            long flushedOffset();
        }
    }

    CompletableFuture<Void> trim(long offset);

    Iterator<RecoverResult> recover();
    interface RecoverResult {
        ByteBuf record();
        long recordOffset();
    }
}
  • append:向 Delta WAL 中异步写入一条 record。返回该 record 的位点(offset)与写入结果的 future,该 future 会在 record 被刷入磁盘后完成。

  • trim:删除位点小于等于指定位点的 record 。值得说明的是,这里只是逻辑删除,实际上并不会删除磁盘上的数据。当一段数据被上传到对象存储后,会使用该方法更新位点。

  • recover:从最新的 trim 位点开始,恢复所有 record 。返回一个迭代器,迭代器中的每个元素都是一条 record 与其位点。该方法会在重启后被调用,用于恢复 Delta WAL 中尚未上传到对象存储的数据。

值得说明的是,Delta WAL 中返回 offset 只是逻辑位点,而非实际在磁盘上的位置(物理位点)。这是由于前文提到的,Delta WAL 采用了轮转写入的模式,物理位点会在磁盘上循环,而逻辑位点则是单调递增的。

5.2 数据结构

Delta WAL 中的主要数据结构有 WALHeader,RecordHeader 和 SlidingWindow,接下来将分别介绍它们。

5.2.1 WALHeader

WALHeader 是 Delta WAL 的头部信息,定义在 WALHeader.java。它包含了 Delta WAL 的一些元信息,包括:

  • magicCode:用于标识 Delta WAL 的头部,防止误读。

  • capacity:裸设备的容量。在初始化时配置,不会改变。用于换算逻辑位点与物理位点。

  • trimOffset:Delta WAL 的 trim 位点。trim 位点之前的 record 已被上传到对象存储,可以覆盖;在 recover 时,会从 trim 位点开始恢复。

  • lastWriteTimestamp:最后一次刷新 WALHeader 的时间戳。

  • slidingWindowMaxLength:滑动窗口的最大长度。具体作用将在下文介绍。

  • shutdownType:关闭类型。用于标识上一次关闭 Delta WAL 时是否为优雅关闭。

  • crc:WALHeader 的 CRC 校验码。用于校验 WALHeader 是否损坏。

5.2.2 RecordHeader

RecordHeader 是 Delta WAL 中每条 record 的头部信息,定义在 SlidingWindowService.java。它包含了 Delta WAL 中每条 record 的一些元信息,包括:

  • magicCode:用于标识 Delta WAL 的 record 头部,防止误读。

  • length:record 的长度。

  • offset:record 的逻辑位点。

  • crc:record 的 CRC 校验码。用于校验 record 是否损坏。

5.2.3 SlidingWindow

SlidingWindow 是 Delta WAL 中用于写入的滑动窗口,定义在 SlidingWindowService.java。它用于分配每条 record 的写入位点,并控制 record 的写入。它由几个位点组成,如下图:

  • Start Offset: 滑动窗口的起点,在此之前的 record 已经落盘完成。

  • Next Offset: 尚未分配的下一个逻辑位点,新的 record 将从这里开始写入。Next Offset 与 Start Offset 之间的数据尚未完全落盘。

  • Max Offset: 滑动窗口的最大逻辑位点。当 Next Offset 到达 Max Offset 时,会尝试扩大滑动窗口。当窗口达到最大长度时(之前在 WALHeader 中提到的 slidingWindowMaxLength),会暂停写入,直到有 record 落盘,窗口向前滑动。

5.3 写入与恢复

下面重点介绍一下 Delta WAL 的写入与恢复流程。

5.3.1 写入

AutoMQ 在设计写入实现时充分考虑了云盘的计费项和底层实现的特性,以最大化性能和成本效益。以 AWS EBS GP3 为例,免费提供 3000 IOPS,因此 Delta WAL 的时间阈值默认为 1/3000 秒,以匹配免费 IOPS 额度,避免额外成本。此外,AutoMQ 引入了批大小阈值(默认为 256 KiB),避免发送过大的 Record 到云盘。云盘底层实现会将大于 256 KiB 的 Record 拆分成多个 256 KiB 的小数据块顺序写入持久化介质。
AutoMQ 的拆分操作确保云盘底层并行写入,提升写入性能。下图展示了 Delta WAL 具体的写入流程:

图中的 Start Offset 与 Next Offset 在上文已经介绍过,这里不再赘述。新引入的几个数据结构含义如下:

  • Block:一次 IO 操作的最小单位,其中包含一条或多条 record。在写入磁盘时,每个 Block 都会对齐到 4 KiB。

  • writingBlocks:正在写入的 block 集合。当 block 写入磁盘后,会从集合中移除。

  • pendingBlocks:待写入的 block 集合。当 IO 线程池满时,新的 block 会被放入该集合,等待前面的 IO 完成后再移入 writingBlocks 进行写入。

  • currentBlock:最新的 Block。需要写入的 record 会被放入该 block 中,该 block 同时会负责分配新 record 的逻辑位点。当 currentBlock 写满时,会被放入 pendingBlocks,同时新的 Block 会被创建并成为 currentBlock。

一次写入的流程如下:

  1. 调用方发起 append 请求,传入一条 record 。

  2. 从将其添加到 currentBlock 的末尾,并分配位点,将位点同步返回给调用方。

  3. 如果 currentBlock 已经积攒一定大小或一定时间,将其放入 pendingBlocks,同时创建新的 currentBlock。

  4. 如果 writingBlocks 的数量小于 IO 线程池的大小,从 pendingBlocks 中取出一个 block,放入 writingBlocks 进行写入。

  5. 当 block 写入磁盘后,从 writingBlocks 中移除。同时计算并更新滑动窗口的 Start Offset,并完成 append 请求的 future。

5.3.2 恢复

在 Delta WAL 重启时,外部会调用 recover 方法,从最新的 trim 位点开始,恢复所有 record。恢复的流程如下:

  1. 从 WAL header 中读取 trim offset, 并设置为 recover offset。

  2. 读取 recover offset 下的 record header,校验是否合法。

    a. 若是,则更新 recover offset 为该 record 末尾。

    b. 若否,则将 recover offset 设置为下一个 4K 对齐的位置。

  3. 重复第 2 步,直至在第一次遇到非法 record 后,继续尝试读取了 window max length 的长度。

值得说明的是,第 3 步中,之所以在遇到非法 record 后仍要继续尝试读取,是因为在滑动窗口中 Start Offset 与 Next Offset 之间的数据可能存在空洞,即,一部分 record 已经落盘,一部分 record 尚未落盘。在恢复时,需要尽可能地恢复已经落盘的 record,而不是直接跳过。

5.4 读写裸设备

前面提到过,Delta WAL 底层没有依赖文件系统,而是直接使用 Direct IO 读写裸设备。在实现时,我们依赖了一个三方库 kdio,并对其进行了一点修改以适配 Java 9 中引入的 Modules 特性。它对 pread 与 pwrite 等系统调用进行了封装,提供了一些便利的方法,帮助我们直接读写裸设备。
下面介绍一下我们在使用 Direct IO 读写裸设备时积累的一些经验。

5.4.1 对齐

在使用 Direct IO 读写时,要求内存地址、IO 的偏移量及大小与以下几个值对齐,否则会写入失败:

  • 磁盘的扇区大小(通常为 512 Byte 或 4 KiB)

  • 操作系统的页大小(通常为 4 KiB)

  • (如果内核版本低于 2.6.33)文件系统的逻辑块大小(为 512 Byte)

为了保证 IO 的偏移量与大小对齐,我们对前文提到的 Block 进行了对齐处理,使其大小为 4 KiB 的整数倍,并将其写入磁盘时的偏移量也对齐到 4 KiB。这样做的好处是,在每次写入时,IO 偏移量都是对齐的,无需处理在某个扇区的中间写入的情况。同时由于 Block 有攒批的逻辑,Delta WAL 也仅作为缓冲区无需长期存储数据,因此对齐后产生的空洞带来的空间浪费是较小且可以接受的。
在实现的过程中,使用了以下几个方法来处理内存地址的对齐:

public static native int posix_memalign(PointerByReference memptr, NativeLong alignment, NativeLong size);

// following methods are from io.netty.util.internal.PlatformDependent
public static ByteBuffer directBuffer(long memoryAddress, int size);
public static long directBufferAddress(ByteBuffer buffer);
public static void freeDirectBuffer(ByteBuffer buffer);
  • posix_memalign 是 POSIX 标准中的方法,用于分配一块内存,并保证其地址对齐到指定的大小

  • 其余三个方法是 Netty 中的工具方法:

    a. directBuffer 用于将一个内存地址及大小封装为 ByteBuffer

    b. directBufferAddress 用于获取 ByteBuffer 的内存地址,其被作为 pread 和 pwrite 的参数c. freeDirectBuffer 用于释放 ByteBuffer

将以上方法结合起来,我们就可以在 Java 中分配、使用、释放对齐的内存了。

5.4.2 维护裸设备大小

与文件系统不同,裸设备的大小无法通过文件的元数据来获取,这就需要我们自己维护裸设备的大小。在初始化时,上层会指定 WAL 的大小,Delta WAL 会在初始化时获取裸设备的大小,并与指定的大小进行比较:如果裸设备的大小小于指定的大小,会抛出异常;如果裸设备的大小大于指定的大小,会将 WALHeader 中的 capacity 设置为指定的大小,且之后不可更改。这样做的好处是,可以保证 Delta WAL 的大小不绑定于裸设备的大小,避免裸设备大小的变化导致的问题。
在未来,我们还会支持动态变更 Delta WAL 的大小,以满足更多的场景。

6. 基准测试

为了验证 Delta WAL 的性能,我们进行了一些基准测试。测试环境如下:

  • AWS EC2 m6i.xlarge, 4 vCPU, 16 GiB RAM

  • AWS EBS GP3 (2 GiB, 3000 IOPS, 125 MiB/s)

  • Ubuntu 22.04 LTS linux 5.15.0-91-generic

测试代码详见仓库。测试时配置 IO 线程池大小为 4,目标写入吞吐为 120 MiB/s。测试结果如下:

*: 为 iostat 中的读数**: Stream WAL 中每个 record 还有 24 Bytes 的 header,这在测试时被减去了
可以看到

  • Delta WAL 可以充分发挥云盘的性能

    a. 写入吞吐接近 125 MiB/s(还有一小部分带宽用于写入写 header、4K 对齐等开销)。

    b. 当 record 不过大时,可以基本跑满 3000 IOPS。

  • Delta WAL 的写入延迟较低,小包平均延迟在 1 ms 以内,大包平均延迟在 2 ms 以内。在 AutoMQ 性能白皮书中可以看到 AutoMQ 发送消息的长尾延迟明显优于 Kafka。

7. 结语

Delta WAL 作为 S3 Stream 的一部分,是 AutoMQ 的核心组件之一。它基于裸设备,避免了 Page Cache 污染,提高了写入性能,且宕机后恢复更快。在实现时,我们充分利用了云盘的 IOPS 与带宽,保证了 Delta WAL 的性能,进而保证了 AutoMQ 的低延迟、高吞吐。在未来,我们还会支持更多的特性,例如动态变更 Delta WAL 的大小,以满足更多的场景。

END

关于我们

我们是来自 Apache RocketMQ 和 Linux LVS 项目的核心团队,曾经见证并应对过消息队列基础设施在大型互联网公司和云计算公司的挑战。现在我们基于对象存储优先、存算分离、多云原生等技术理念,重新设计并实现了 Apache Kafka 和 Apache RocketMQ,带来高达 10 倍的成本优势和百倍的弹性效率提升。

🌟GitHub 地址:https://github.com/AutoMQ/automq

💻 官网:https://www.automq.com

👀 B站:AutoMQ官方账号

🔍 视频号:AutoMQ

👉 扫二维码加入我们的社区群

关注我们,一起学习更多云原生技术干货!

CPG控制网络入门 从线性变换开始推导 阅读详情

相关推荐

STC8H硬件IIC从机模式实战:手把手教你驱动OLED屏幕(附完整代码)

本文详细介绍了如何使用STC8H单片机的硬件IIC从机模式驱动SSD1306 OLED屏幕,包括硬件连接、寄存器配置、中断处理和实际应用中的优化技巧。通过完整的代码示例和实战经验分享,帮助开发者快速掌握I2C通信协议和OLED屏幕驱动技术,提升嵌入式开发效率。

weixin_33747129的博客 336

AutoMQ:云原生 Kafka 解决方案,降低10倍成本100%完美兼容

AutoMQ 重新设计了 Kafka 的架构,基于云的基础设施,将存储分离至对象存储,实现了 Apache Kafka100% 的兼容性。它不仅提供了10 倍的成本优势,还带来了百倍的弹性,极大地提升了扩展性和性能。与传统的 Kafka 对比,AutoMQ 通过创新的存算分离架构,减少了运维复杂度,并充分利用了云环境中的共享存储特性。官网:https://www.automq.com/zhAutoMQ 通过云原生的架构优化,显著提升了 Kafka 的弹性和性能,并大幅降低了成本。

jast 1675

ggml_cgraph 详解

是 GGML 库的(Computation Graph)结构,它是深度学习框架的核心,用于表示、优化和执行神经网络的计算过程。

zhouzwd87的专栏 1203

AutoMQ 携手阿里云共同发布新一代云原生 Kafka,帮助得物有效压缩 85% Kafka 云支出!

以成本换效率的上云方式需要高速发展的业务来支撑,在今天降本的大环境下,以云原生,甚至多云原生重新设计的云服务相较于「Cloud-Hosted」的云服务将在弹性、成本、容量、效率等各方面有数量级的优势,云托管(Cloud-Hosted)类型的云服务即将被淘汰。稳定性有其高大上的一面,也有需要埋头苦干的另一面,聪明人一起坚持做一件事情可能是得物稳定性的内涵,郝豪提到他在业务场景的治理上,告警规则的梳理上,持续做了 3 年,从 21 年到 23 年持续在投入,每一年都有不同的方向和目标。

AutoMQ的博客 2406

DRAM 埋入式字线(Buried Wordline)技术深度解析:从二维平面到三维凹槽

埋入式字线(bWL)及其核心的埋入式沟道阵列晶体管(BCAT)架构,无疑是 DRAM 发展史上的一次关键性革命。它在约 40nm 技术节点被行业主流采纳,成功地帮助 DRAM 产业克服了传统平面晶体管的物理缩放极限。力挽狂澜的续命技术:bWL 通过引入三维沟道结构,从根本上解决了由短沟道效应和漏电流失控引发的数据保持危机,为经典的 1T1C(单晶体管 - 单电容)DRAM 单元架构延续了超过十年的生命力。协同优化的基石技术。

m0_37606066的博客 3329

U8+ 新建账套

一、登录 账套主管:demo 对账套有修改权限,有账套库权限 系统管理员:admin 其他所有权限 二、新建账套 admin登录–>点击系统管理–>账套–>建立 选择了参照已有账套结转期初:就是上一个的期末数据作为这一次新表的期初数据 启用会计期一旦选择更改不了。 ...

茶茶很困i 3694

原理剖析:AutoMQ 如何实现分区持续重平衡

01 引言 在一个线上 Kafka 集群中,流量的波动、Topic 的创建和删除、Broker 的消亡和启动都随时可能发生,而这些变化可能导致流量在集群各个节点间分布不均,从而导致资源浪费、影响业务稳定。此时则需要主动将 Topic 的不同分区在各个节点间移动,以达到平衡流量和数据的目的。当前,Apache Kafka 仅提供了分区迁移工具,但具体的迁移计划则需要运维人员自行决定,而对于动...

gaoliang1719的专栏 268

Win11更新导致TIA博途许可证出现问题的解决办法汇总

Win11更新导致TIA博途许可证出现问题的解决办法汇总

Robot_PLC_HMI_Automation 9896

AutoMQ 如何实现没有写性能劣化的极致冷读效率

Apache Kafka 一直以来都以极致的吞吐能力受到广大开发者和使用者的喜爱。AutoMQ[1] 在保证与 Apache Kafka 100% 兼容并且提供极致弹性和降本能力的基础上,不仅做到了相比Kafka更加极致的吞吐能力,同时还解决了Kafka冷读时,写吞吐性能劣化的问题。接下来,本文将从追赶读的实现来说明 AutoMQ 如何做到单机 1K 分区并发追尾读达到 1GB/s 的极致吞吐能力,并且在追赶读过程中避免发送流量的性能劣化。

AutoMQ的博客 1212

YOLO+OpenCV强强联手:高精度跌倒检测技术实战解析

(0, 1), (0, 2), (1, 3), (2, 4), # 脖子和头部(3, 5), (5, 6), (5, 7), (7, 9), (5,11),# 左臂(4,6), (6, 12), (6,8) ,(8,10),# 右臂(11, 12), (11, 13), (13, 15), #左腿(12, 14), (14, 16) #右腿keypoints是检测到的人体关键点数据,frame是图像帧,boxes是检测到的边界框信息。定义了人体关键点之间的连接关系,用于绘制人体骨架。

yolo模型训练找我,AI游戏合作找我 2314

【数字IC设计】芯片设计中的RDC

在芯片设计中,RDC是的缩写,类似于CDC(clock domain crossing),由于现在SOC芯片是有很多ECUs组成,为了使整个系统能够快速从复位中恢复, 用户希望SOC里面每个ECU模块都可以有自己独立的异步复位信号,这样可以在出问题的时候只复位有错误逻辑的模块,而使其它模块保持正常工作。

qq_40268672的博客 2185

AutoMQ 集成 Debezium

在现代企业中,数据处理需求的不断增长使得实时监控和响应数据库变化变得尤为重要。无论是电商平台的订单处理、库存管理,还是金融系统的交易监控,都需要对数据库中的变化进行实时捕捉和处理。这不仅能提高系统响应速度,还能在数据发生变化时及时采取相应的业务操作。为了实现这一目标,本文将介绍如何使用 Debezium [1] 监测 MySQL 数据库的变化,并将这些变化事件发送到 AutoMQ [2] 中。AutoMQ 作为一种高效、低成本的流处理系统,具有高弹性和高可用性,是企业实时数据处理的理想选择。

AutoMQ的博客 1100

SM2 是一种国密算法,用于生成密钥对和加解密。下面是 SM2 生成密钥对和加解密的示例代码,使用 Python 语言编写。

在这个函数中,我们使用公钥对数据进行加密,并返回加密后的结果。其中,我们使用了 OAEP 填充方案和 SHA256 哈希算法。SM2 是一种国密算法,用于生成密钥对和加解密。下面是 SM2 生成密钥对和加解密的示例代码,使用 Python 语言编写。首先,我们需要安装 cryptography 库,它包含了 SM2 算法的实现。使用上述代码,我们可以轻松地实现 SM2 密钥对生成和加解密功能。在这个函数中,我们使用私钥对密文进行解密,并返回解密后的明文。接下来,我们定义一个函数。在这个函数中,我们使用。

2301_78484069的博客 1952

海外开发者为 AutoMQ 写的精品介绍,太干了!

在 KRaft 模式下的每个 broker 都保留了元数据的本地副本,而控制器群的领导者负责管理更新并将其复制到所有的 brokers,这大大降低了操作的复杂性和可能的故障点。AutoMQ 的工程师们开始思考:“是否存在一种方法,可以将所有的 Kafka 数据存储在对象存储中,同时还能保持像在本地硬盘上一样的高性能?传统的 Kafka 依赖于独立的 ZooKeeper 服务器来进行集群元数据的管理,但是 KRaft 模式消除了对 ZooKeeper 的依赖,简化了 Kafka 的运行并提升了其弹性。

AutoMQ的博客 1095

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

AutoMQ多协议支持:MQTT、AMQP协议适配器开发

随着物联网(IoT)和企业级消息通信需求的增长,单一消息协议已无法满足多样化场景。AutoMQ作为云原生消息队列,通过协议适配器架构支持多协议接入,本文将详细介绍MQTT(消息队列遥测传输)和AMQP(高级消息队列协议)适配器的开发实践,帮助开发者快速扩展AutoMQ的协议兼容性。 ## 协议适配器架构设计 AutoMQ的多协议支持基于Kafka Connect框架实现,通过源连接器(Sour...

gitblog_00758的博客 543

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

重磅!AutoMQ 品牌全新升级

2024 年伊始,AutoMQ 作为一家专业的消息队列和流存储软件服务供应商,正式发布全新的 logo 和官网与大家见面!一直以来,我们致力于引领消息和流存储走向云原生时代!希望通过这次品牌升级,不断创新,为大家提供更先进的产品和服务!新 logo 以"M"字母为核心设计元素,融合"A"字母,不仅象征着 AutoMQ 的名字,更代表了我们对核心业务和理念的坚持。

AutoMQ的博客 990

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

AutoMQ 如何实现分区持续重平衡?

在一个线上 Kafka 集群中,流量的波动、Topic 的创建和删除、Broker 的消亡和启动都随时可能发生,而这些变化可能导致流量在集群各个节点间分布不均,从而导致资源浪费、影响业务稳定。此时则需要主动将 Topic 的不同分区在各个节点间移动,以达到平衡流量和数据的目的。

AutoMQ的博客 1353

AutoMQ 开源可观测性方案:夜莺 Flashcat

然而,随着集群规模的扩大和业务复杂性的增加,确保 AutoMQ 集群的稳定性、高可用性和性能优化变得尤为重要。通过使用夜莺监控系统,企业可以实时掌握 AutoMQ 集群的运行状态,及时发现和解决潜在问题,优化系统性能,确保业务的连续性和稳定性。创建完告警后,让我们来模拟高并发的消息处理场景:短时间内总共2500000条消息被发送到 AutoMQ 节点,我采用的方式是通过 Kafka SDK 的方式进行消息发送,一次共 50 个 Topic ,给每个 Topic 发送 500 条消息,共 100 次。

AutoMQ的博客 848

开源布道 共创生态——2024 AutoMQ 布道师计划启动!

AutoMQ 布道师在 AutoMQ 社区中扮演着至关重要的角色,他们是 AutoMQ 社区的积极贡献者,是高效数据处理和流存储的倡导者,也是对云原生技术充满热忱的探索者。他们运用自己的专业能力,通过创作深度内容和社区互动,分享对 AutoMQ 产品的技术洞察与个人见解,将 AutoMQ 的产品优势和实用技巧传递给更广泛的用户群体,与 AutoMQ 一同成长。如果你也认同我们的产品和理念,那么欢迎你加入 AutoMQ 布道师的行列,和我们一起探索云原生技术的潜能,创造更开放、更多元、更具活力的开源生态。

AutoMQ的博客 1215

AutoMQ 产品动态 | 发布 1.1.0,兼容至 Apache Kafka 3.7,支持 Kaf

现在我们基于对象存储优先、存算分离、多云原生等技术理念,重新设计并实现了 Apache Kafka 和 Apache RocketMQ,带来高达 10 倍的成本优势和百倍的弹性效率提升。AutoMQ 进一步发挥云存储的优势,在 1.1.0 版本宣布支持 Regional ESSD,为客户在多 AZ 容灾场景下提供更低的故障 RTO。KIP-714:新增多语言统一的客户端 Metrics,提供从服务端查询客户端 Metrics 的能力(3.7.0)

AutoMQ的博客 1489

Kafka 痛点专题|AutoMQ 如何解决 Kafka 冷读副作用

本文着重剖析了 Kafka 在冷读时产生问题的原理,以及 AutoMQ 的解法。下一篇 《Kafka 痛点专题》我们将探讨 Kafka 痛点中的 No.1 ,即弹性,敬请期待。END关于我们我们来自 Apache RocketMQ 和 Linux LVS 项目的核心团队,曾经见证并应对过消息队列基础设施在大型互联网公司和云计算公司的挑战。

AutoMQ的博客 1167

AutoMQ:云原生Kafka的革命性替代方案

你是否正面临Kafka集群扩展困难、跨可用区流量成本高昂、存储容量受限等痛点?AutoMQ作为一款云原生的Kafka分支,通过将存储与计算分离并迁移至S3或兼容S3的对象存储,实现了10倍成本优化、秒级弹性扩展和毫秒级延迟,彻底改变了传统Kafka的运维模式。本文将从核心优势、架构解析、快速部署和实际应用场景四个维度,带你全面了解这款革命性的消息队列解决方案。 ## 核心优势:重新定义云原生消息

gitblog_00068的博客 940

AutoMQ 云原生消息中间件

通过本文,我们深入探讨了 CloudCanal 与 AutoMQ 的整合能力,特别是其在 MySQL -> AutoMQ 数据链路中的表现。这一合作不仅为用户提供了更高效的数据同步解决方案,还通过云原生技术的应用,提升了系统的灵活性和成本效益。未来,随着技术的不断发展和完善,CloudCanal 与 AutoMQ 的合作必将为更多企业带来创新的动力和增长的机会。

数据同步 947

AutoMQ 自动化持续测试平台技术内幕

再来看下 AbstractTask 的其他方法可以发现它继承了 Runnable 接口,通过重写 run 方法来依次执行 prepare、warmup、workload、cleanup 四个生命周期,这样就可以将 Task 交给一个线程来执行Controller 启动时会创建一个任务循环,根据用户需要创建出对应的 Task 对象后调用 start 方法来启动一个新线程运行该任务,然后 Controller 会调用 join 方法等待 Task 的生命周期结束,再继续运行下一个任务。

AutoMQ的博客 1356

AutoMQ 生态集成 CubeFS

对象网关的作用在于,它提供了与 S3 兼容的对象存储接口,这使得 CubeFS 不仅能够支持传统的 POSIX 文件系统接口,还能够支持 S3 兼容的对象存储接口。AutoMQ 创新的共享存储架构需要低成本的对象存储,而 CubeFS 支持 S3 兼容接口,其中 ObjectNode 提供兼容 S3 的对象存储接口来操作 CubeFS 中的文件,因此可以使用 S3Browser、S3Cmd 等开源工具或者原生的 Amazon S3 SDK 操作 CubeFS 中的文件。

AutoMQ的博客 774

AutoMQ消息序列化终极指南:如何开发自定义序列化器

AutoMQ作为云原生Kafka分支,通过将存储分离到S3和EBS实现了10倍成本效益,秒级自动扩展和个位数毫秒延迟。消息序列化是AutoMQ生态系统的核心组件,它负责将复杂数据结构转换为可传输的字节流,是确保数据高效传输和持久化的关键技术。本文将为您提供完整的自定义序列化器开发指南,帮助您充分利用AutoMQ的强大功能。 ## 🎯 什么是消息序列化? 消息序列化是将对象或数据结构转换为字节

gitblog_00131的博客 364
上一篇: 章文嵩等技术大咖共同探讨企业数据治理和降本增效策略运用!
下一篇: AutoMQ 社区双周精选第九期((2024.03.11~2024.03.22)
AutoMQ
博客等级 码龄3年 1206粉丝 157原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值