`

Kafka MetaQ Beanstalkd 的内部实现

 
阅读更多

Kafka 内部实现:

Kafka 官方说明了 Kafka 的各种优点,包含:

FileTransfer 的 zero copy 的 IO 实现;
直接写磁盘, 而不做复杂的内存和文件系统之间的转换;
磁盘顺序读写带来的高吞吐;
直接用系统的 page cache 做文件缓存管理, 程序本身不进行缓存管理;
实现了复制高可用;
依赖 Zookeeper 实现客户端的协调和状态存储;

但是这些简化设计是否是“优点”,是仁者见仁的。Broker 本身简单的设计带来的是客户端的复杂性。依赖 Zookeeper 也需要额外维护 Zookeeper 。

存储格式:

每个队列存储在一组序号自增、大小有上限的文件中。

数据持久化:

依赖操作系统的 pdflush 来做 pagecache 中的数据落地无法保证数据的可靠存储,所以 Kafka 提供了一个配置参数,可有由 Kafka 本身调用 fsync 强制落地。其实写文件不强制 fsync 系统也会用 pagecache 缓存这部分数据。

关于 pdflush 的原理可以看 http://www.westnet.com/~gsmith/content/linux-pdflush.htm

可配置参数:

/proc/sys/vm/nr_pdflush_threads
/proc/sys/vm/dirty_writeback_centisecs
/proc/sys/vm/dirty_expire_centiseconds
/proc/sys/vm/dirty_background_ratio

更多关于 Linux IO 调度的内容:
http://www.linuxjournal.com/article/6931

顺序写盘:
——————-
Linux 文件系统中当打开文件的时候是顺序写盘模式;当都是顺序写入的时候也是顺序写盘。
MMAP 会由系统优化尽量顺序读写盘。

Kafka 相关代码:

new RandomAccessFile(file, “rw”).getChannel()

https://github.com/apache/kafka/blob/a984f2fe5e3370163fb53586a04611ebd878c5ae/core/src/main/scala/kafka/utils/Utils.scala#L324

http://www.ericrochester.com/pages/code/parallel-io-with-mmap/

Zero-copy IO 优化:
——————-
Linux 系统底层调用为 sendfile

Java 提供 API:

public void transferTo(long position, long count, WritableByteChannel target);
channel.force(true); = fsync
channel.force(false); = fdatasync

更多参考和 Kafka 中的实现:

http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html
https://github.com/apache/kafka/blob/0.7/core/src/main/scala/kafka/message/FileMessageSet.scala#L102
https://github.com/apache/kafka/blob/0.7/core/src/main/scala/kafka/message/FileMessageSet.scala#L169

Zero copy 避免了应用级别的复制,减少几次调用,提高了效率。

https://www.ibm.com/developerworks/library/j-zerocopy/

灾难恢复:
———–
由于每个 message 都存储了对应的 CRC ,恢复的时候遍历文件中的数据并且校验数据就可以得到可恢复的位置。Kafka 中的实现为:

https://github.com/apache/kafka/blob/a984f2fe5e3370163fb53586a04611ebd878c5ae/core/src/main/scala/kafka/message/FileMessageSet.scala#L189

客户端负载均衡:
—————
所有 broker 节点和生产者、消费者注册到 Zookeeper 。节点变化触发相关客户端的平衡操作。节点都尝试自平衡直到达成一致。

MetaQ:

原理和 Kafka 非常类似,但是接口和数据存储方式有些差异。

MMAP 文件的实现:
https://github.com/alibaba/metaq/blob/8a954248091d21636dd48468be65704aecd435dd/metaq-store/src/main/java/com/taobao/metaq/store/MapedFile.java#L71

我在这里实现了 MetaQ 的 PHP 客户端,需要的可以使用:

https://github.com/doubaokun/metaq-php

Beanstalkd:

简单的单线程应用,读写都使用内存,为了可以停机和恢复数据,写数据的时候会同时写 binlog 文件,binlog 文件的刷盘时间间隔可配置。

最新版本的实现已经将 fsync(2) 更换为 fdatasync 避免 2 次写盘 (即更新文件数据,又更新文件 meta 信息),新建文件为固定大小的文件。

目前实现:
————
只用内存存储,容量上限为内存大小。
通过 binlog 实现数据加载恢复。
将 binlog 周期 fsync 强制写入磁盘。
注意这里的 binlog 并不是 MySQL 类似的 oplog。

分享到:
评论

相关推荐

    Kafka技术内幕:图文详解Kafka源码设计与实现+书签.pdf+源码

    《Kafka技术内幕:图文详解Kafka源码设计与实现》是一本深入解析Apache Kafka的专著,旨在帮助读者理解Kafka的核心设计理念、内部机制以及源码实现。这本书结合图文并茂的方式,使得复杂的概念变得更为易懂。同时,...

    Kafka技术内幕:图文详解Kafka源码设计与实现 PD

    Kafka技术内幕:图文详解Kafka源码设计与实现 PDF 下载 Kafka技术内幕:图文详解Kafka源码设计与实现 PDF 下载

    Kafka技术内幕-图文详解Kafka源码设计与实现

    Kafka自LinkedIn开源以来就以高性能、高吞吐量、分布式的特性著称,本书以0.10版本的源码为基础,深入分析了Kafka的设计与实现,包括生产者和消费者的消息处理流程,新旧消费者不同的设计方式,存储层的实现,协调者...

    Kafka技术内幕:图文详解Kafka源码设计与实现.郑奇煌(2017.11).pdf

    《Kafka技术内幕:图文详解Kafka源码设计与实现》是郑奇煌在2017年11月出版的一本深入解析Apache Kafka的技术专著。这本书详细介绍了Kafka的核心概念、工作原理以及源码分析,旨在帮助读者理解并掌握这个分布式流...

    Kafka技术内幕:图文详解Kafka源码设计与实现

    《Kafka技术内幕:图文详解Kafka源码设计与实现》是一本深入解析Apache Kafka的专著,旨在帮助读者理解Kafka的核心设计理念、内部机制以及源码实现。这本书籍覆盖了大数据处理领域的关键知识点,通过丰富的图表和...

    Kafka技术内幕:图文详解Kafka源码设计与实现 高清带书签

    通过阅读《Kafka技术内幕:图文详解Kafka源码设计与实现》这本书,读者可以深入了解Kafka的内部运作机制,学习如何根据业务需求调整和优化Kafka集群,以及如何解决实际遇到的问题。这本书对于从事大数据、流处理、...

    kafka 技术内幕 图文详解Kafka源码设计与实现

    《Kafka技术内幕》这本书深入剖析了Apache Kafka这一分布式流处理平台的设计原理和实现细节,旨在帮助读者理解Kafka的核心机制,并能有效地运用到实际项目中。以下是对Kafka源码设计与实现的一些关键知识点的详细...

    Kafka高可用性实现原理

    Kafka高可用性实现原理 Kafka 作为一个分布式消息系统,具有高可用性和高吞吐量的特点。其高可用性实现原理可以从以下几个方面来分析: 1. 分布式系统架构 Kafka 的架构是基于分布式系统的,包括 Producer、...

    使用netty实现TCP长链接消息写入kafka以及kafka批量消费数据

    标题"使用netty实现TCP长链接消息写入kafka以及kafka批量消费数据"揭示了这个项目的核心内容:通过Netty接收TCP长连接的数据,并将这些数据存储到Kafka中,同时利用Kafka的批量消费功能对数据进行处理。下面我们将...

    妳那伊抹微笑_Kafka之自定义Encoder实现Class级别的数据传送以及解析的Eclipse工程_201407181.rar

    妳那伊抹微笑_Kafka之自定义Encoder实现Class级别的数据传送以及解析的Eclipse工程_201407181.rar 该文档与教程http://blog.csdn.net/u012185296/article/details/37924353 配套使用的,主要讲的是Kafka之自定义...

    Kafka技术内幕图文详解源码设计与实现

    Kafka自LinkedIn开源以来就以高性能、高吞吐量、分布式的特性著称,本书以0.10版本的源码为基础,深入分析了Kafka的设计与实现,包括生产者和消费者的消息处理流程,新旧消费者不同的设计方式,存储层的实现,协调者...

    kafka介绍(内部培训).pptx

    kafka介绍,介绍kafka的原理,使用,案例和引用库调用,基于大数量的场景下的消息队列切换,作为内部资料培训现在拿出来分享

    kafka基础代码实现

    在本文中,我们将深入探讨Kafka的基础代码实现,包括客户端和服务端的交互。 **1. Kafka架构** Kafka的核心组件包括生产者(Producer)、消费者(Consumer)、主题(Topic)和 broker。生产者负责发布消息到主题,消费者...

    java实现flink订阅Kerberos认证的Kafka消息示例源码

    在Java中实现Flink订阅Kerberos认证的Kafka消息是一项关键任务,特别是在处理安全敏感的数据流时。本文将深入探讨这一主题,介绍如何利用Apache Flink与Kafka的集成,以及如何通过Kerberos进行身份验证。 首先,...

    SpringBoot整合kafka及ProtoBuf实现跨平台跨语言的信息交互

    在SpringBoot应用中集成Kafka,我们可以使用Spring for Apache Kafka提供的API,轻松地实现消息的生产和消费。 接下来,我们讨论ProtoBuf(Protocol Buffers)。它是Google开发的一种数据序列化协议,类似于XML、...

    使用kafka实现的项目代码.zip

    kafka使用kafka实现的项目代码.zip使用kafka实现的项目代码.zip使用kafka实现的项目代码.zip使用kafka实现的项目代码.zip使用kafka实现的项目代码.zip使用kafka实现的项目代码.zip使用kafka实现的项目代码.zip使用...

    Kafka技术内幕:图文详解Kafka源码设计与实现.郑奇煌

    《Kafka技术内幕:图文详解Kafka源码设计与实现》是郑奇煌撰写的一本深入解析Apache Kafka的书籍,特别关注的是0.10版本。这本书提供了丰富的知识,涵盖了Kafka的核心概念、架构设计以及源码分析。下面将详细讨论书...

    使用KafkaStreams和SpringBoot实现微服务Saga分布式事务-Piotr.pdf

    本文主要介绍如何使用Kafka Streams和Spring Boot实现微服务Saga分布式事务。Saga是一种处理跨多个微服务的分布式事务的模式,通过一系列本地事务的协调来保证全局一致性。在微服务架构中,每个服务都有自己的数据库...

    mysql+canal+kafka配置及python实现文档.docx

    MySQL+Canal+Kafka 配置及 Python 实现文档 本文档将介绍如何使用 MySQL、Canal 和 Kafka 实现数据实时同步的配置和 Python 实现。 MySQL 配置 MySQL 需要开启日志记录功能,以便 Canal 监听日志变化。首先,...

Global site tag (gtag.js) - Google Analytics