| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> Kafka 设计思想 -> 正文阅读 |
|
[大数据]Kafka 设计思想 |
Kafka 设计思想参考 动机Kafka 被设计为一个统一的平台来处理大公司可能拥有的所有实时数据馈送。要做到这点,需要考虑相当广泛的用例。 Kafka 必须具有高吞吐量来支持高容量事件流,例如实时日志聚合。 Kafka 需要能够处理大量的数据挤压,以便能够支持来自离线系统的周期性数据加载。 这也意味者系统必须低延迟分发,来处理更传统的传递用例。 持久化Kafka 对消息的存储和缓存严重依赖于文件系统。人们对于 “磁盘速度慢” 的普遍印象,使得人们对于持久化的架构能够提供强有力的性能产生怀疑。事实上,磁盘 关于磁盘性能的关键事实是,磁盘的吞吐量和过去十年里磁盘的寻址延迟不同。因此,使用 6 个 7200 RPM、SATA 接口、 RAID-5 的磁盘阵列在 JBOD 的配置下 为了弥补这种性能差异,现代操作系统在越来约重视使用内存对磁盘进行 cache。现代操作系统主动将所有空闲内存用作 disk caching,代价是内存回收时性能会有所降低。 此外,Kafka 建立在 JVM 之上,任何了解 Java 内存使用的人都直到两点:
受这些因素影响,相比于维护 in-memory cache 或者其他结构,使用文件系统和 pagecache 显得更有优势——我们可以通过自动访问所有空闲内存将可以缓存的 这里给出了一个非常简单的设计:相比于维护尽可能多的 in-memory cache,并且在空间不足的时候匆忙将数据 flush 到文件系统,我们把这个过程倒过来。 这种 pagechache-centric 的设计风格出现在一篇关于 Varnish 设计的文章中。 常量时间就足够了 通常,其他的消息系统使用的持久化数据结构通常是和 BTree 相关联的消费者队列或者其他用于存储消息源数据的通用随机访问数据结构。BTree 是最通用的数据结构, 所以,持久化队列建立在简单的读取和向文件后追加两种操作之上,这和日志解决方案相同。这种架构的优点在于所有的操作复杂度都是 O(1),而且读操作不会阻塞 在不产生任何性能损失的情况下能够访问几乎无限的硬盘空间,这意味着我们可以提供一些其他消息系统不常见的特性。例如:在 kafka 中,我们可以让消息保留较长 Efficiency 消除了磁盘访问模式不佳的情况,该类系统性能地下的主要原因就剩下了两个:大量的小型 I/O 操作,以及过多的字节拷贝。 小型的 I/O 操作发生在客户端和服务器之间以及服务端自身的持久化操作中。 为了避免这种情况,我们的协议是建立在一个 “消息块” 的抽象基础上,合理将消息分组。这使得网络请求将多个消息打包成一组,而不是每次发送一条消息,从而使 这个简单的优化对速度有着数量级的提升。批处理允许更大的网络数据包,更大的顺序读写磁盘操作,连续的内存块等等,所有这些都使 Kafka 将随机流消息顺序 另一个低效率的操作是字节拷贝,在消息量少时,这不是什么问题。但是在高负载的情况下,影响就不容忽视。为了避免这种情况,我们使用 producer,broker 和 broker 维护的消息日志本身就是一个文件目录,每个文件都由一系列以相同格式写入到磁盘的消息集合组成,这种写入格式被 producer 和 consumer 公用。 为了理解 sendfile 的意义,了解数据从文件到套接字的常见数据传输路径就非常重要:
这显然是低效的,有四次 copy 操作和两次系统调用。使用 sendfile 方法,可以允许操作系统将数据从 pagecache 直接发送到网络,这样避免重新重复数据。 我们期望一个普遍的应用场景,一个 topic 被多消费者消费。使用上面提交的 zero-copy (零拷贝)优化,使用在使用时只会被复制到 pagecache 中一次, pagecache 和 sendfile 的组合使用意味着,在一个 kafka 集群中,大多数 consumer 消费时,您将看不到磁盘上的读取活动,因为数据将完全由缓存提供。 Java 中更多有关 sendfile 方法和 zero-copy 相关的资料,可以参考这里的文章。 端到端的批量压缩 在某些情况下,数据传输的瓶颈不是 CPU,也不是磁盘,而是网络带宽。对于需要通过广域网在数据中心发送消息的数据管道尤其如此。当然,用户可以在不需要 Kafka Kafka 以高效的批处理方式支持一批消息可以压缩在一起发送到服务器。这批消息以压缩格式写入,并且在日志中保持压缩,只会在 consumer 消费时解压缩。 Kafka 支持 GZIP,Snappy 和 LZ4 压缩协议,更多有关压缩的资料参考这里 The Producer 生产者Load balancing 负载均衡 生产者直接发送数据到主分区的服务器上,不需要经过任何中间路由。为了让生产者实现这个功能,所有的 kafka 服务器节点都能响应这样的元数据请求:哪些服务器 客户端控制消息发送数据到哪个分区,这个可以实现随机的负载均衡方式,或者使用一些特定语义的分区函数。我们有提供特定分区的接口,根据指定的键值进行 hash Asynchronous send 异步发送 批处理是提升性能的一个主要驱动,为了允许批量处理,kafka 生产者会尝试在内存中汇总数据,并用一次请求批次提交信息。批处理,不仅仅可以配置指定的消息 消费者Kafka consumer 通过向 broker 发出一个 “fetch” 请求来获取它想要消费的 partition。consumer 的每个请求都在 log 中指定了对应的 offset,并接收 Push vs. pull Kafka 设计最初考虑的问题是:究竟是由 consumer 从 broker 那里 pull 数据,还是由 broker 将数据 push 到 consumer ? Kafka 这里采取了一种较为 传统的设计方式,也是大多数的消息系统所共享的方式:即 producer 把数据 push 到 broker,然后 consumer 才能够 broker pull 数据。 有些 logging-centric 的系统,比如 Scribe 和 Apache Flume,然这一条完全不同的 push-based 的路径,将数据 push 到下游节点。 consumer。 这两种方法都有优缺点。然而,由于 broker 控制着数据传输速率,所以 push-based 系统很难处理不同的 consumer。让 broker 控制数据传输速率主要是 还可以通过使用某种 backoff 协议来减少这种现象:即 consumer 可以通过 backoff 表示它已经不堪重负了,然而通过获得负载情况来充分使用 consumer(但永远不超载) 另一个 pull-based 系统的优点在于:它可以大批量生产要发送给 consumer 的数据。而 push-based 系统必须选择立即发送请求或者积累更多的数据,然后在 简单的 pull-based 系统的不足之处在于:如果 broker 中没有数据,consumer 可能会在一个紧密的循环中结束轮询,实际上 busy-waiting 知道数据到来。 消费者的位置
离线数据加载
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 12:52:53- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |