首页 > 其他分享 >Apache Kafka设计思考

Apache Kafka设计思考

时间:2024-10-14 22:44:54浏览次数:1  
标签:缓存 分区 Kafka 内存 思考 Apache 磁盘 数据

kafka设计

  • 微信公众号:阿俊的学习记录空间
  • 小红书:ArnoZhang
  • wordpress:arnozhang1994
  • 博客园:arnozhang
  • CSDN:ArnoZhang1994

一、目标

能够作为一个统一的平台,处理大型公司可能拥有的所有实时数据流。(更像是数据库日志)

  • 高吞吐量:Kafka必须具有高吞吐量,以支持高容量的事件流,例如实时日志聚合。
  • 处理数据积压:它需要能够优雅地处理大量数据积压,以支持离线系统的周期性数据加载。
  • 低延迟传输:这也意味着系统必须能够处理低延迟传输,以满足更传统的消息传递用例。
  • 分区与实时处理:我们希望支持这些数据流的分区、分布式、实时处理,以创建新的派生数据流。这激发了我们的分区和消费者模型。
  • 容错性:最后,在将数据流传输到其他数据系统以提供服务的场景中,我们知道系统必须能够在机器故障时保证容错性。

二、持久化

Kafka严重依赖文件系统来存储和缓存消息。设计良好的磁盘结构通常可以和网络一样快。

磁盘性能的关键在于,过去十年里,硬盘的吞吐量与磁盘寻道延迟的差距正在扩大。结果是,配置六个7200rpm SATA RAID-5阵列的JBOD(只是一堆磁盘)可以提供约600MB/秒的线性写入性能,但随机写入的性能却只有约100k/秒——差距超过6000倍。这些线性读写操作是所有使用模式中最可预测的,操作系统对此进行了大量优化。现代操作系统提供了预读和回写技术,这些技术可以预取大块数据并将较小的逻辑写操作组合成较大的物理写操作。关于这个问题的进一步讨论可以参考ACM Queue的文章;他们实际上发现顺序磁盘访问有时比随机内存访问更快!

为了弥补这种性能差异,现代操作系统在磁盘缓存上变得越来越积极。现代操作系统会愉快地将所有空闲内存用于磁盘缓存,而当内存被回收时,性能损失很小。所有磁盘的读写操作都会经过这个统一的缓存。如果不使用直接I/O,很难关闭此功能,因此即使一个进程维护了一个进程内缓存,这些数据可能仍然会在操作系统页面缓存中被复制,实际上将所有内容存储了两次。

此外,kafka是基于JVM的,任何使用过Java内存的人都知道两件事:

  • 对象的内存开销非常高,通常会使存储的数据量加倍(甚至更糟)。
  • 随着堆内数据的增加,Java垃圾回收变得越来越复杂和缓慢。

磁盘页面文件是指操作系统用来构建虚拟内存的硬盘空间。
页缓存是Linux内核一种重要的磁盘高速缓存,它通过软件机制实现。

由于这些因素,使用文件系统并依赖页面缓存要优于维护内存缓存或其他结构——通过自动访问所有空闲内存,我们至少可以将可用缓存容量加倍,并且由于存储的是压缩的字节结构而不是单个对象,可能会再次加倍。这样可以在32GB机器上得到高达28-30GB的缓存空间,并且不会有GC(垃圾回收)带来的性能损失。此外,即使服务重新启动,这个缓存仍然保持热态,而进程内缓存则需要在内存中重建(对于一个10GB的缓存,这可能需要10分钟),否则将不得不从完全冷态缓存开始(这可能意味着初始性能非常差)。这也大大简化了代码,因为所有维护缓存和文件系统一致性的逻辑现在都由操作系统处理,操作系统通常比一次性进程内尝试更有效、更正确。如果你的磁盘使用偏向于线性读取,那么预读操作实际上是在每次磁盘读取时用有用数据预填充这个缓存。

这表明了一种非常简单的设计:与其尽可能多地在内存中维护数据,并在空间不足时恐慌地将其全部刷新到文件系统中,我们反其道而行之。所有数据都立即写入文件系统上的持久日志,而不一定要刷新到磁盘上。实际上,这意味着数据被传输到了内核的页面缓存中。

三、效率

我们投入了大量精力提高效率。我们最主要的用例之一是处理网页活动数据,这是一种非常高容量的数据:每个页面浏览可能会生成几十次写操作。此外,我们假设每个发布的消息至少会被一个消费者读取(通常是多个),因此我们努力使消费变得尽可能便宜。

我们还从构建和运行许多类似系统的经验中发现,效率是实现多租户操作的关键。如果下游基础设施服务由于应用程序使用中的一个小突增而轻易成为瓶颈,这样的小变化往往会引发问题。通过确保基础设施不会成为性能瓶颈,我们可以帮助确保在负载下首先崩溃的是应用程序,而不是基础设施。这一点在运行一个支持几十或上百个应用程序的集中式集群时尤为重要,因为使用模式的变化几乎是每天都会发生的。

我们在前一节讨论了磁盘效率。一旦消除了不良的磁盘访问模式,这类系统中的两个常见低效原因是:过多的小I/O操作和过多的字节复制。

小I/O问题发生在客户端与服务器之间以及服务器自身的持久操作中。

为避免此问题,我们的协议围绕着“消息集”抽象构建,自然地将消息分组在一起。这允许网络请求将消息分组在一起,分摊网络往返的开销,而不是一次只发送一条消息。服务器则一次将大量消息附加到日志中,消费者也一次获取大块的线性数据。

这一简单的优化带来了数量级的加速。批处理使网络包更大,顺序磁盘操作更大,内存块更连续,所有这些都允许Kafka将随机的消息写入流转变为线性写入,从而流向消费者。

四、生产者

负载均衡

生产者将数据直接发送到分区的主副本,避免了中间路由层的复杂性。所有Kafka节点都可以响应元数据请求,告知主题的各个分区的主副本位置,允许生产者适当地定向请求。
生产者可以选择通过分区键对数据进行语义分区,确保同一键值的数据发送到同一个分区,方便消费者进行本地化处理。

异步发送

为了提高效率,Kafka生产者积累内存中的数据并批量发送。批量大小和等待时间可配置,例如64k或10毫秒,提供了在延迟和吞吐量之间的权衡。生产者通过批处理减少服务器上较小I/O操作的开销。

五、消费者

Kafka消费者通过向分区的主代理发出"fetch"请求来工作,并指定从何处开始消费日志。消费者对消费位置有完全控制,支持倒回重新消费。

推送与拉取

Kafka采用拉取模式,允许消费者控制数据消费速度,避免了推送模式下因消费速率不足导致的过载问题。拉取模式支持数据批处理,确保不影响延迟的情况下优化传输效率。

Kafka通过长轮询避免紧密轮询轮询的忙等待问题,消费者可以等待数据的到来或设定一个字节限制,确保批量数据传输。
拉取模式更适合多生产者、大规模数据管道的应用场景。

消费者位置

Kafka的分区是有序的,每个分区的消费者位置仅是一个整数,代表下一个要消费的消息偏移量。这使得已消费数据的状态非常小,并可以定期进行检查点操作。消费者可以重新消费数据,支持对Bug修复后的回溯处理。

离线数据加载

Kafka支持批量数据加载,如加载到Hadoop或数据仓库中。Hadoop的每个节点/主题/分区组合一个任务,支持完全并行加载。

六、静态成员身份

静态成员身份用于提高基于组rebalance协议构建的流应用程序的可用性。动态成员身份在任务重新分配时可能导致有状态应用程序的任务恢复时间过长,影响可用性。Kafka通过允许组成员提供持久的实体ID来避免不必要的重平衡,保证组成员身份不变,从而提升系统的可用性。

使用静态成员身份步骤:

  1. 将代理集群和客户端应用程序升级到2.3或更高版本。
  2. 为每个消费者实例设置唯一的GROUP_INSTANCE_ID_CONFIG值。
  3. 对Kafka Streams应用程序,使用application.server参数,确保部署的实例具有唯一值。

标签:缓存,分区,Kafka,内存,思考,Apache,磁盘,数据
From: https://www.cnblogs.com/arnozhang/p/18466143

相关文章

  • Apache Kafka 使用示例
    Kafka快速入门指南微信公众号:阿俊的学习记录空间小红书:ArnoZhangwordpress:arnozhang1994博客园:arnozhangCSDN:ArnoZhang1994第一步:获取Kafka下载2.13-3.8.0版本的Kafka版本并解压:$tar-xzfkafka_2.13-3.8.0.tgz$cdkafka_2.13-3.8.0第二步:启动Kafka环境注意:你的......
  • Apache Kafka的生态
    Kafka生态系统微信公众号:阿俊的学习记录空间小红书:ArnoZhangwordpress:arnozhang1994博客园:arnozhangCSDN:ArnoZhang1994以下是与Kafka集成的工具列表,涵盖了不同领域的工具和扩展。这些工具并非全部经过验证使用,部分可能不兼容或存在问题。KafkaConnectKafk......
  • Apache Kafka各Api模块说明
    KafkaAPI微信公众号:阿俊的学习记录空间小红书:ArnoZhangwordpress:arnozhang1994博客园:arnozhangCSDN:ArnoZhang1994Kafka包含五个核心API:ProducerAPI允许应用程序将数据流发送到Kafka集群中的topic。ConsumerAPI允许应用程序从Kafka集群中的topic读取数据流......
  • 2023 ThinkPad运行Linux选购思考记录
    2023ThinkPad运行Linux选购思考记录TieraRedHat高级混合云架构师/RHCALevel3​关注 17人赞同了该文章​展开目录 前言在当今这个数字化时代,笔记本电脑已成为我们日常生活和工作中不可或缺的工具。对于软件工程师和系......
  • 微服务02 Kafka消息队列, Dubbo, Springcloud微服务框架, Nacos
    3.6Kafka部署kafka下载链接http://kafka.apache.org/downloads#清华源https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/kafka版本格式kafka_<scala版本>_<kafka版本>#示例:kafka_2.13-2.7.0.tgz官方文档:http://kafka.apache.org/quickstart#二进制安装......
  • 微服务01 ZooKeeper, Kafka
    1.4微服务1.4.6SpringCloudJAVA微服务技术Dubbo是2014年之前阿里退出的分布式系统的技术(不属于微服务)。现在主流是SpringCloudSpringCloud 官网地址:https://spring.io/projects/spring-cloud官网上实现方法有很多种,目前主流是阿里巴巴实现的方法Sprin......
  • Apache 设置端口重定向
    1.背景今天收到了云服务商的邮件,说是根据历史的备案信息网站无法访问,突然想起在此之前配置apache时,默认的访问路径是不完整的,需要添加后缀才能访问到站点。同时,由于配置SSL证书后没有进行重定向,导致http访问时会被定向到php的测试界面。2.修改2.1更新默认站点的访问......
  • 如何在 Ubuntu 16.04 上将 Apache Web 根目录移动到新位置
    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。简介在Ubuntu上,默认情况下,Apache2Web服务器将其文档存储在/var/www/html目录中,通常位于与操作系统其余部分相同的根文件系统上。然而,有时将文档根目录移动到另一个位......
  • zookeeper 都有哪些使用场景?思考13
    大致来说,zookeeper的使用场景如下,我就举几个简单的,大家能说几个就好了:分布式协调分布式锁元数据/配置信息管理HA高可用性分布式协调这个其实是zookeeper很经典的一个用法,简单来说,就好比,你A系统发送个请求到mq,然后B系统消息消费之后处理了。那A系统如何知道B系统......
  • zookeeper 都有哪些使用场景?思考5
    大致来说,zookeeper的使用场景如下,我就举几个简单的,大家能说几个就好了:分布式协调分布式锁元数据/配置信息管理HA高可用性分布式协调这个其实是zookeeper很经典的一个用法,简单来说,就好比,你A系统发送个请求到mq,然后B系统消息消费之后处理了。那A系统如何知道B系统......