书海网短评:
适读人群:本书适合所有对云计算、大数据处理感兴趣的技术人员阅读,尤其适合对消息引擎、流式处理技术及框架感兴趣的技术人员参考阅读。业内专家王国璋、付稳、王迪、杨金峰联袂力荐。基于ApacheKafka1.
业内专家王国璋、付稳、王迪、杨金峰联袂力荐。
基于ApacheKafka1.0.0版本进行介绍,KafkaContributor执笔。
从Kafka基本概念与特性开始,详细介绍了Kafka的部署、开发、运营、监控、调试、优化以及重要组件的设计原理,并给出了翔实的案例。
《Apache Kafka实战》既适合作为Kafka的入门书籍,也适合系统架构师和一线开发工程师参考阅读。
《Apache Kafka实战》是涵盖ApacheKafka各方面的具有实践指导意义的工具书和参考书。作者结合典型的使用场景,对Kafka整个技术体系进行了较为全面的讲解,以便读者能够举一反三,直接应用于实践。同时,《Apache Kafka实战》还对Kafka的设计原理及其流式处理组件进行了较深入的探讨,并给出了翔实的案例。
《Apache Kafka实战》共分为10章:第1章全面介绍消息引擎系统以及Kafka的基本概念与特性,快速带领读者走进Kafka的世界;第2章简要回顾了ApacheKafka的发展历史;第3章详细介绍了Kafka集群环境的搭建;第4、5章深入探讨了Kafka客户端的使用方法;第6章带领读者一览Kafka内部设计原理;第7~9章以实例的方式讲解了Kafka集群的管理、监控与调优;第10章介绍了Kafka新引入的流式处理组件。
胡夕,北航计算机硕士毕业,目前就职于一家互联网金融公司,开源技术爱好者。曾任职于IBM、搜狗、微博等公司。对Kafka及其他开源流处理技术与框架有深刻认识,同时也是国内活跃的Kafka代码贡献者。对Kafka原理、运行机制以及应用开发都有较深的研究。
胡夕是ApacheKafka在国内社区中非常活跃的贡献者之一。在详读这《Apache Kafka实战》的时候,我很赞叹于他对Kafka全面且系统的了解。《Apache Kafka实战》除了介绍Kafka本身的技术之外,还有不少作者本人的运维经验和生态圈使用经验分享,十分值得一读。
——KafkaPMC、Committer王国璋
Kafka是由Apache软件基金会开发的一个开源流处理平台,近年来蓬勃发展,在云计算和大数据技术栈中扮演着重要的角色,对于大型推荐系统、广告系统、搜索系统的实时数据分析非常有价值。《Apache Kafka实战》是一本很好的Kafka入门及进阶书籍,从部署、原理、大规模生产环境实践及调优等各个方面进行了介绍,深入浅出。《Apache Kafka实战》既适合作为Kafka的入门书籍,也适合作为系统架构师和一线开发工程师的参考书籍,无论是泛读还是精读,相信读者都会有较大收获。
——新浪微博技术专家付稳
Kafka是一款高性能、低延迟、高吞吐量的分布式发布-订阅消息系统,在推荐、搜索、广告等实时数据系统中应用广泛。《Apache Kafka实战》从Kafka基本概念与特性开始,详细介绍了Kafka的部署、开发、运营、监控、调试、优化以及重要组件的设计原理,图文并茂,帮助读者快速、深入地掌握Kafka,并能基于Kafka更好地改良或实现高可用、低耦合的数据处理系统。
——腾讯公司AI平台部助理总经理王迪
Kafka自诞生以来,迅速风靡成为大数据时代数据传输的关键。《Apache Kafka实战》作者从实战角度出发,讲解了Kafka的运用实践,作者将自己多年的经验融入其中,同时又深入剖析了Kafka的核心实现原理,兼顾广度与深度,让我受益,对广大大数据从业者来说这是一本值得研读的好书。
——今日头条架构师杨金峰
目录
第1章 认识ApacheKafka1
1.1 Kafka快速入门1
1.1.1 下载并解压缩Kafka二进制代码压缩包文件2
1.1.2 启动服务器3
1.1.3 创建topic3
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和partition16
1.4.3 offset17
1.4.4 replica18
1.4.5 leader和follower18
1.4.6 ISR19
1.5 Kafka使用场景20
1.5.1 消息传输20
1.5.2 网站行为日志追踪20
1.5.3 审计数据收集20
1.5.4 日志收集20
1.5.5 EventSourcing21
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与Confluent36
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 安装Java46
3.2.2 安装ZooKeeper47
3.2.3 安装单节点Kafka集群48
3.3 多节点环境安装49
3.3.1 安装多节点ZooKeeper集群50
3.3.2 安装多节点Kafka54
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 构造producer69
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 旧版本producer96
4.10 本章小结98
第5章 consumer开发99
5.1 consumer概览99
5.1.1 消费者(consumer)99
5.1.2 消费者组(consumergroup)101
5.1.3 位移(offset)102
5.1.4 位移提交103
5.1.5 __consumer_offsets104
5.1.6 消费者组重平衡(consumergrouprebalance)106
5.2 构建consumer106
5.2.1 consumer程序实例106
5.2.2 consumer脚本命令111
5.2.3 consumer主要参数112
5.3 订阅topic115
5.3.1 订阅topic列表115
5.3.2 基于正则表达式订阅topic115
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 rebalancegeneration126
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 每个线程维护一个KafkaConsumer133
5.8.2 单KafkaConsumer实例+多worker线程135
5.8.3 两种方法对比140
5.9 独立consumer141
5.10 旧版本consumer142
5.10.1 概览142
5.10.2 high-levelconsumer143
5.10.3 low-levelconsumer147
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)和leaderepoch174
6.1.5 日志存储设计185
6.1.6 通信协议(wireprotocol)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 consumergroup状态机223
6.3.2 group管理协议226
6.3.3 rebalance场景剖析227
6.4 实现精确一次处理语义230
6.4.1 消息交付语义230
6.4.2 幂等性producer(idempotentproducer)231
6.4.3 事务(transaction)232
6.5 本章小结234
第7章 管理Kafka集群235
7.1 集群管理235
7.1.1 启动broker235
7.1.2 关闭broker236
7.1.3 设置JMX端口237
7.1.4 增加broker238
7.1.5 升级broker版本238
7.2 topic管理241
7.2.1 创建topic241
7.2.2 删除topic243
7.2.3 查询topic列表244
7.2.4 查询topic详情244
7.2.5 修改topic245
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-checker257
7.5 topic分区管理258
7.5.1 preferredleader选举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_offsets271
7.7 API方式管理集群273
7.7.1 服务器端API管理topic273
7.7.2 服务器端API管理位移275
7.7.3 客户端API管理topic276
7.7.4 客户端API查看位移280
7.7.5 0.11.0.0版本客户端API281
7.8 MirrorMaker285
7.8.1 概要介绍285
7.8.2 主要参数286
7.8.3 使用实例287
7.9 Kafka安全288
7.9.1 SASL+ACL289
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 brokerI/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 JmxTool320
8.7.2 kafka-manager320
8.7.3 KafkaMonitor325
8.7.4 KafkaOffsetMonitor327
8.7.5 CruiseControl329
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 设置swapiness336
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章 KafkaConnect与KafkaStreams350
10.1 引言350
10.2 KafkaConnect351
10.2.1 概要介绍351
10.2.2 standaloneConnect353
10.2.3 distributedConnect356
10.2.4 开发connector359
10.3 KafkaStreams362
10.3.1 流处理362
10.3.2 KafkaStreams核心概念364
10.3.3 KafkaStreams与其他框架的异同368
10.3.4 WordCount实例369
10.3.5 KafkaStreams应用开发372
10.3.6 KafkaStreams状态查询382
10.4 本章小结386
前言
2011年年初,美国领英公司(LinkedIn)开源了一款基础架构软件,以奥地利作家弗兰兹?卡夫卡(FranzKafka)的名字命名,之后LinkedIn将其贡献给Apache基金会,随后该软件于2012年10月成功完成孵化并顺利晋升为Apache顶级项目——这便是大名鼎鼎的ApacheKafka。历经7年发展,2017年11月,ApacheKafka正式演进到1.0时代,《Apache Kafka实战》就是基于1.0.0版本来展开介绍Kafka的设计原理与实战的。
背景
这是一个最好的大数据时代,这是一个最坏的大数据时代!
很抱歉,我使用了这句改编后的狄更斯名言作为开头,我想没有谁会质疑“当今是大数据时代”这个论点。今年(2018年)两会上李克强总理所做的政府工作报告中多次提及大数据等关键词,这已然是“大数据”第5次被写入政府工作报告了。具体到大数据行业内,各种各样的大数据产业方兴未艾,其中在实时流式处理领域涌现出大量的技术与框架,令技术人员们应接不暇。实时流式处理系统在克服了传统批处理系统延时方面的固有缺陷的同时,还摆脱了设计上的桎梏,实现了“梦寐以求”的正确性。可以说,对于流式处理从业人员来说,这正是摩拳擦掌、大展宏图的最好时代。
与此同时,我们也清醒地意识到当今大数据领域内的细分越来越精细化。不必说日渐火爆的人工智能和机器学习潮流引诱着我们改弦易辙,也不必说那些纷繁复杂的技术框架令人眼花缭乱,单是静下心来沉淀所学、思考方向的片刻时光于我们这些从业者来说都已显得弥足珍贵。我们仿佛在黑暗密林中徘徊,试图找出那条通往光明的“康庄大道”。每当发现了一条羊肠小路都好似救命稻草一般紧紧抓住。多年后我们回望那只不过是不断追逐热点罢了,在技术的海洋中我们迷失了前进的方向。从这个意义上说,这实在是一个糟糕的时代。
时光切回到4年前的某个下午,那时我正在做着Kafka的大数据项目。我突然发现与其盲目跟风各种技术趋势,何不精进手头的工作,把当前工作中用到的技术搞明白,于是我萌发了研究Kafka的想法。直到今天,我都无比庆幸那个午后做出的冲动决定,正如AdamGrant在《离经叛道》一书中所说:最正确的决定都是在冲动之下做出的。诚不欺我!
想要深入学习Kafka,不掌握Scala语言是不行的,毕竟Kafka就是使用Scala语言编写的。苦于当时没有合适的Scala中文书籍,我依稀记得找到了一本600多页的Scala原版书(ProgrammingScalaEdition2)进行学习。那段时间实在是难熬!不得不说,英文版书籍虽然内容翔实,但在表述上实在晦涩难懂,比如partiallyappliedfunction和partialfunction两者的区别直至今天我都不是特别清晰,还是要不断地翻阅资料才能隐约记得它们之间的不同。庆幸的是,我没有半途而废,600多页的英文文档硬是啃了下来。对于Scala的初步掌握也让我觉得研究Kafka的时机到了。有意思的是,在之后通读Kafka的源码时我不禁大呼上当,Kafka的源码中只使用了最简单的函数式编程,我有些后悔自己花了那么多时间去学习Scala的函数式编程,当然这是后话。
既然是研究Kafka,那么研读源码是必不可少的步骤。如果不分析源码,我们就无法定位问题发生的根本原因。实话实说,阅读别人源码的过程是痛苦的,因而在理解的过程中我走了不少弯路。为了记录阅读Kafka源码的心得,我努力为每个Kafka源码包撰写博客。现在翻看我之前的博客,大家还能看到那好似流水账一般的Kafka源码分析系列文章。
随着对源码的不断熟悉,我加入了ApacheKafka社区,希望贡献自己的微薄之力。时至今日,我依然记得当初发送邮件要求加入开发组时的惶恐,也记得第一次贡献代码时的惴惴不安;我记得为了研究某个Kafkabug,自己曾忘记吃中饭的执着,也记得自己被标记为“Kafkacontributor”时的喜悦。在混迹社区的日子里,我逐渐认识了一些Kafka的committer们,比如KafkaPMC成员王国璋,国璋兄对于网上Kafka问题的权威解答令我受教良多,同时我也很感激他于百忙之中为《Apache Kafka实战》写推荐语。还有Kafka的三位原作者之一的饶军(RaoJun),几次问题交流让我看到了他霸气的决断能力以及对于疑难问题原因的毒辣分析。当然还有非常敬业的Ijuma,他是我见过的最勤劳的Kafkacommitter,没有之一。在编写《Apache Kafka实战》的过程中,我都或多或少地得到过他们的帮助,再次表示衷心感谢。
由于对Kafka研究的日益深入,我终于有了写书的冲动。我希望通过把学到的知识和原理集中整理并书写成文字来帮助那些尚未接触Kafka的广大读者快速上手,降低他们学习使用Kafka的成本,于是有了今天这本《ApacheKafka实战》。借着写作《Apache Kafka实战》的契机,我本人对Kafka的方方面面做了梳理,自觉收获良多。每当搞懂了一个以前未了解的机制时,心中的那种满足感和兴奋感至今都令人神往。在此,我深深地希望读者在阅读完《Apache Kafka实战》后也能有这样的体会。
面向的读者
我衷心希望《Apache Kafka实战》可以成为各行各业的大数据从业者使用消息队列甚至是进入流式处理领域内的“敲门砖”,也希望各大公司能够充分利用Kafka来实现自己的业务目标。
在编写《Apache Kafka实战》的过程中,我阅读了大量的英文资料和源代码,试图通过自己的理解将Kafka的使用实战技巧深入浅出地呈现给广大读者。没错,我希望这《Apache Kafka实战》给人的感觉是通俗易懂、深入浅出,从而方便引领读者快速进入Kafka学习的大门。
我本人维护了一个微信公众号(名为“大数据Kafka技术分享”),希望在该公众号中我能和读者朋友们一起深入交流和探讨Kafka学习过程中碰到的各种问题,同时我也会及时分享和推送各种最新的Kafka使用心得。
致谢
非常感谢KafkaPMC成员、KafkaCommitter王国璋对《Apache Kafka实战》的大力支持。自开始编写《Apache Kafka实战》之日起,国璋兄就给予我很大的鼓励与帮助,这也让我坚定了传播Kafka实战心得的决心。
感谢腾讯AI平台助理总经理王迪先生和我的好友贾兴华,你们对《Apache Kafka实战》的评价之高实在是过誉了,但也令本人倍感振奋。
感谢我的前同事、新浪微博技术专家付稳。付总对《Apache Kafka实战》整体结构和具体知识点的建议发人深省,其独到的行业见解令人佩服。
非常感谢电子工业出版社的编辑付睿女士。她细致、专业、严谨的工作作风深深地感染了我,在《Apache Kafka实战》编写过程中她总是能及时地就书中的内容给出合理的建议和指导。
另外,我还想感谢一下我的家人,特别是我的妻子刘丹女士。过去一年中正是你坚定的支持和默默的付出才成就我撰写《Apache Kafka实战》。对于你偶尔在学术上给予的提点我既感到惊讶,同时也欣慰不已。这为我漫长枯燥的写书过程平添了很多温暖。
最后,非常感谢《Apache Kafka实战》的每一位读者。本人已经在写作过程中收获良多,我衷心希望你们在阅读《Apache Kafka实战》时也有大呼过瘾的感觉。另外,我在“知乎”(ID:huxihx)的Kafka专栏以及StackOverflow网站上也会尽力回答关于Kafka的各类问题,希望通过这些途径可以和读者进行更加深入的交流。
由于本人水平有限,书中难免有遗漏和疏忽,也恳请各位读者多多指正。
胡夕
2018年3月15日于北京
个人博客:https://www.cnblogs.com/huxi2b/
微信公众号:大数据Kafka技术分享
电子邮箱:huxi_2b@hotmail.com









