猜你喜欢
Apache Kafka实战

Apache Kafka实战

书籍作者:胡夕 ISBN:9787121337765
书籍语言:简体中文 连载状态:全集
电子书格式:pdf,txt,epub,mobi,azw3 下载次数:3688
创建日期:2021-02-14 发布日期:2021-02-14
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板
内容简介

本书是涵盖Apache Kafka各方面的具有实践指导意义的工具书和参考书。作者结合典型的使用场景,对Kafka整个技术体系进行了较为全面的讲解,以便读者能够举一反三,直接应用于实践。同时,本书还对Kafka的设计原理及其流式处理组件进行了较深入的探讨,并给出了翔实的案例。

本书共分为10章:第1章全面介绍消息引擎系统以及Kafka的基本概念与特性,快速带领读者走进Kafka的世界;第2章简要回顾了Apache Kafka的发展历史;第3章详细介绍了Kafka集群环境的搭建;第4、5章深入探讨了Kafka客户端的使用方法;第6章带领读者一览Kafka内部设计原理;第7~9章以实例的方式讲解了Kafka集群的管理、监控与调优;第10章介绍了Kafka新引入的流式处理组件。


作者简介

胡夕,北航计算机硕士毕业,目前就职于一家互联网金融公司,开源技术爱好者。曾任职于IBM、搜狗、微博等公司。对Kafka及其他开源流处理技术与框架有深刻认识,同时也是国内活跃的Kafka代码贡献者。对Kafka原理、运行机制以及应用开发都有较深的研究。

编辑推荐
适读人群 :本书适合所有对云计算、大数据处理感兴趣的技术人员阅读,尤其适合对消息引擎、流式处理技术及框架感兴趣的技术人员参考阅读。

业内专家王国璋、付稳、王迪、杨金峰联袂力荐。

基于Apache Kafka 1.0.0版本进行介绍,Kafka Contributor执笔。

从Kafka基本概念与特性开始,详细介绍了Kafka的部署、开发、运营、监控、调试、优化以及重要组件的设计原理,并给出了翔实的案例。

本书既适合作为Kafka的入门书籍,也适合系统架构师和一线开发工程师参考阅读。


前言

前言

2011年年初,美国领英公司(LinkedIn)开源了一款基础架构软件,以奥地利作家弗兰兹?卡夫卡(Franz Kafka)的名字命名,之后LinkedIn将其贡献给Apache基金会,随后该软件于2012年10月成功完成孵化并顺利晋升为Apache顶级项目——这便是大名鼎鼎的Apache Kafka。历经7年发展,2017年11月,Apache Kafka正式演进到1.0时代,本书就是基于1.0.0版本来展开介绍Kafka的设计原理与实战的。

背景

这是一个最好的大数据时代,这是一个最坏的大数据时代!

很抱歉,我使用了这句改编后的狄更斯名言作为开头,我想没有谁会质疑“当今是大数据时代”这个论点。今年(2018年)两会上李克强总理所做的政府工作报告中多次提及大数据等关键词,这已然是“大数据”第5次被写入政府工作报告了。具体到大数据行业内,各种各样的大数据产业方兴未艾,其中在实时流式处理领域涌现出大量的技术与框架,令技术人员们应接不暇。实时流式处理系统在克服了传统批处理系统延时方面的固有缺陷的同时,还摆脱了设计上的桎梏,实现了“梦寐以求”的正确性。可以说,对于流式处理从业人员来说,这正是摩拳擦掌、大展宏图的最好时代。

与此同时,我们也清醒地意识到当今大数据领域内的细分越来越精细化。不必说日渐火爆的人工智能和机器学习潮流引诱着我们改弦易辙,也不必说那些纷繁复杂的技术框架令人眼花缭乱,单是静下心来沉淀所学、思考方向的片刻时光于我们这些从业者来说都已显得弥足珍贵。我们仿佛在黑暗密林中徘徊,试图找出那条通往光明的“康庄大道”。每当发现了一条羊肠小路都好似救命稻草一般紧紧抓住。多年后我们回望那只不过是不断追逐热点罢了,在技术的海洋中我们迷失了前进的方向。从这个意义上说,这实在是一个糟糕的时代。

时光切回到4年前的某个下午,那时我正在做着Kafka的大数据项目。我突然发现与其盲目跟风各种技术趋势,何不精进手头的工作,把当前工作中用到的技术搞明白,于是我萌发了研究Kafka的想法。直到今天,我都无比庆幸那个午后做出的冲动决定,正如Adam Grant在《离经叛道》一书中所说:最正确的决定都是在冲动之下做出的。诚不欺我!

想要深入学习Kafka,不掌握Scala语言是不行的,毕竟Kafka就是使用Scala语言编写的。苦于当时没有合适的Scala中文书籍,我依稀记得找到了一本600多页的Scala原版书(Programming Scala Edition 2)进行学习。那段时间实在是难熬!不得不说,英文版书籍虽然内容翔实,但在表述上实在晦涩难懂,比如partially applied function和partial function两者的区别直至今天我都不是特别清晰,还是要不断地翻阅资料才能隐约记得它们之间的不同。庆幸的是,我没有半途而废,600多页的英文文档硬是啃了下来。对于Scala的初步掌握也让我觉得研究Kafka的时机到了。有意思的是,在之后通读Kafka的源码时我不禁大呼上当,Kafka的源码中只使用了最简单的函数式编程,我有些后悔自己花了那么多时间去学习Scala的函数式编程,当然这是后话。

既然是研究Kafka,那么研读源码是必不可少的步骤。如果不分析源码,我们就无法定位问题发生的根本原因。实话实说,阅读别人源码的过程是痛苦的,因而在理解的过程中我走了不少弯路。为了记录阅读Kafka源码的心得,我努力为每个Kafka源码包撰写博客。现在翻看我之前的博客,大家还能看到那好似流水账一般的Kafka源码分析系列文章。

随着对源码的不断熟悉,我加入了Apache Kafka社区,希望贡献自己的微薄之力。时至今日,我依然记得当初发送邮件要求加入开发组时的惶恐,也记得第一次贡献代码时的惴惴不安;我记得为了研究某个Kafka bug,自己曾忘记吃中饭的执着,也记得自己被标记为“Kafka contributor”时的喜悦。在混迹社区的日子里,我逐渐认识了一些Kafka的committer们,比如Kafka PMC成员王国璋,国璋兄对于网上Kafka问题的权威解答令我受教良多,同时我也很感激他于百忙之中为本书写推荐语。还有Kafka的三位原作者之一的饶军(Rao Jun),几次问题交流让我看到了他霸气的决断能力以及对于疑难问题原因的毒辣分析。当然还有非常敬业的Ijuma,他是我见过的最勤劳的Kafka committer,没有之一。在编写本书的过程中,我都或多或少地得到过他们的帮助,再次表示衷心感谢。

由于对Kafka研究的日益深入,我终于有了写书的冲动。我希望通过把学到的知识和原理集中整理并书写成文字来帮助那些尚未接触Kafka的广大读者快速上手,降低他们学习使用Kafka的成本,于是有了今天这本《Apache Kafka实战》。借着写作本书的契机,我本人对Kafka的方方面面做了梳理,自觉收获良多。每当搞懂了一个以前未了解的机制时,心中的那种满足感和兴奋感至今都令人神往。在此,我深深地希望读者在阅读完本书后也能有这样的体会。

面向的读者

我衷心希望本书可以成为各行各业的大数据从业者使用消息队列甚至是进入流式处理领域内的“敲门砖”,也希望各大公司能够充分利用Kafka来实现自己的业务目标。

在编写本书的过程中,我阅读了大量的英文资料和源代码,试图通过自己的理解将Kafka的使用实战技巧深入浅出地呈现给广大读者。没错,我希望这本书给人的感觉是通俗易懂、深入浅出,从而方便引领读者快速进入Kafka学习的大门。

我本人维护了一个微信公众号(名为“大数据Kafka技术分享”),希望在该公众号中我能和读者朋友们一起深入交流和探讨Kafka学习过程中碰到的各种问题,同时我也会及时分享和推送各种最新的Kafka使用心得。

致谢

非常感谢Kafka PMC成员、Kafka Committer王国璋对本书的大力支持。自开始编写本书之日起,国璋兄就给予我很大的鼓励与帮助,这也让我坚定了传播Kafka实战心得的决心。

感谢腾讯AI平台助理总经理王迪先生和我的好友贾兴华,你们对本书的评价之高实在是过誉了,但也令本人倍感振奋。

感谢我的前同事、新浪微博技术专家付稳。付总对本书整体结构和具体知识点的建议发人深省,其独到的行业见解令人佩服。

非常感谢电子工业出版社的编辑付睿女士。她细致、专业、严谨的工作作风深深地感染了我,在本书编写过程中她总是能及时地就书中的内容给出合理的建议和指导。

另外,我还想感谢一下我的家人,特别是我的妻子刘丹女士。过去一年中正是你坚定的支持和默默的付出才成就我撰写本书。对于你偶尔在学术上给予的提点我既感到惊讶,同时也欣慰不已。这为我漫长枯燥的写书过程平添了很多温暖。

最后,非常感谢本书的每一位读者。本人已经在写作过程中收获良多,我衷心希望你们在阅读本书时也有大呼过瘾的感觉。另外,我在“知乎”(ID:huxihx)的Kafka专栏以及StackOverflow网站上也会尽力回答关于Kafka的各类问题,希望通过这些途径可以和读者进行更加深入的交流。

由于本人水平有限,书中难免有遗漏和疏忽,也恳请各位读者多多指正。


胡夕

2018年3月15日于北京

个人博客:https://www.cnblogs.com/huxi2b/

微信公众号:大数据Kafka技术分享

电子邮箱:[email protected]


目录

目录

第1章 认识Apache Kafka 1

1.1 Kafka快速入门 1

1.1.1 下载并解压缩Kafka二进制代码压缩包文件 2

1.1.2 启动服务器 3

1.1.3 创建topic 3

1.1.4 发送消息 4

1.1.5 消费消息 4

1.2 消息引擎系统 5

1.2.1 消息设计 6

1.2.2 传输协议设计 6

1.2.3 消息引擎范型 6

1.2.4 Java消息服务 8

1.3 Kafka概要设计 8

1.3.1 吞吐量/延时 8

1.3.2 消息持久化 11

1.3.3 负载均衡和故障转移 12

1.3.4 伸缩性 13

1.4 Kafka基本概念与术语 13

1.4.1 消息 14

1.4.2 topic和partition 16

1.4.3 offset 17

1.4.4 replica 18

1.4.5 leader和follower 18

1.4.6 ISR 19

1.5 Kafka使用场景 20

1.5.1 消息传输 20

1.5.2 网站行为日志追踪 20

1.5.3 审计数据收集 20

1.5.4 日志收集 20

1.5.5 Event Sourcing 21

1.5.6 流式处理 21

1.6 本章小结 21

第2章 Kafka发展历史 22

2.1 Kafka的历史 22

2.1.1 背景 22

2.1.2 Kafka横空出世 23

2.1.3 Kafka开源 24

2.2 Kafka版本变迁 25

2.2.1 Kafka的版本演进 25

2.2.2 Kafka的版本格式 26

2.2.3 新版本功能简介 26

2.2.4 旧版本功能简介 31

2.3 如何选择Kafka版本 35

2.3.1 根据功能场景 35

2.3.2 根据客户端使用场景 35

2.4 Kafka与Confluent 36

2.5 本章小结 37

第3章 Kafka线上环境部署 38

3.1 集群环境规划 38

3.1.1 操作系统的选型 38

3.1.2 磁盘规划 40

3.1.3 磁盘容量规划 42

3.1.4 内存规划 43

3.1.5 CPU规划 43

3.1.6 带宽规划 44

3.1.7 典型线上环境配置 45

3.2 伪分布式环境安装 45

3.2.1 安装Java 46

3.2.2 安装ZooKeeper 47

3.2.3 安装单节点Kafka集群 48

3.3 多节点环境安装 49

3.3.1 安装多节点ZooKeeper集群 50

3.3.2 安装多节点Kafka 54

3.4 验证部署 55

3.4.1 测试topic创建与删除 55

3.4.2 测试消息发送与消费 57

3.4.3 生产者吞吐量测试 58

3.4.4 消费者吞吐量测试 58

3.5 参数设置 59

3.5.1 broker端参数 59

3.5.2 topic级别参数 62

3.5.3 GC参数 63

3.5.4 JVM参数 64

3.5.5 OS参数 64

3.6 本章小结 65

第4章 producer开发 66

4.1 producer概览 66

4.2 构造producer 69

4.2.1 producer程序实例 69

4.2.2 producer主要参数 75

4.3 消息分区机制 80

4.3.1 分区策略 80

4.3.2 自定义分区机制 80

4.4 消息序列化 83

4.4.1 默认序列化 83

4.4.2 自定义序列化 84

4.5 producer拦截器 87

4.6 无消息丢失配置 90

4.6.1 producer端配置 91

4.6.2 broker端配置 92

4.7 消息压缩 92

4.7.1 Kafka支持的压缩算法 93

4.7.2 算法性能比较与调优 93

4.8 多线程处理 95

4.9 旧版本producer 96

4.10 本章小结 98

第5章 consumer开发 99

5.1 consumer概览 99

5.1.1 消费者(consumer) 99

5.1.2 消费者组(consumer group) 101

5.1.3 位移(offset) 102

5.1.4 位移提交 103

5.1.5 __consumer_offsets 104

5.1.6 消费者组重平衡(consumer group rebalance) 106

5.2 构建consumer 106

5.2.1 consumer程序实例 106

5.2.2 consumer脚本命令 111

5.2.3 consumer主要参数 112

5.3 订阅topic 115

5.3.1 订阅topic列表 115

5.3.2 基于正则表达式订阅topic 115

5.4 消息轮询 115

5.4.1 poll内部原理 115

5.4.2 poll使用方法 116

5.5 位移管理 118

5.5.1 consumer位移 119

5.5.2 新版本consumer位移管理 120

5.5.3 自动提交与手动提交 121

5.5.4 旧版本consumer位移管理 123

5.6 重平衡(rebalance) 123

5.6.1 rebalance概览 123

5.6.2 rebalance触发条件 124

5.6.3 rebalance分区分配 124

5.6.4 rebalance generation 126

5.6.5 rebalance协议 126

5.6.6 rebalance流程 127

5.6.7 rebalance监听器 128

5.7 解序列化 130

5.7.1 默认解序列化器 130

5.7.2 自定义解序列化器 131

5.8 多线程消费实例 132

5.8.1 每个线程维护一个KafkaConsumer 133

5.8.2 单KafkaConsumer实例+多worker线程 135

5.8.3 两种方法对比 140

5.9 独立consumer 141

5.10 旧版本consumer 142

5.10.1 概览 142

5.10.2 high-level consumer 143

5.10.3 low-level consumer 147

5.11 本章小结 153

第6章 Kafka设计原理 154

6.1 broker端设计架构 154

6.1.1 消息设计 155

6.1.2 集群管理 166

6.1.3 副本与ISR设计 169

6.1.4 水印(watermark)和leader epoch 174

6.1.5 日志存储设计 185

6.1.6 通信协议(wire protocol) 194

6.1.7 controller设计 205

6.1.8 broker请求处理 216

6.2 producer端设计 219

6.2.1 producer端基本数据结构 219

6.2.2 工作流程 220

6.3 consumer端设计 223

6.3.1 consumer group状态机 223

6.3.2 group管理协议 226

6.3.3 rebalance场景剖析 227

6.4 实现精确一次处理语义 230

6.4.1 消息交付语义 230

6.4.2 幂等性producer(idempotent producer) 231

6.4.3 事务(transaction) 232

6.5 本章小结 234

第7章 管理Kafka集群 235

7.1 集群管理 235

7.1.1 启动broker 235

7.1.2 关闭broker 236

7.1.3 设置JMX端口 237

7.1.4 增加broker 238

7.1.5 升级broker版本 238

7.2 topic管理 241

7.2.1 创建topic 241

7.2.2 删除topic 243

7.2.3 查询topic列表 244

7.2.4 查询topic详情 244

7.2.5 修改topic 245

7.3 topic动态配置管理 246

7.3.1 增加topic配置 246

7.3.2 查看topic配置 247

7.3.3 删除topic配置 248

7.4 consumer相关管理 248

7.4.1 查询消费者组 248

7.4.2 重设消费者组位移 251

7.4.3 删除消费者组 256

7.4.4 kafka-consumer-offset-checker 257

7.5 topic分区管理 258

7.5.1 preferred leader选举 258

7.5.2 分区重分配 260

7.5.3 增加副本因子 263

7.6 Kafka常见脚本工具 264

7.6.1 kafka-console-producer脚本 264

7.6.2 kafka-console-consumer脚本 265

7.6.3 kafka-run-class脚本 267

7.6.4 查看消息元数据 268

7.6.5 获取topic当前消息数 270

7.6.6 查询__consumer_offsets 271

7.7 API方式管理集群 273

7.7.1 服务器端API管理topic 273

7.7.2 服务器端API管理位移 275

7.7.3 客户端API管理topic 276

7.7.4 客户端API查看位移 280

7.7.5 0.11.0.0版本客户端API 281

7.8 MirrorMaker 285

7.8.1 概要介绍 285

7.8.2 主要参数 286

7.8.3 使用实例 287

7.9 Kafka安全 288

7.9.1 SASL+ACL 289

7.9.2 SSL加密 297

7.10 常见问题 301

7.11 本章小结 304

第8章 监控Kafka集群 305

8.1 集群健康度检查 305

8.2 MBean监控 306

8.2.1 监控指标 306

8.2.2 指标分类 308

8.2.3 定义和查询JMX端口 309

8.3 broker端JMX监控 310

8.3.1 消息入站/出站速率 310

8.3.2 controller存活JMX指标 311

8.3.3 备份不足的分区数 312

8.3.4 leader分区数 312

8.3.5 ISR变化速率 313

8.3.6 broker I/O工作处理线程空闲率 313

8.3.7 broker网络处理线程空闲率 314

8.3.8 单个topic总字节数 314

8.4 clients端JMX监控 314

8.4.1 producer端JMX监控 314

8.4.2 consumer端JMX监控 316

8.5 JVM监控 317

8.5.1 进程状态 318

8.5.2 GC性能 318

8.6 OS监控 318

8.7 主流监控框架 319

8.7.1 JmxTool 320

8.7.2 kafka-manager 320

8.7.3 Kafka Monitor 325

8.7.4 Kafka Offset Monitor 327

8.7.5 CruiseControl 329

8.8 本章小结 330

第9章 调优Kafka集群 331

9.1 引言 331

9.2 确定调优目标 333

9.3 集群基础调优 334

9.3.1 禁止atime更新 335

9.3.2 文件系统选择 335

9.3.3 设置swapiness 336

9.3.4 JVM设置 337

9.3.5 其他调优 337

9.4 调优吞吐量 338

9.5 调优延时 342

9.6 调优持久性 343

9.7 调优可用性 347

9.8 本章小结 349

第10章 Kafka Connect与Kafka Streams 350

10.1 引言 350

10.2 Kafka Connect 351

10.2.1 概要介绍 351

10.2.2 standalone Connect 353

10.2.3 distributed Connect 356

10.2.4 开发connector 359

10.3 Kafka Streams 362

10.3.1 流处理 362

10.3.2 Kafka Streams核心概念 364

10.3.3 Kafka Streams与其他框架的异同 368

10.3.4 Word Count实例 369

10.3.5 Kafka Streams应用开发 372

10.3.6 Kafka Streams状态查询 382

10.4 本章小结 386


标签
消息中间件