LinkedIn 定制 Kafka,互联网大厂是如何每天处理 7 万亿条消息

Apache Kafka 是 LinkedIn 基础设施的核心组件,最初是作为内部流式处理平台而诞生的,后来被开源出来,并得到了外部的广泛采用。虽然有很多公司和项目在使用 Kafka,但他们的数据规模很少能够达到 LinkedIn 这样。Kafka 被广泛地应用在 LinkedIn 的软件栈中,用于活动追踪、消息交换、指标收集,等等。LinkedIn 有 100 多个 Kafka 集群,其中包含了 4000 多个 broker,总共有 10 万多个 topic 和 700 万个分区。截止到目前,LinkedIn 的 Kafka 集群每天处理的消息数量超过了 7 万亿条。

如此大规模的处理容量不断给 LinkedIn 的 Kafka 生态系统带来伸缩性和运维方面的挑战。为了解决这方面的问题,LinkedIn 定制了一个 Kafka 版本。现在,这个分支也正式开源,并托管在 GitHub 上。这个分支的版本号与 Apache Kafka 的区别是后面加了 -li 后缀。

在这篇文章里,作者将介绍 LinkedIn 定制的 Kafka 版本的更多细节、补丁的开发流程、如何将变更传回上游,并介绍了一些补丁的大概情况和他们如何发布新版本。

LinkedIn 的 Kafka 生态系统

基于 Apache Kafka 的流式处理生态系统是 LinkedIn 技术栈的一个关键组成部分。这个生态系统包含以下这些组件:

  • Kafka 集群;
  • 使用了 Kafka 客户端的应用程序;
  • 为非 Java 客户端提供服务的 REST 代理;
  • 用于维护 Avro schema 的 schema 注册表;
  • 用于镜像集群的 Brooklin
  • 用于维护 Apache Kafka 集群的 Cruise Control
  • 一个叫作“Bean Counter”的管道审计和使用情况监控器。

LinkedIn 的 Kafka 版本分支
正如之前所述,LinkedIn 内部的版本分支用于创建被部署在 LinkedIn 生产环境的 Kafka 版本。每一个版本分支都是从对应的 Apache Kafka 上游分支拉取出来的。毕竟,LinkedIn 并不是要对 Apache Kafka 进行 fork,只是要维护一个尽量与上游保持接近的版本。
因此,LinkedIn 通过两种方式提交补丁。

上游优先

  • 先把补丁提交到上游,如果有必要会创建一个 KIP(Kafka Improvement Proposal);
  • 把补丁加入到当前的 LinkedIn 版本分支,或者在创建一个新分支时加入(在提交到上游之后);
  • 因为先提交到上游再加入 LinkedIn 版本分支会让发布时间变得更长,所以一般适合低优先级或中等优先级的版本。

LinkedIn 优先(也就是紧急修复)

  • 先提交到 LinkedIn 的版本分支;
  • 尝试提交到上游,但需要注意的是,提交到上游有可能因为各种原因不被接受;
  • 因为提交之后可以立即发布 LinkedIn 版本,所以一般适合紧急补丁。

除了自己创建的补丁,有时候 LinkedIn 也需要从上游择优挑选一些补丁。因此,LinkedIn 的版本分支包含了以下几种补丁:

  • Apache Kafka 补丁:提交到上游的补丁;
  • 择优挑选的补丁:提交到上游之后再加入当前发布版本,它们可能是内部提交到上游的,也可能是来自外部的补丁;
  • 紧急修复补丁:先是在内部创建,然后提交到上游;
  • LinkedIn 独有的补丁:不被上游接受的紧急修复补丁,它们可能只在 LinkedIn 内部使用,或者尝试提交到上游但被开源社区拒绝。

换句话说,在过了分支点之后,每个 LinkedIn 的发布版本都会有两种补丁:优选补丁和紧急修复补丁。紧急修复补丁又包含只在 LinkedIn 内部使用和尝试提交到上游的补丁。从下图可以看出,尽管每一个提交补丁都会创建一个内部版本,但发布版本是按需创建的,而且可能包含多个补丁。

开发流程
LinkedIn 的 Kafka 补丁开发流程如下图所示。

这里最关键的地方在于是选择“上游优先”还是“LinkedIn 优先”(也就是图中的“Commit to upstream first?”)。补丁开发者应该根据紧急程度慎重地做出决定。通常,用于解决生产环境问题的补丁先是作为紧急修复补丁,除非可以被快速提交到上游(比如在一周内)。有 KIP 的功能补丁应该先提交到上游。

补丁示例

下面将给出一些有代表性的补丁示例,有些已经提交到上游,有些只在 LinkedIn 内部使用。

伸缩性方面的改进

LinkedIn 内部有一些大集群,单个集群可能包含 140 多 broker 和 1 百万个副本。因为集群规模太大,导致控制器速度变慢,或者因为内存压力导致控制器发生故障。这些问题对生产环境造成了严重影响,还可能导致控制器级联故障。LinkedIn 提供了一些紧急补丁来解决这些问题,例如,使用 UpdateMetadataRequest 对象减少控制器的内存使用,并避免打印过多的日志。

因为单个集群包含的 broker 数量比较多,单个 broker 启动和关闭时间变慢也会导致整个集群的部署延迟严重增加。因此,为了保证 Kafka 集群的可用性,在部署时每次只能关掉一个 broker。为了解决这个部署问题,LinkedIn 提供了一些补丁,用于减少 broker 的启动和关闭时间(例如,通过减少锁竞争来缩短关闭时间)。

运维方面的改进

这些补丁主要用来解决 Kafka 的部署问题。例如,SRE 经常需要移除发生故障的 broker(例如,有些 broker 磁盘坏掉了),并向集群中加入新的 broker。在移除 broker 时需要保持同样水准的数据冗余,以便确保数据不会丢失。SRE 需要先将副本从发生故障的 broker 中移出,但这样做其实是很困难的,因为集群一直在创建新的 topic,新的副本有可能会被分配给发生故障的 broker。为了解决这个问题,LinkedIn 引入了维护模式。一个 broker 在进入维护模式后就不会被分配新的 topic 分区或副本。有了这个特性,就可以很容易地将一个 broker 的所有副本迁移给另一个 broker,然后把发生故障的 broker 完全关闭掉。

直接提交到上游的新特性

最近提交到上游的新特性包括 KIP-219、KIP-380、KIP-291 和 KIP-354。

还有一些在原先的 Apache Kafka 中不存在的新特性:

  • 支持生产和消费计数,用于计费。
  • 在创建 topic 时强制要求设定最小的副本系数,避免因为 broker 发生故障而丢失数据。
  • 新的偏移量重置策略,可以将消费者的消费偏移量设置到最近的一个偏移量。

创建新的版本分支

之前已经介绍了 LinkedIn 的 Kafka 版本分支包含了哪些补丁和特性,接下来将介绍如何创建新的版本分支。首先是从 Apache Kafka 版本分支创建新的分支(例如,从 Apache Kafka 的 2.3.0 分支创建 LinkedIn Kafka 的 2.3.0.x 分支),然后将还未提交到上游的紧急修复从之前的 LinkedIn 版本分支(例如 2.0.0.x)合并到新的分支上。下图显示了这一过程:

在这个过程中会在提交注释里指明一个紧急补丁是否需要被合并到新的分支上。例如,提交注释里可能会包含 Apache Kafka 的 ticket 号,通过这个 ticket 号就可以知道这个补丁是否已经被合并到 Apache Kafka 的分支上了。另外,Apache Kafka 分支上的补丁也会被定期择优合并到当前的 LinkedIn Kafka 分支上。

最后,新的版本分支会有一个验证过程。LinkedIn 使用了一个专门的验证框架,基于真实的生产流量针对新的版本进行各种测试。验证的项目包括再均衡、部署、回退、稳定性和降级。在通过验证之后,就可以发布新版本了。简单地说,LinkedIn 的每一个 Kafka 版本都会经过大规模的性能和正确性测试和验证。

原文地址:https://blog.51cto.com/14528283/2448778

时间: 2024-10-04 08:42:03

LinkedIn 定制 Kafka,互联网大厂是如何每天处理 7 万亿条消息的相关文章

互联网大厂的年终奖vs我们的年终奖,真酸!换个公司还来得及吗?

年终奖这件事,在互联网公司正在成为一种传统,就像不加班都不好意思说是搞互联网的一样. 年终奖其实是一件非常有仪式感的事情:年末拿钱回家过年. 今天,和大家看一下那些互联网行业被大家津津乐道且羡慕嫉妒的年终奖们,同时也期待一下今年的年终奖(嘿嘿嘿 阿里:年终有3-6个月薪资 年底双薪 + 大红包 + 年终奖 + 股权奖励 春节前发放的叫做"13薪",也就是每人至少多发一个月的月薪 真正的年终奖和股权奖励,是在第二年的4月份开始发放. 年终大奖金为3-6个月薪资,90%人可拿到3个月. 阿

深度解析互联网大厂面试难题自定义@EnableXX系列

深度解析互联网大厂面试难题自定义@EnableXX系列 其实是一个@Import的设计技巧 创建注解@EnableXX(任何名称注解都行,只是这个名字好一些) XXConfiguration类不能使用@Component,不然Bean就立即注册了,达不到开关的目的 使用@EnableXX注解的时候,一定是与@Component或者@Configuration进行复合使用,否则开关本身无效,换句话说就是让别的@Component或者@Configuration把自己的@Bean带进去. 实体类 p

Kafka实践:到底该不该把不同类型的消息放在同一个主题中?

Kafka 主题最重要的一个功能是可以让消费者指定它们想要消费的消息子集.在极端情况下,将所有数据放在同一个主题中可能不是一个好主意,因为这样消费者就无法选择它们感兴趣的事件--它们需要消费所有的消息.另一种极端情况,拥有数百万个不同的主题也不是一个好主意,因为 Kafka 的每个主题都是有成本的,拥有大量主题会损害性能. 实际上,从性能的角度来看,分区数量才是关键因素.在 Kafka 中,每个主题至少对应一个分区,如果你有 n 个主题,至少会有 n 个分区.不久之前,Jun Rao 写了一篇博

在互联网大厂实习之后,我明白了这些事

之前作者发了几篇关于找实习的文章,讲述了找实习的那些事.其实,比起找实习,实习过程本身更加有趣.先后在网易和百度实习之后,我明白了很多事情,在这里,分享给各位少侠,与君共勉. 壹 在猪场的短暂时光                             刚出学校大门,我的实习之路才刚刚开始.在网易待了3个月不到,百度待了五个月左右,总共8个月左右的实习时间,说长也长,说短也短,但这两段经历确实也是我人生中宝贵的财富,为我后续参加秋招面试也加分不少. 在猪场实习的日子里,我第一次了解大公司的开发流

2020届软件学院互联网大厂校招面经

长园运泰利: 唉,垃圾的我只配够问几个问题! 1.rabbitmq的几种工作模式是什么 2.什么是委托 3.socket的几种连接方式 4.你了解过多线程编程吗 5.git多人同时提交代码时发生了冲突怎么解决 6.tcp和udp区别 7.c/c++里的回调函数是什么 8.进程之间的通信方式 9.你有了解过跨平台开发吗 10.说下mvc https://wenku.baidu.com/view/0483d5a8050876323112129f.html,这里面有好几道uml的题目. 还有这道uml

移动互联网冲击下,分众传媒年增10亿净利,为什么?

2015年底,分众传媒借壳回归A股,与两年前从纳斯达克退市时相比,江南春的身价一跃飙升至536亿元.在分众传媒的发展史上曾一度展开了多项并购,但其中大部分涉及到移动互联网的并购并不都成功,反而是收购的楼宇业务奠定了分众传媒今天的成功. 2016年6月8日,江南春在新投资的移动互联网项目"蓝莓会APP"上线的活动中,说分众传媒2014年赚了24亿净利.2015年为34亿净利.2016年估计将达44亿到46亿净利.这每年十亿净利增长的背后究竟是什么商业逻辑?江南春表示,这反而是因为移动互联

移动互联网解读:产品经理必须知道的7条准则

如果你是一个APP狂热分子,你会花大量的时间在各种APP的尝鲜中,你会明显感受到一些APP在采用着某种风格鲜明的设计语言,来标榜自己的独特之处,行成自己的设计风格,甚至引领设计风向.去年我们关注到随着Metro设计风格的影响和iOS7的发布,APP明显都开始尝试扁平化的设计语言了,除此之外,还有哪些显性化的设计语言崭露头角呢? 在这篇文章里,我想分享一些日益显性的设计语言,让人一眼就记住它的风格,有一些已经随着优秀设计师的摸索,融入到国内移动产品设计里了,而有一些,确实是刚刚在萌芽阶段,需要更进

Kafka、RabbitMQ、RocketMQ等消息中间件的对比 —— 消息发送性能和区别

Kafka.RabbitMQ.RocketMQ等消息中间件的对比 -- 消息发送性能和区别 那么,消息中间件性能究竟哪家强? 带着这个疑问,我们中间件测试组对常见的三类消息产品(Kafka.RabbitMQ.RocketMQ)做了性能比较. Kafka是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache顶级项目.Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输.0.8版本开始支持复制,不支持事务,对消息的重复.丢失.错误没

Kafka、RabbitMQ、RocketMQ等消息中间件的介绍和对比(转)

前言在分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦.现在开源的消息中间件有很多,前段时间产品 RocketMQ (MetaQ的内核) 也顺利开源,得到大家的关注. 概念MQ简介MQ,Message queue,消息队列,就是指保存消息的一个容器.具体的定义这里就不类似于数据库.缓存等,用来保存数据的.当然,与数据库.缓存等产品比较,也有自己一些特点,具体的特点后文会做详细的介绍.现在常用的MQ组件有ActiveMQ.RabbitMQ.RocketMQ.ZeroMQ.Me