当前位置:主页 > 新闻热点 >正文

Kafka 2.0重磅发布,新特性独家解读

作者: 丈哥 分类: 新闻热点 发布时间: 2019-01-12 22:20

作者介绍:王国璋,Apache Kafka PMC,Kafka Streams 作者。分别于复旦大学计算机系和美国康奈尔大学计算机系取得学士和博士学位,主要研究方向为数据库管理和分布式数据系统。现就职于 Confluent,任流数据处理系统架构师和技术负责人。此前曾就职于 LinkedIn 数据架构组任高级工程师,主要负责实时数据处理平台,包括 Apache Kafka 和 Apache Samza 系统的开发与维护。

增强在线可进化性

就我个人而言,这几年来学到的最重要的一课,就是要永远保证一个流式数据平台的在线可进化性(online-evolvable)。

之前我曾经读到 Amazon CTO Werner Vogels 写过的一篇博客,里面就提到这一点,并且有一个精彩的比喻:搭建一个能够在不断产品升级过程中保证永远在线的数据架构,就像是驾驶着一架简单的单螺旋桨飞机起飞,然后在飞行过程中,不断换新零件和添加新引擎,直到最后升级成一架超大的空客飞机,这一切都必须在飞行中同步完成,并且坐在里面的乘客不能有任何感觉,其难度可想而知。

而关于一个流数据平台,对于在线可进化性这一点的需求尤甚:这里我也打一个比方,尽管没有 Vogels 的那样精彩——数据流就像是一个连接城市各个地区的高速公路,高速公路所连接的地方,比如一家超市、一家影院,或者一个居民小区,就如同一个企业里面大大小小的各种应用产品或者数据仓库,超市可以暂时歇业,影院可以暂时关门翻修,居民小区甚至也可以迁出人口夷平重建,就像是产品或者数据仓库都可以短暂下线升级维护。然而高速公路却很难彻底打断重搭,因为随时都有人要上路。更多时候,它只能一边继续完成输送车辆的任务,一边增设车道或者加盖匝道。就像是一个流数据平台本身,因为不会有一个零流量的时刻,所以所有的维护和升级都需要保证同步在线完成,而且期间最好没有任何用户可感知到的性能弱化或者服务差别。而在云环境下,后者显得更为重要。对于 Kafka 而言,如果一个用户没有一个安全稳定的升级路线的话,那么她就只能停留在最初的那个版本,再不会升级。

因此我们从很早以前开始注意保证在线升级的方便性,在这一次的 2.0.0 版本中,更多相关的属性被加了进来,比如 KIP-268、KIP-279、KIP-283 等等。

KIP-268:简化 Kafka Streams 升级过程

Kafka Streams 利用 Consumer Rebalance 协议里面的元数据字符串编码诸如任务分配、全局查询、版本升级相关的信息。然而,当编码版本本身改变的时候,就需要进行离线升级。比如之前从 0.10.0 版本向更高级的版本升级的时候,用户就需要将所有的 Streams 程序下线,换上新的 Kafka 版本号,然后在全部重启。

KIP-268 利用 version prob 可以使得旧版本的任务分配者告知其他高版本的成员暂时使用旧版本的 Rebalance 元数据编码,这样就可以让用户依然能够通过 rolling bounce 在线升级 Kafka Streams 的版本。而当所有参与的成员全部升级完毕之后,最后一次 rebalance 会自动切换回新版本的元数据编码。

KIP-279:修补多次 Kafka 分区主本迁移时的日志分歧问题

在升级 Kafka 版本或者做定期系统维护的时候,用户往往需要进行连续的多次 Kafka 分区迁移。在这次发布中我们修补了一个在此过程中可能会出现的一个会导致日志分歧发生的边缘情况。具体方案就是将此前版本中已经加入的主本 epoch 信息扩散到 OffsetForLeaderEpochResponse。如此所有主副本就可以清晰知道自己到底处于当前分区备份的哪一个阶段,从而杜绝因为消息不对等而可能导致的日志分歧。

KIP-283:降低信息格式向下转换时的内存消耗

在一个多客户端组群的环境下,客户端与服务器端的版本不匹配是常见现象。早在 0.10.0 版本中,Kafka 已经加入了允许不同版本客户端与服务器交互的功能,即高版本的 Kafka 客户端依然可以与低版本的服务器进行数据传导,反之亦然。然而当低版本的消费者客户端和高版本的服务器进行交互时,服务器有时需要将数据向下转换(format down-conversion)成为低版本客户端可以认知的格式后才能发回给消费者。向下转换有两个缺点:

丢失了 Kafka 数据零拷贝(zero-copy)的性能优势;

向下转换需要额外的大量内存,在极端情况下甚至会导致内存溢出。

前者无法避免,但是后者依然可以改进:在即将发布的 2.0 版本中,我们使用了一种新的基于分块(chunking)的向下转换算法,使得需要同时占据的内存需求大幅缩减。这使得高低版本的客户端与服务器之间的交互变得更加有效。

更多的可监控指标


本文链接地址:https://www.0471seo.com/news/2094.html
  • 上一篇:<<GitHub推出Python安全警告

  • 下一篇:2018 IEEE顶级编程语言交互排行榜发布:Python屠榜>>
  • 如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!