Kafka权威指南(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-13 01:59:50

点击下载

作者:(美)妮哈·纳克海德(Neha Narkhede),格温·沙皮拉(Gwen Shapira),托德·帕利诺(Todd Palino)

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Kafka权威指南

Kafka权威指南试读:

O'Reilly Media, Inc. 介绍

O'Reilly Media 通过图书、杂志、在线服务、调查研究和会议等方式传播创新知识。自 1978 年开始,O'Reilly 一直都是前沿发展的见证者和推动者。超级极客们正在开创着未来,而我们关注真正重要的技术趋势——通过放大那些“细微的信号”来刺激社会对新科技的应用。作为技术社区中活跃的参与者,O'Reilly 的发展充满了对创新的倡导、创造和发扬光大。

O'Reilly 为软件开发人员带来革命性的“动物书”;创建第一个商业网站(GNN);组织了影响深远的开放源代码峰会,以至于开源软件运动以此命名;创立了 Make 杂志,从而成为 DIY 革命的主要先锋;公司一如既往地通过多种形式缔结信息与人的纽带。 O'Reilly 的会议和峰会集聚了众多超级极客和高瞻远瞩的商业领袖,共同描绘出开创新产业的革命性思想。作为技术人士获取信息的选择,O'Reilly 现在还将先锋专家的知识传递给普通的计算机用户。无论是通过图书出版、在线服务或者面授课程,每一项 O'Reilly 的产品都反映了公司不可动摇的理念——信息是激发创新的力量。业界评论“O'Reilly Radar 博客有口皆碑。”——Wired“O'Reilly 凭借一系列(真希望当初我也想到了)非凡想法建立了数百万美元的业务。”——Business 2.0“O'Reilly Conference 是聚集关键思想领袖的绝对典范。”——CRN“一本 O'Reilly 的书就代表一个有用、有前途、需要学习的主题。”——Irish Times“Tim 是位特立独行的商人,他不光放眼于最长远、最广阔的视野,并且切实地按照 Yogi Berra 的建议去做了:‘如果你在路上遇到岔路口,走小路(岔路)。’回顾过去,Tim 似乎每一次都选择了小路,而且有几次都是一闪即逝的机会,尽管大路也不错。”——Linux Journal序

这是一个激动人心的时刻,成千上万的企业在使用 Kafka,三分之一多的世界 500 强公司也在其中。Kafka 是成长最快的开源项目之一,它的生态系统也在蓬勃发展。Kafka 正在成为管理和处理流式数据的利器。

Kafka 从何而来?我们为什么要开发 Kafka ? Kafka 到底是什么?

Kafka 最初是 LinkedIn 的一个内部基础设施系统。我们发现,虽然有很多数据库和系统可以用来存储数据,但在我们的架构里,刚好缺一个可以帮助处理持续数据流的组件。在开发 Kafka 之前,我们实验了各种现成的解决方案,从消息系统到日志聚合系统,再到 ETL 工具,它们都无法满足我们的需求。

最后,我们决定从头开发一个系统。我们不想只是开发一个能够存储数据的系统,比如传统的关系型数据库、键值存储引擎、搜索引擎或缓存系统,我们希望能够把数据看成是持续变化和不断增长的流,并基于这样的想法构建出一个数据系统;事实上,是一个数据架构。

这个想法实现后比我们最初预想的适用性更广。Kafka 一开始被用在社交网络的实时应用和数据流当中,而现在已经成为下一代数据架构的基础。大型零售商正在基于持续数据流改造他们的基础业务流程,汽车公司正在从互联网汽车那里收集和处理实时数据流,银行也在重新思考基于 Kafka 改造他们的基础流程和系统。

那么 Kafka 在这当中充当了怎样的角色?它与现有的系统有什么区别?

我们认为 Kafka 是一个流平台:在这个平台上可以发布和订阅数据流,并把它们保存起来、进行处理,这就是构建 Kafka 的初衷。以这种方式来看待数据确实与人们习惯的想法有所不同,但它确实在构建应用和架构方面表现出了强大的抽象能力。Kafka 经常会被拿来与现有的技术作比较:企业级消息系统、大数据系统(如 Hadoop)和数据集成或 ETL 工具。这里的每一项比较都有一定的道理,但也有失偏颇。

Kafka 有点像消息系统,允许发布和订阅消息流。从这点来看,它类似于 ActiveMQ、 RabbitMQ 或 IBM 的 MQSeries 等产品。尽管看上去有些相似,但 Kafka 与这些传统的消息系统仍然存在很多重要的不同点,这些差异使它完全不同于消息系统。首先,作为一个现代的分布式系统,Kafka 以集群的方式运行,可以自由伸缩,处理公司的所有应用程序。Kafka 集群并不是一组独立运行的 broker,而是一个可以灵活伸缩的中心平台,可以处理整个公司所有的数据流。其次,Kafka 可以按照你的要求存储数据,保存多久都可以。作为数据连接层,Kafka 提供了数据传递保证——可复制、持久化,保留多长时间完全可以由你来决定。最后,流式处理将数据处理的层次提升到了新高度。消息系统只会传递消息,而 Kafka 的流式处理能力让你只用很少的代码就能够动态地处理派生流和数据集。 Kafka 的这些独到之处足以让你刮目相看,它不只是“另一个消息队列”。

从另一个角度来看 Kafka,我们会把它看成实时版的 Hadoop——这也是我们设计和构建 Kafka 的原始动机之一。Hadoop 可以存储和定期处理大量的数据文件,而 Kafka 可以存储和持续处理大型的数据流。从技术角度来看,它们有着惊人的相似之处,很多人将新兴的流式处理看成批处理的超集。它们之间的最大不同体现在持续的低延迟处理和批处理之间的差异上。Hadoop 和大数据主要应用在数据分析上,而 Kafka 因其低延迟的特点更适合用在核心的业务应用上。业务事件时刻在发生,Kafka 能够及时对这些事件作出响应,基于 Kafka 构建的服务直接为业务运营提供支撑,提升用户体验。

Kafka 与 ETL 工具或其他数据集成工具之间也可以进行一番比较。Kafka 和这些工具都擅长移动数据,但我想它们最大的不同在于 Kafka 颠覆了传统的思维。Kafka 并非只是把数据从一个系统拆解出来再塞进另一个系统,它其实是一个面向实时数据流的平台。也就是说,它不仅可以将现有的应用程序和数据系统连接起来,它还能用于加强这些触发相同数据流的应用。我们认为这种以数据流为中心的架构是非常重要的。在某种程度上说,这些数据流是现代数字科技公司的核心,与他们的现金流一样重要。

将上述的三个领域聚合在一起,将所有的数据流整合到一起,流平台因此变得极具吸引力。

当然,除了这些不同点之外,对于那些习惯了开发请求与响应风格应用和关系型数据库的人来说,要学会基于持续数据流构建应用程序也着实是一个巨大的思维转变。借助这本书来学习 Kafka 再好不过了,从内部架构到 API,都是由对 Kafka 最了解的人亲手呈现的。我希望你们能够像我一样喜欢这本书!—— Jay Kreps,Confluent 联合创始人兼 CEO前言

给予一个技术书籍作者最好的赞赏莫过于这句话——“如果在一开始接触这门技术时能看到这本书就好了”。在开始写这本书的时候,我们就是以这句话作为写作目标。我们开发 Kafka,在生产环境运行 Kafka,帮助很多公司构建基于 Kafka 的系统,帮助他们管理数据管道,积累了很多经验,但也困惑:“应该把哪些东西分享给 Kafka 新用户,让他们从新手变成专家?”这本书就是我们日常工作最好的写照:运行 Kafka 并帮助其他人更好地使用 Kafka。

我们相信,书中提供的这些内容能够帮助 Kafka 用户在生产环境运行 Kafka 以及基于 Kafka 构建健壮的高性能应用程序。我们列举了一些非常流行的应用场景:用于事件驱动微服务系统的消息总线、流式应用和大规模数据管道。这本书通俗易懂,能够帮助每一个 Kafka 用户在任意的架构或应用场景里使用好 Kafka。书中介绍了如何安装和配置 Kafka、如何使用 Kafka API、Kafka 的设计原则和可靠性保证,以及 Kafka 的一些架构细节,如复制协议、控制器和存储层。我们相信,Kafka 的设计原理和内部架构不仅会成为分布式系统构建者的兴趣所在,对于那些在生产环境部署 Kafka 或使用 Kafka 构建应用程序的人来说也是非常有用的。越是了解 Kafka,就越是能够更好地作出权衡。

在软件工程里,条条道路通罗马,每一个问题都有多种解决方案。Kafka 为专家级别的用户提供了巨大的灵活性,而新手则需要克服陡峭的学习曲线才能成为专家。Kafka 通常会告诉你如何使用某个功能特性,但不会告诉你为什么要用它或者为什么不该用它。我们会尽可能地解释我们的设计决策和权衡背后的缘由,以及用户在哪些情况下应该或不应该使用 Kafka 提供的特性。读者对象

这本书是为使用 Kafka API 开发应用程序的工程师和在生产环境安装、配置、调优、监控 Kafka 的运维工程师(也可以叫作 SRE、运维人员或系统管理员)而写的。我们也考虑到了数据架构师和数据工程师,他们负责设计和构建整个组织的数据基础架构。某些章节(特别是第 3 章、第 4 章和第 11 章)主要面向 Java 开发人员,并假设读者已经熟悉基本的 Java 语言编程,比如异常处理和并发编程。其他章节(特别是第 2 章、第 8 章、第 9 章和第 10 章)则假设读者在 Linux 的运行、存储和网络配置方面有一定的经验。本书的其余部分则讨论了一般性的软件架构,不要求读者具备特定的知识。

另一类可能对本书感兴趣的人是那些经理或架构师,他们不直接使用 Kafka,但会与使用 Kafka 的工程师打交道。他们有必要了解 Kafka 所能提供的保证机制,以及他们的同事在构建基于 Kafka 的系统时所作出的权衡。这本书可以成为企业管理人员的利器,确保他们的工程师在 Kafka 方面训练有素,让他们的团队了解他们本该知道的知识。排版约定

本书使用了下列排版约定。 该图标表示提示或建议。 该图标表示一般注记。 该图标表示警告或警示。使用代码示例

本书是要帮你完成工作的。一般来说,如果本书提供了示例代码,你可以把它用在你的程序或文档中。除非你使用了很大一部分代码,否则无需联系我们获得许可。比如,用本书的几个代码片段写一个程序就无需获得许可,销售或分发 O'Reilly 图书的示例光盘则需要获得许可;引用本书中的示例代码回答问题无需获得许可,将书中大量的代码放到你的产品文档中则需要获得许可。

我们很希望但并不强制要求你在引用本书内容时加上引用说明。引用说明一般包括书名、作者、出版社和 ISBN。例如“Kafka 权威指南,作者 Neha Narkhede、Gwen Shapira 和 Todd Palino(O'Reilly),版权归 Neha Narkhede、Gwen Shapira 和 Todd Palino 所有,978-1-4919-3616-0”。

如果你觉得自己对示例代码的用法超出了上述许可的范围,欢迎你通过 permissions@ oreilly.com 与我们联系。O'Reilly Safari

Safari(原来叫 Safari Books Online)是面向企业、政府、教育从业者和个人的会员制培训和参考咨询平台。

我们向会员开放成千上万本图书以及培训视频、学习路线、交互式教程和专业视频。这些资源来自 250 多家出版机构,其中包括 O'Reilly Media、Harvard Business Review、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Adobe、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones & Bartlett 和 Course Technology。

更多信息,请访问 http://oreilly.com/safari。致谢

我们想感谢众多为 Kafka 和它的生态系统做出贡献的人。如果没有他们艰辛的工作,就不会有这本书的问世。特别感谢 Jay Kreps、Neha Narkhede 和 Jun Rao,以及他们在 LinkedIn 的同事和领导,他们创造了 Kafka,并把它捐献给了 Apache 软件基金会。

很多人在早前为本书提供了很多有价值的反馈,我们非常感激他们为此付出的时间,也很钦佩他们的专业能力,这些人包括:Apurva Mehta、Arseniy Tashoyan、Dylan Scott、Ewen Cheslack-Postava、Grant Henke、Ismael Juma、James Cheng、Jason Gustafson、Jeff Holoman、Joel Koshy、Jonathan Seidman、Matthias Sax、Michael Noll、Paolo Castagna。我们还想感谢众多在网站上留下评论和反馈的读者。

很多审稿人提供了有价值的意见,极大改进了本书的质量。书中的遗留错误理应由我们作者负责。

我们要感谢 O'Reilly 编辑 Shannon Cutt 的鼓励、耐心和深谋远虑。对于一个作者来说,与 O'Reilly 一起合作是一段非凡的经历——他们所提供的支持,从工具到签名售书,都是无可匹敌的。我们感谢每一个参与本书相关工作的人,很感激他们愿意与我们一起工作。

另外,我们也想感谢我们的领导和同事,感谢他们在我们写作这本书的过程中给予的帮助和鼓励。

Gwen 要感谢她的丈夫 Omer Shapira,在她写书的几个月时间里,他一直给予她支持和耐心。还有她的父亲 Lior Shapira,让她学会了如何在困难面前不轻言放弃,尽管这种生活哲学总是让她麻烦不断。

Todd 要感谢他的妻子 Marcy 和女儿 Bella 及 Kaylee,她们一直在背后默默地支持他。因为有了她们的支持,他才有更多的时间写作,才能厘清思路,坚持到最后。  第1章 站在思想源头的大宗师

数据为企业的发展提供动力。我们从数据中获取信息,对它们进行分析处理,然后生成更多的数据。每个应用程序都会产生数据,包括日志消息、度量指标、用户活动记录、响应消息等。数据的点点滴滴都在暗示一些重要的事情,比如下一步行动的方向。我们把数据从源头移动到可以对它们进行分析处理的地方,然后把得到的结果应用到实际场景中,这样才能够确切地知道这些数据要告诉我们什么。例如,我们每天在 Amazon 网站上浏览感兴趣的商品,浏览信息被转化成商品推荐,并在稍后展示给我们。

这个过程完成得越快,组织的反应就越敏捷。花费越少的精力在数据移动上,就越能专注于核心业务。这就是为什么在一个以数据为驱动的企业里,数据管道会成为关键性组件。如何移动数据,几乎变得与数据本身一样重要。每一次科学家们发生分歧,都是因为掌握的数据不够充

分。所以我们可以先就获取哪一类数据达成一致。只要获取

了数据,问题也就迎刃而解了。要么我是对的,要么你是对

的,要么我们都是错的。然后我们继续研究。——Neil deGrasse Tyson1.1 发布与订阅消息系统

在正式讨论 Apache Kafka(以下简称 Kafka)之前,先来了解发布与订阅消息系统的概念,并认识这个系统的重要性。数据(消息)的发送者(发布者)不会直接把消息发送给接收者,这是发布与订阅消息系统的一个特点。发布者以某种方式对消息进行分类,接收者(订阅者)订阅它们,以便接收特定类型的消息。发布与订阅系统一般会有一个 broker,也就是发布消息的中心点。1.1.1 如何开始

发布与订阅消息系统的大部分应用场景都是从一个简单的消息队列或一个进程间通道开始的。例如,你的应用程序需要往别处发送监控信息,可以直接在你的应用程序和另一个可以在仪表盘上显示度量指标的应用程序之间建立连接,然后通过这个连接推送度量指标,如图 1-1 所示。图 1-1:单个直连的度量指标发布者

这是刚接触监控系统时简单问题的应对方案。过了不久,你需要分析更长时间片段的度量指标,而此时的仪表盘程序满足不了需求,于是,你启动了一个新的服务来接收度量指标。该服务把度量指标保存起来,然后进行分析。与此同时,你修改了原来的应用程序,把度量指标同时发送到两个仪表盘系统上。现在,你又多了 3 个可以生成度量指标的应用程序,它们都与这两个服务直接相连。而你的同事认为最好可以对这些服务进行轮询以便获得告警功能,于是你为每一个应用程序增加了一个服务器,用于提供度量指标。再过一阵子,有更多的应用程序出于各自的目的,都从这些服务器获取度量指标。这时的架构看起来就像图 1-2 所示的那样,节点间的连接一团糟。图 1-2:多个直连的度量指标发布者

这时,技术债务开始凸显出来,于是你决定偿还掉一些。你创建了一个独立的应用程序,用于接收来自其他应用程序的度量指标,并为其他系统提供了一个查询服务器。这样,之前架构的复杂度被降低到图 1-3 所示的那样。那么恭喜你,你已经创建了一个基于发布与订阅的消息系统。图 1-3:度量指标发布与订阅系统1.1.2 独立的队列系统

在你跟度量指标打得不可开交的时候,你的一个同事也正在跟日志消息奋战。还有另一个同事正在跟踪网站用户的行为,为负责机器学习开发的同事提供信息,同时为管理团队生成报告。你和同事们使用相同的方式创建这些系统,解耦信息的发布者和订阅者。图 1-4 所示的架构包含了 3 个独立的发布与订阅系统。图 1-4:多个发布与订阅系统

这种方式比直接使用点对点的连接(图 1-2)要好得多,但这里有太多重复的地方。你的公司因此要为数据队列维护多个系统,每个系统又有各自的缺陷和不足。而且,接下来可能会有更多的场景需要用到消息系统。此时,你真正需要的是一个单一的集中式系统,它可以用来发布通用类型的数据,其规模可以随着公司业务的增长而增长。1.2 Kafka登场

Kafka 就是为了解决上述问题而设计的一款基于发布与订阅的消息系统。它一般被称为“分布式提交日志”或者“分布式流平台”。文件系统或数据库提交日志用来提供所有事务的持久记录,通过重放这些日志可以重建系统的状态。同样地,Kafka 的数据是按照一定顺序持久化保存的,可以按需读取。此外,Kafka 的数据分布在整个系统里,具备数据故障保护和性能伸缩能力。1.2.1 消息和批次

Kafka 的数据单元被称为消息。如果你在使用 Kafka 之前已经有数据库使用经验,那么可以把消息看成是数据库里的一个“数据行”或一条“记录”。消息由字节数组组成,所以对于 Kafka 来说,消息里的数据没有特别的格式或含义。消息可以有一个可选的元数据,也就是键。键也是一个字节数组,与消息一样,对于 Kafka 来说也没有特殊的含义。当消息以一种可控的方式写入不同的分区时,会用到键。最简单的例子就是为键生成一个一致性散列值,然后使用散列值对主题分区数进行取模,为消息选取分区。这样可以保证具有相同键的消息总是被写到相同的分区上。第 3 章将详细介绍键的用法。

为了提高效率,消息被分批次写入 Kafka。批次就是一组消息,这些消息属于同一个主题和分区。如果每一个消息都单独穿行于网络,会导致大量的网络开销,把消息分成批次传输可以减少网络开销。不过,这要在时间延迟和吞吐量之间作出权衡:批次越大,单位时间内处理的消息就越多,单个消息的传输时间就越长。批次数据会被压缩,这样可以提升数据的传输和存储能力,但要做更多的计算处理。1.2.2 模式

对于 Kafka 来说,消息不过是晦涩难懂的字节数组,所以有人建议用一些额外的结构来定义消息内容,让它们更易于理解。根据应用程序的需求,消息模式(schema)有许多可用的选项。像 JSON 和 XML 这些简单的系统,不仅易用,而且可读性好。不过,它们缺乏强类型处理能力,不同版本之间的兼容性也不是很好。Kafka 的许多开发者喜欢使用 Apache Avro,它最初是为 Hadoop 开发的一款序列化框架。Avro 提供了一种紧凑的序列化格式,模式和消息体是分开的,当模式发生变化时,不需要重新生成代码;它还支持强类型和模式进化,其版本既向前兼容,也向后兼容。

数据格式的一致性对于 Kafka 来说很重要,它消除了消息读写操作之间的耦合性。如果读写操作紧密地耦合在一起,消息订阅者需要升级应用程序才能同时处理新旧两种数据格式。在消息订阅者升级了之后,消息发布者才能跟着升级,以便使用新的数据格式。新的应用程序如果需要使用数据,就要与消息发布者发生耦合,导致开发者需要做很多繁杂的工作。定义良好的模式,并把它们存放在公共仓库,可以方便我们理解 Kafka 的消息结构。第 3 章将详细讨论模式和序列化。1.2.3 主题和分区

Kafka 的消息通过主题进行分类。主题就好比数据库的表,或者文件系统里的文件夹。主题可以被分为若干个分区,一个分区就是一个提交日志。消息以追加的方式写入分区,然后以先入先出的顺序读取。要注意,由于一个主题一般包含几个分区,因此无法在整个主题范围内保证消息的顺序,但可以保证消息在单个分区内的顺序。图 1-5 所示的主题有 4 个分区,消息被追加写入每个分区的尾部。Kafka 通过分区来实现数据冗余和伸缩性。分区可以分布在不同的服务器上,也就是说,一个主题可以横跨多个服务器,以此来提供比单个服务器更强大的性能。图 1-5:包含多个分区的主题表示

我们通常会使用流这个词来描述 Kafka 这类系统的数据。很多时候,人们把一个主题的数据看成一个流,不管它有多少个分区。流是一组从生产者移动到消费者的数据。当我们讨论流式处理时,一般都是这样描述消息的。Kafka Streams、Apache Samza 和 Storm 这些框架以实时的方式处理消息,也就是所谓的流式处理。我们可以将流式处理与离线处理进行比较,比如 Hadoop 就是被设计用于在稍后某个时刻处理大量的数据。第 11 章将会介绍流式处理。1.2.4 生产者和消费者

Kafka 的客户端就是 Kafka 系统的用户,它们被分为两种基本类型:生产者和消费者。除此之外,还有其他高级客户端 API——用于数据集成的 Kafka Connect API 和用于流式处理的 Kafka Streams。这些高级客户端 API 使用生产者和消费者作为内部组件,提供了高级的功能。

生产者创建消息。在其他发布与订阅系统中,生产者可能被称为发布者或写入者。一般情况下,一个消息会被发布到一个特定的主题上。生产者在默认情况下把消息均衡地分布到主题的所有分区上,而并不关心特定消息会被写到哪个分区。不过,在某些情况下,生产者会把消息直接写到指定的分区。这通常是通过消息键和分区器来实现的,分区器为键生成一个散列值,并将其映射到指定的分区上。这样可以保证包含同一个键的消息会被写到同一个分区上。生产者也可以使用自定义的分区器,根据不同的业务规则将消息映射到分区。第 3 章将详细介绍生产者。

消费者读取消息。在其他发布与订阅系统中,消费者可能被称为订阅者或读者。消费者订阅一个或多个主题,并按照消息生成的顺序读取它们。消费者通过检查消息的偏移量来区分已经读取过的消息。偏移量是另一种元数据,它是一个不断递增的整数值,在创建消息时,Kafka 会把它添加到消息里。在给定的分区里,每个消息的偏移量都是唯一的。消费者把每个分区最后读取的消息偏移量保存在 Zookeeper 或 Kafka 上,如果消费者关闭或重启,它的读取状态不会丢失。

消费者是消费者群组的一部分,也就是说,会有一个或多个消费者共同读取一个主题。群组保证每个分区只能被一个消费者使用。图 1-6 所示的群组中,有 3 个消费者同时读取一个主题。其中的两个消费者各自读取一个分区,另外一个消费者读取其他两个分区。消费者与分区之间的映射通常被称为消费者对分区的所有权关系。

通过这种方式,消费者可以消费包含大量消息的主题。而且,如果一个消费者失效,群组里的其他消费者可以接管失效消费者的工作。第 4 章将详细介绍消费者和消费者群组。图 1-6:消费者群组从主题读取消息1.2.5 broker和集群

一个独立的 Kafka 服务器被称为 broker。broker 接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘保存。broker 为消费者提供服务,对读取分区的请求作出响应,返回已经提交到磁盘上的消息。根据特定的硬件及其性能特征,单个 broker 可以轻松处理数千个分区以及每秒百万级的消息量。

broker 是集群的组成部分。每个集群都有一个 broker 同时充当了集群控制器的角色(自动从集群的活跃成员中选举出来)。控制器负责管理工作,包括将分区分配给 broker 和监控 broker。在集群中,一个分区从属于一个 broker,该 broker 被称为分区的首领。一个分区可以分配给多个 broker,这个时候会发生分区复制(见图 1-7)。这种复制机制为分区提供了消息冗余,如果有一个 broker 失效,其他 broker 可以接管领导权。不过,相关的消费者和生产者都要重新连接到新的首领。第 6 章将详细介绍集群的操作,包括分区复制。图 1-7:集群里的分区复制

保留消息(在一定期限内)是 Kafka 的一个重要特性。Kafka broker 默认的消息保留策略是这样的:要么保留一段时间(比如 7 天),要么保留到消息达到一定大小的字节数(比如 1GB)。当消息数量达到这些上限时,旧消息就会过期并被删除,所以在任何时刻,可用消息的总量都不会超过配置参数所指定的大小。主题可以配置自己的保留策略,可以将消息保留到不再使用它们为止。例如,用于跟踪用户活动的数据可能需要保留几天,而应用程序的度量指标可能只需要保留几个小时。可以通过配置把主题当作紧凑型日志,只有最后一个带有特定键的消息会被保留下来。这种情况对于变更日志类型的数据来说比较适用,因为人们只关心最后时刻发生的那个变更。1.2.6 多集群

随着 Kafka 部署数量的增加,基于以下几点原因,最好使用多个集群。● 数据类型分离● 安全需求隔离● 多数据中心(灾难恢复)

如果使用多个数据中心,就需要在它们之间复制消息。这样,在线应用程序才可以访问到多个站点的用户活动信息。例如,如果一个用户修改了他们的资料信息,不管从哪个数据中心都应该能看到这些改动。或者多个站点的监控数据可以被聚集到一个部署了分析程序和告警系统的中心位置。不过,Kafka 的消息复制机制只能在单个集群里进行,不能在多个集群之间进行。

Kafka 提供了一个叫作 MirrorMaker 的工具,可以用它来实现集群间的消息复制。MirrorMaker 的核心组件包含了一个生产者和一个消费者,两者之间通过一个队列相连。

消费者从一个集群读取消息,生产者把消息发送到另一个集群上。图 1-8 展示了一个使用 MirrorMaker 的例子,两个“本地”集群的消息被聚集到一个“聚合”集群上,然后将该集群复制到其他数据中心。不过,这种方式在创建复杂的数据管道方面显得有点力不从心。第 7 章将详细讨论这些案例。图 1-8:多数据中心架构1.3 为什么选择Kafka

基于发布与订阅的消息系统那么多,为什么 Kafka 会是一个更好的选择呢?1.3.1 多个生产者

Kafka 可以无缝地支持多个生产者,不管客户端在使用单个主题还是多个主题。所以它很适合用来从多个前端系统收集数据,并以统一的格式对外提供数据。例如,一个包含了多个微服务的网站,可以为页面视图创建一个单独的主题,所有服务都以相同的消息格式向该主题写入数据。消费者应用程序会获得统一的页面视图,而无需协调来自不同生产者的数据流。1.3.2 多个消费者

除了支持多个生产者外,Kafka 也支持多个消费者从一个单独的消息流上读取数据,而且消费者之间互不影响。这与其他队列系统不同,其他队列系统的消息一旦被一个客户端读取,其他客户端就无法再读取它。另外,多个消费者可以组成一个群组,它们共享一个消息流,并保证整个群组对每个给定的消息只处理一次。1.3.3 基于磁盘的数据存储

Kafka 不仅支持多个消费者,还允许消费者非实时地读取消息,这要归功于 Kafka 的数据保留特性。消息被提交到磁盘,根据设置的保留规则进行保存。每个主题可以设置单独的保留规则,以便满足不同消费者的需求,各个主题可以保留不同数量的消息。消费者可能会因为处理速度慢或突发的流量高峰导致无法及时读取消息,而持久化数据可以保证数据不会丢失。消费者可以在进行应用程序维护时离线一小段时间,而无需担心消息丢失或堵塞在生产者端。消费者可以被关闭,但消息会继续保留在 Kafka 里。消费者可以从上次中断的地方继续处理消息。1.3.4 伸缩性

为了能够轻松处理大量数据,Kafka 从一开始就被设计成一个具有灵活伸缩性的系统。用户在开发阶段可以先使用单个 broker,再扩展到包含 3 个 broker 的小型开发集群,然后随着数据量不断增长,部署到生产环境的集群可能包含上百个 broker。对在线集群进行扩展丝毫不影响整体系统的可用性。也就是说,一个包含多个 broker 的集群,即使个别 broker 失效,仍然可以持续地为客户提供服务。要提高集群的容错能力,需要配置较高的复制系数。第 6 章将讨论关于复制的更多细节。1.3.5 高性能

上面提到的所有特性,让 Kafka 成为了一个高性能的发布与订阅消息系统。通过横向扩展生产者、消费者和 broker,Kafka 可以轻松处理巨大的消息流。在处理大量数据的同时,它还能保证亚秒级的消息延迟。1.4 数据生态系统

已经有很多应用程序加入到了数据处理的大军中。我们定义了输入和应用程序,负责生成数据或者把数据引入系统。我们定义了输出,它们可以是度量指标、报告或者其他类型的数据。我们创建了一些循环,使用一些组件从系统读取数据,对读取的数据进行处理,然后把它们导到数据基础设施上,以备不时之需。数据类型可以多种多样,每一种数据类型可以有不同的内容、大小和用途。

Kafka 为数据生态系统带来了循环系统,如图 1-9 所示。它在基础设施的各个组件之间传递消息,为所有客户端提供一致的接口。当与提供消息模式的系统集成时,生产者和消费者之间不再有紧密的耦合,也不需要在它们之间建立任何类型的直连。我们可以根据业务需要添加或移除组件,因为生产者不再关心谁在使用数据,也不关心有多少个消费者。图 1-9:大数据生态系统使用场景1. 活动跟踪Kafka 最初的使用场景是跟踪用户的活动。网站用户与前端

应用程序发生交互,前端应用程序生成用户活动相关的消息。这

些消息可以是一些静态的信息,比如页面访问次数和点击量,也

可以是一些复杂的操作,比如添加用户资料。这些消息被发布到

一个或多个主题上,由后端应用程序负责读取。这样,我们就可

以生成报告,为机器学习系统提供数据,更新搜索结果,或者实

现其他更多的功能。2. 传递消息Kafka 的另一个基本用途是传递消息。应用程序向用户发送

通知(比如邮件)就是通过传递消息来实现的。这些应用程序组

件可以生成消息,而不需要关心消息的格式,也不需要关心消息

是如何被发送的。一个公共应用程序会读取这些消息,对它们进

行处理:● 格式化消息(也就是所谓的装饰);● 将多个消息放在同一个通知里发送;● 根据用户配置的首选项来发送数据。使用公共组件的好处在于,不需要在多个应用程序上开发重

复的功能,而且可以在公共组件上做一些有趣的转换,比如把多

个消息聚合成一个单独的通知,而这些工作是无法在其他地方完

成的。3. 度量指标和日志记录Kafka 也可以用于收集应用程序和系统度量指标以及日志。

Kafka 支持多个生产者的特性在这个时候就可以派上用场。应用

程序定期把度量指标发布到 Kafka 主题上,监控系统或告警系统

读取这些消息。Kafka 也可以用在像 Hadoop 这样的离线系统上,

进行较长时间片段的数据分析,比如年度增长走势预测。日志消

息也可以被发布到 Kafka 主题上,然后被路由到专门的日志搜索

系统(比如 Elasticsearch)或安全分析应用程序。更改目标系统(比如日志存储系统)不会影响到前端应用或聚合方法,这是

Kafka 的另一个优点。4. 提交日志Kafka 的基本概念来源于提交日志,所以使用 Kafka 作为提

交日志是件顺理成章的事。我们可以把数据库的更新发布到

Kafka 上,应用程序通过监控事件流来接收数据库的实时更新。

这种变更日志流也可以用于把数据库的更新复制到远程系统上,

或者合并多个应用程序的更新到一个单独的数据库视图上。数据

持久化为变更日志提供了缓冲区,也就是说,如果消费者应用程

序发生故障,可以通过重放这些日志来恢复系统状态。另外,紧

凑型日志主题只为每个键保留一个变更数据,所以可以长时间使

用,不需要担心消息过期问题。5. 流处理流处理是又一个能提供多种类型应用程序的领域。可以说,

它们提供的功能与 Hadoop 里的 map 和 reduce 有点类似,只不

过它们操作的是实时数据流,而 Hadoop 则处理更长时间片段的

数据,可能是几个小时或者几天,Hadoop 会对这些数据进行批

处理。通过使用流式处理框架,用户可以编写小型应用程序来操

作 Kafka 消息,比如计算度量指标,为其他应用程序有效地处理

消息分区,或者对来自多个数据源的消息进行转换。第 11 章将

通过其他案例介绍流处理。1.5 起源故事

Kafka 是为了解决 LinkedIn 数据管道问题应运而生的。它的设计目的是提供一个高性能的消息系统,可以处理多种数据类型,并能够实时提供纯净且结构化的用户活动数据和系统度量指标。数据为我们所做的每一件事提供了动力。——Jeff Weiner,LinkedIn CEO1.5.1 LinkedIn的问题

本章开头提到过,LinkedIn 有一个数据收集系统和应用程序指标,它使用自定义的收集器和一些开源工具来保存和展示内部数据。除了跟踪 CPU 使用率和应用性能这些一般性指标外,LinkedIn 还有一个比较复杂的用户请求跟踪功能。它使用了监控系统,可以跟踪单个用户的请求是如何在内部应用间传播的。不过监控系统存在很多不足。它使用的是轮询拉取度量指标的方式,指标之间的时间间隔较长,而且没有自助服务能力。它使用起来不太方便,很多简单的任务需要人工介入才能完成,而且一致性较差,同一个度量指标的名字在不同系统里的叫法不一样。

与此同时,我们还创建了另一个用于收集用户活动信息的系统。这是一个 HTTP 服务,前端的服务器会定期连接进来,在上面发布一些消息(XML 格式)。这些消息文件被转移到线下进行解析和校对。同样,这个系统也存在很多不足。XML 文件的格式无法保持一致,而且解析 XML 文件非常耗费计算资源。要想更改所创建的活动类型,需要在前端应用和离线处理程序之间做大量的协调工作。即使是这样,在更改数据结构时,仍然经常出现系统崩溃现象。而且批处理时间以小时计算,无法用它完成实时的任务。

监控和用户活动跟踪无法使用同一个后端服务。监控服务太过笨重,数据格式不适用于活动跟踪,而且无法在活动跟踪中使用轮询拉取模型。另一方面,把跟踪服务用在度量指标上也过于脆弱,批处理模型不适用于实时的监控和告警。不过,好在数据间存在很多共性,信息(比如特定类型的用户活动对应用程序性能的影响)之间的关联度还是很高的。特定类型用户活动数量的下降说明相关应用程序存在问题,不过批处理的长时间延迟意味着无法对这类问题作出及时的反馈。

最开始,我们调研了一些现成的开源解决方案,希望能够找到一个系统,可以实时访问数据,并通过横向扩展来处理大量的消息。我们使用 ActiveMQ 创建了一个原型系统,但它当时还无法满足横向扩展的需求。LinkedIn 不得不使用这种脆弱的解决方案,虽然 ActiveMQ 有很多缺陷会导致 broker 暂停服务。客户端的连接因此被阻塞,处理用户请求的能力也受到影响。于是我们最后决定构建自己的基础设施。1.5.2 Kafka的诞生

LinkedIn 的开发团队由 Jay Kreps 领导。Jay Kreps 是 LinkedIn 的首席工程师,之前负责分布式键值存储系统 Voldemort 的开发。初建团队成员还包括 Neha Narkhede,不久之后, Jun Rao 也加入了进来。他们一起着手创建一个消息系统,可以同时满足上述的两种需求,并且可以在未来进行横向扩展。他们的主要目标如下:● 使用推送和拉取模型解耦生产者和消费者;● 为消息传递系统中的消息提供数据持久化,以便支持多个消费

者;● 通过系统优化实现高吞吐量;● 系统可以随着数据流的增长进行横向扩展。

最后我们看到的这个发布与订阅消息系统具有典型的消息系统接口,但从存储层来看,它更像是一个日志聚合系统。Kafka 使用 Avro 作为消息序列化框架,每天高效地处理数十亿级别的度量指标和用户活动跟踪信息。LinkedIn 已经拥有超过万亿级别的消息使用量(截止到 2015 年 8 月),而且每天仍然需要处理超过千万亿字节的数据。1.5.3 走向开源

2010 年底,Kafka 作为开源项目在 GitHub 上发布。2011 年 7 月,因为倍受开源社区的关注,它成为 Apache 软件基金会的孵化器项目。2012 年 10 月,Kafka 从孵化器项目毕业。从那时起,来自 LinkedIn 内部的开发团队一直为 Kafka 提供大力支持,而且吸引了大批来自 LinkedIn 外部的贡献者和参与者。现在,Kafka 被很多组织用在一些大型的数据管道上。2014 年秋天,Jay Kreps、Neha Narkhede 和 Jun Rao 离开 LinkedIn,创办了 Confluent。 Confluent 是一个致力于为企业开发提供支持、为 Kafka 提供培训的公司。这两家公司连同来自开源社区持续增长的贡献力量,一直在开发和维护 Kafka,让 Kafka 成为大数据管道的不二之选。1.5.4 命名

关于 Kafka 的历史,人们经常会问到的一个问题就是,Kafka 这个名字是怎么想出来的,以及这个名字和这个项目之间有着怎样的联系。对于这个问题,Jay Kreps 解释如下:我想既然 Kafka 是为了写数据而产生的,那么用作家的

名字来命名会显得更有意义。我在大学时期上过很多文学课

程,很喜欢 Franz Kafka。况且,对于开源项目来说,这个

名字听起来很酷。因此,名字和应用本身基本没有太多联系。1.6 开始Kafka之旅

现在我们对 Kafka 已经有了一个大体的了解,还知道了一些常见的术语,接下来可以开始使用 Kafka 来创建数据管道了。在下一章,我们将探究如何安装和配置 Kafka,还会讨论如何选择合适的硬件来运行 Kafka,以及把 Kafka 应用到生产环境需要注意的事项。  第2章 安装 Kafka

这一章将介绍如何安装和运行 Kafka,包括如何设置 Zookeeper(Kafka 使用 Zookeeper 保存 Broker 的元数据),还会介绍 Kafka 的基本配置,以及如何为 Kafka 选择合适的硬件,最后介绍如何在一个集群中安装多个 Kafka broker,以及把 Kafka 应用到生产环境需要注意的事项。2.1 要事先行

在使用 Kafka 之前需要先做一些事情,接下来介绍怎样做。2.1.1 选择操作系统

Kafka 是使用 Java 开发的应用程序,所以它可以运行在 Windows、MacOS 和 Linux 等多种操作系统上。本章将着重介绍如何在 Linux 上安装和使用 Kafka,因为把 Kafka 安装在 Linux 系统上是最为常见的。即使只是把 Kafka 作为一般性用途,仍然推荐使用 Linux 系统。关于如何在 Windows 和 MacOS 上安装 Kafka,请参考附录 A。2.1.2 安装Java

在安装 Zookeeper 和 Kafka 之前,需要先安装 Java 环境。这里推荐安装 Java 8,可以使用系统自带的安装包,也可以直接从 java.com 网站下载。虽然运行 Zookeeper 和 Kafka 只需要 Java 运行时版本,但也可以安装完整的 JDK,以备不时之需。假设 JDK 8 update 51 已经安装在 /usr/java/jdk1.8.0_51 目录下,其他软件的安装都是基于这个前提进行的。2.1.3 安装Zookeeper

Kafka 使用 Zookeeper 保存集群的元数据信息和消费者信息。Kafka 发行版自带了 Zookeeper,可以直接从脚本启动,不过安装一个完整版的 Zookeeper 也并不费劲。图 2-1:Kafka 和 Zookeeper

Zookeeper 的 3.4.6 稳定版已经在 Kafka 上做过全面测试,可以从 apache.org 下载该版本的 Zookeeper:http://bit.ly/2sDWSgJ。1. 单机服务下面的例子演示了如何使用基本的配置安装 Zookeeper,安

装目录为 /usr/local/zookeeper,数据目录为 /var/lib/zookeeper。

# tar -zxf zookeeper-3.4.6.tar.gz

# mv zookeeper-3.4.6 /usr/local/zookeeper

# mkdir -p /var/lib/zookeeper

# cat > /usr/local/zookeeper/conf/zoo.cfg << EOF

> tickTime=2000

> dataDir=/var/lib/zookeeper

> clientPort=2181

> EOF

# export JAVA_HOME=/usr/java/jdk1.8.0_51

# /usr/local/zookeeper/bin/zkServer.sh start

JMX enabled by default

Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg

Starting zookeeper ... STARTED

#现在可以连到 Zookeeper 端口上,通过发送四字命令 srvr

来验证 Zookeeper 是否安装正确。

# telnet localhost 2181

Trying ::1...

Connected to localhost.

Escape character is '^]'.

srvr

Zookeeper version: 3.4.6-1569965, built on 02/20/2014 09:09

GMT

Latency min/avg/max: 0/0/0

Received: 1

Sent: 0

Connections: 1

Outstanding: 0

Zxid: 0x0

Mode: standalone

Node count: 4

Connection closed by foreign host.

#2. Zookeeper 群组(Ensemble)Zookeeper 集群被称为群组。Zookeeper 使用的是一致性协

议,所以建议每个群组里应该包含奇数个节点(比如 3 个、5 个

等),因为只有当群组里的大多数节点(也就是法定人数)处于

可用状态,Zookeeper 才能处理外部的请求。也就是说,如果你

有一个包含 3 个节点的群组,那么它允许一个节点失效。如果

群组包含 5 个节点,那么它允许 2 个节点失效。 群组节点个数的选择假设有一个包含 5 个节点的群组,如果要对群组做一些包括更换节点在内的配置更改,需要依次重启每一个节点。如果你的群组无法容忍多个节点失效,那么在进行群组维护时就会存在风险。不过,也不建议一个群组包含超过 7 个节点,因为 Zookeeper 使用了一致性协议,节点过多会降低整个群组的性能。群组需要有一些公共配置,上面列出了所有服务器的清单,

并且每个服务器还要在数据目录中创建一个 myid 文件,用于指

明自己的 ID。如果群组里服务器的机器名是

zoo1.example.com、zoo2.example.com、zoo3.example.com,那

么配置文件可能是这样的:

tickTime=2000

dataDir=/var/lib/zookeeper

clientPort=2181

initLimit=20

syncLimit=5

server.1=zoo1.example.com:2888:3888

server.2=zoo2.example.com:2888:3888

server.3=zoo3.example.com:2888:3888在这个配置中,initLimit 表示用于在从节点与主节点之间建

立初始化连接的时间上限,syncLimit 表示允许从节点与主节点

处于不同步状态的时间上限。这两个值都是 tickTime 的倍数,

所以 initLimit 是 20*2000ms,也就是 40s。配置里还列出了群组

中所有服务器的地址。服务器地址遵循

server.X=hostname:peerPort:leaderPort 格式,各个参数说明如

下:X  服务器的 ID,它必须是一个整数,不过不一定要从 0

开始,也不要求是连续的;hostname  服务器的机器名或 IP 地址;peerPort  用于节点间通信的 TCP 端口;leaderPort  用于首领选举的 TCP 端口。客户端只需要通过 clientPort 就能连接到群组,而群组节点

间的通信则需要同时用到这 3 个端口(peerPort、leaderPort、

clientPort)。除了公共的配置文件外,每个服务器都必须在 data Dir 目录

中创建一个叫作 myid 的文件,文件里要包含服务器 ID,这个

ID 要与配置文件里配置的 ID 保持一致。完成这些步骤后,就可

以启动服务器,让它们彼此间进行通信了。2.2 安装Kafka Broker

配置好 Java 和 Zookeeper 之后,接下来就可以安装 Kafka 了。可以从 http://kafka.apache.org/downloads.html 下载最新版本的 Kafka。截至本书写作时,Kafka 的版本是 0.9.0.1,对应的 Scala 版本是 2.11.0。

下面的例子将 Kafka 安装在 /usr/local/kafka 目录下,使用之前配置好的 Zookeeper,并把消息日志保存在 /tmp/kafka-logs 目录下。# tar -zxf kafka_2.11-0.9.0.1.tgz# mv kafka_2.11-0.9.0.1 /usr/local/kafka# mkdir /tmp/kafka-logs# export JAVA_HOME=/usr/java/jdk1.8.0_51# /usr/local/kafka/bin/kafka-server-start.sh -daemon/usr/local/kafka/config/server.properties#

一旦 Kafka 创建完毕,就可以对这个集群做一些简单的操作来验证它是否安装正确,比如创建一个测试主题,发布一些消息,然后读取它们。

创建并验证主题:# /usr/local/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181--replication-factor 1 --partitions 1 --topic testCreated topic "test".# /usr/local/kafka/bin/kafka-topics.sh --zookeeper localhost:2181--describe --topic testTopic:test PartitionCount:1 ReplicationFactor:1 Configs: Topic: test Partition: 0 Leader: 0 Replicas: 0 Isr: 0#

往测试主题上发布消息:# /usr/local/kafka/bin/kafka-console-producer.sh --broker-list

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载