本書介紹Kafka的技術(shù)原理和應(yīng)用技巧。內(nèi)容包括如何安裝和配置Kafka、如何使用Kafka API、Kafka的設(shè)計(jì)原則和可靠性保證,以及Kafka的一些架構(gòu)細(xì)節(jié),如復(fù)制協(xié)議、控制器和存儲層。本書列舉了一些非常流行的Kafka應(yīng)用場景,比如基于事件驅(qū)動的微服務(wù)系統(tǒng)的消息總線、流式處理應(yīng)用程序和大規(guī)模數(shù)據(jù)管道。通過學(xué)習(xí)本書,你不僅能夠深入理解這項(xiàng)大數(shù)據(jù)核心技術(shù),還能夠?qū)⑺鶎W(xué)知識付諸實(shí)踐,在生產(chǎn)環(huán)境中更好地運(yùn)行Kafka,并基于它構(gòu)建穩(wěn)健的高性能應(yīng)用程序。
本書第1版出版時,有超過30%的《財(cái)富》世界500強(qiáng)公司使用Kafka。5年后,這個比例已經(jīng)達(dá)到70%。毋庸置疑,作為大數(shù)據(jù)時代的核心技術(shù),Kafka已然成為所有動態(tài)數(shù)據(jù)平臺的事實(shí)基礎(chǔ)。本書為使用Kafka的軟件工程師、架構(gòu)師和運(yùn)維工程師勾勒出一條完整的學(xué)習(xí)曲線,并強(qiáng)調(diào)原理剖析和應(yīng)用實(shí)踐。
來自Confluent和LinkedIn的一線Kafka開發(fā)人員將為你解釋如何部署生產(chǎn)級Kafka集群、編寫可靠的事件驅(qū)動微服務(wù),以及使用Kafka構(gòu)建可伸縮的流處理應(yīng)用程序。通過詳細(xì)的示例,你將了解Kafka的設(shè)計(jì)原則、可靠性保證,以及架構(gòu)細(xì)節(jié),包括復(fù)制協(xié)議、控制器和存儲層。
* 部署和配置Kafka的良好實(shí)踐
* Kafka生產(chǎn)者和消費(fèi)者如何讀寫消息
* 確?煽總鬟f數(shù)據(jù)的模式和用例要求
* 用Kafka構(gòu)建數(shù)據(jù)管道和應(yīng)用程序
* 用Kafka在生產(chǎn)環(huán)境中執(zhí)行監(jiān)控、調(diào)優(yōu)和維護(hù)任務(wù)
* Kafka的關(guān)鍵運(yùn)維指標(biāo)
* Kafka針對流處理系統(tǒng)的交付能力
【作者介紹】
格溫·沙皮拉(Gwen Shapira)是Kafka項(xiàng)目的Committer和PMC成員,也是Confluent的工程主管,領(lǐng)導(dǎo)云原生Kafka團(tuán)隊(duì),致力于打造更具彈性和可伸縮性的Kafka云服務(wù)。
托德·帕利諾(Todd Palino)是LinkedIn的站點(diǎn)可靠性工程師,他開發(fā)了Kafka消費(fèi)者監(jiān)控工具Burrow。
拉吉尼·西瓦拉姆(Rajini Sivaram)是Kafka項(xiàng)目的Committer和PMC成員。她在Confluent為Kafka設(shè)計(jì)和開發(fā)跨集群復(fù)制和安全功能。
克里特·佩蒂(Krit Petty)是LinkedIn的Kafka站點(diǎn)可靠性工程經(jīng)理,曾負(fù)責(zé)將LinkedIn的大規(guī)模Kafka集群遷移到微軟的Azure云。
【譯者介紹】
薛命燈,畢業(yè)于廈門大學(xué)軟件學(xué)院,十余年軟件開發(fā)和架構(gòu)經(jīng)驗(yàn),InfoQ高級社區(qū)編輯。另譯有《硅谷革命》《生產(chǎn)微服務(wù)》等書。微信公眾號CodeDeep。
本書贊譽(yù) xvii
第 2 版序 xix
第 1 版序 xxi
前言 xxiii
第 1 章 初識Kafka 1
1.1 發(fā)布與訂閱消息系統(tǒng) 1
1.1.1 如何開始 2
1.1.2 獨(dú)立的隊(duì)列系統(tǒng) 3
1.2 Kafka登場 3
1.2.1 消息和批次 4
1.2.2 模式 4
1.2.3 主題和分區(qū) 4
1.2.4 生產(chǎn)者和消費(fèi)者 5
1.2.5 broker和集群 6
1.2.6 多集群 7
1.3 為什么選擇Kafka 8
1.3.1 多個生產(chǎn)者 8
1.3.2 多個消費(fèi)者 8
1.3.3 基于磁盤的數(shù)據(jù)保留 9
1.3.4 伸縮性 9
1.3.5 高性能 9
1.3.6 平臺特性 9
1.4 數(shù)據(jù)生態(tài)系統(tǒng) 9
1.5 起源故事 11
1.5.1 LinkedIn的問題 11
1.5.2 Kafka的誕生 12
1.5.3 走向開源 12
1.5.4 商業(yè)化 13
1.5.5 命名 13
1.6 開始Kafka之旅 13
第 2 章 安裝Kafka 14
2.1 環(huán)境配置 14
2.1.1 選擇操作系統(tǒng) 14
2.1.2 安裝Java 14
2.1.3 安裝ZooKeeper 15
2.2 安裝broker 17
2.3 配置broker 18
2.3.1 常規(guī)配置參數(shù) 18
2.3.2 主題的默認(rèn)配置 20
2.4 選擇硬件 24
2.4.1 磁盤吞吐量 25
2.4.2 磁盤容量 25
2.4.3 內(nèi)存 25
2.4.4 網(wǎng)絡(luò) 25
2.4.5 CPU 26
2.5 云端的Kafka 26
2.5.1 微軟Azure 26
2.5.2 AWS 26
2.6 配置Kafka集群 27
2.6.1 需要多少個broker 27
2.6.2 broker配置 28
2.6.3 操作系統(tǒng)調(diào)優(yōu) 28
2.7 生產(chǎn)環(huán)境的注意事項(xiàng) 31
2.7.1 垃圾回收器選項(xiàng) 31
2.7.2 數(shù)據(jù)中心布局 32
2.7.3 共享ZooKeeper 32
2.8 小結(jié) 33
第 3 章 Kafka生產(chǎn)者——向Kafka寫入數(shù)據(jù) 34
3.1 生產(chǎn)者概覽 35
3.2 創(chuàng)建 Kafka生產(chǎn)者 36
3.3 發(fā)送消息到Kafka 37
3.3.1 同步發(fā)送消息 38
3.3.2 異步發(fā)送消息 39
3.4 生產(chǎn)者配置 39
3.4.1 client.id 40
3.4.2 acks 40
3.4.3 消息傳遞時間 41
3.4.4 linger.ms 43
3.4.5 buffer.memory 43
3.4.6 compression.type 43
3.4.7 batch.size 43
3.4.8 max.in.flight.requests.per.connection 43
3.4.9 max.request.size 44
3.4.10 receive.buffer.bytes和send.buffer.bytes 44
3.4.11 enable.idempotence 44
3.5 序列化器 45
3.5.1 自定義序列化器 45
3.5.2 使用Avro序列化數(shù)據(jù) 47
3.5.3 在Kafka中使用Avro記錄 48
3.6 分區(qū) 51
3.7 標(biāo)頭 52
3.8 攔截器 53
3.9 配額和節(jié)流 54
3.10 小結(jié) 56
第 4 章 Kafka消費(fèi)者——從Kafka讀取數(shù)據(jù) 57
4.1 Kafka消費(fèi)者相關(guān)概念 57
4.1.1 消費(fèi)者和消費(fèi)者群組 57
4.1.2 消費(fèi)者群組和分區(qū)再均衡 60
4.1.3 群組固定成員 62
4.2 創(chuàng)建 Kafka消費(fèi)者 63
4.3 訂閱主題 63
4.4 輪詢 64
4.5 配置消費(fèi)者 66
4.5.1 fetch.min.bytes 66
4.5.2 fetch.max.wait.ms 66
4.5.3 fetch.max.bytes 66
4.5.4 max.poll.records 67
4.5.5 max.partition.fetch.bytes 67
4.5.6 session.timeout.ms和heartbeat.interval.ms 67
4.5.7 max.poll.interval.ms 67
4.5.8 default.api.timeout.ms 68
4.5.9 request.timeout.ms 68
4.5.10 auto.offset.reset 68
4.5.11 enable.auto.commit 68
4.5.12 partition.assignment.strategy 68
4.5.13 client.id 69
4.5.14 client.rack 69
4.5.15 group.instance.id 70
4.5.16 receive.buffer.bytes和send.buffer.bytes 70
4.5.17 offsets.retention.minutes 70
4.6 提交和偏移量 70
4.6.1 自動提交 71
4.6.2 提交當(dāng)前偏移量 72
4.6.3 異步提交 73
4.6.4 同步和異步組合提交 74
4.6.5 提交特定的偏移量 75
4.7 再均衡監(jiān)聽器 76
4.8 從特定偏移量位置讀取記錄 78
4.9 如何退出 79
4.10 反序列化器 80
4.10.1 自定義反序列化器 81
4.10.2 在消費(fèi)者里使用Avro反序列器 83
4.11 獨(dú)立的消費(fèi)者:為什么以及怎樣使用不屬于任何群組的消費(fèi)者 83
4.12 小結(jié) 84
第 5 章 編程式管理Kafka 85
5.1 AdminClient概覽 85
5.1.1 異步和最終一致性API 86
5.1.2 配置參數(shù) 86
5.1.3 扁平的結(jié)構(gòu) 86
5.1.4 額外的話 86
5.2 AdminClient生命周期:創(chuàng)建、配置和關(guān)閉 87
5.2.1 client.dns.lookup 87
5.2.2 request.timeout.ms 88
5.3 基本的主題管理操作 88
5.4 配置管理 91
5.5 消費(fèi)者群組管理 92
5.5.1 查看消費(fèi)者群組 93
5.5.2 修改消費(fèi)者群組 94
5.6 集群元數(shù)據(jù) 95
5.7 高級的管理操作 96
5.7.1 為主題添加分區(qū) 96
5.7.2 從主題中刪除消息 96
5.7.3 首領(lǐng)選舉 97
5.7.4 重新分配副本 98
5.8 測試 99
5.9 小結(jié) 101
第 6 章 深入Kafka 102
6.1 集群的成員關(guān)系 102
6.2 控制器 103
6.3 復(fù)制 105
6.4 處理請求 107
6.4.1 生產(chǎn)請求 109
6.4.2 獲取請求 109
6.4.3 其他請求 111
6.5 物理存儲 112
6.5.1 分層存儲 113
6.5.2 分區(qū)的分配 114
6.5.3 文件管理 115
6.5.4 文件格式 115
6.5.5 索引 117
6.5.6 壓實(shí) 117
6.5.7 壓實(shí)的工作原理 118
6.5.8 被刪除的事件 119
6.5.9 何時會壓實(shí)主題 119
6.6 小結(jié) 120
第 7 章 可靠的數(shù)據(jù)傳遞 121
7.1 可靠性保證 121
7.2 復(fù)制 122
7.3 broker配置 123
7.3.1 復(fù)制系數(shù) 123
7.3.2 不徹底的首領(lǐng)選舉 125
7.3.3 最少同步副本 126
7.3.4 保持副本同步 126
7.3.5 持久化到磁盤 126
7.4 在可靠的系統(tǒng)中使用生產(chǎn)者 127
7.4.1 發(fā)送確認(rèn) 127
7.4.2 配置生產(chǎn)者的重試參數(shù) 128
7.4.3 額外的錯誤處理 129
7.5 在可靠的系統(tǒng)中使用消費(fèi)者 129
7.5.1 消費(fèi)者的可靠性配置 130
7.5.2 手動提交偏移量 130
7.6 驗(yàn)證系統(tǒng)可靠性 132
7.6.1 驗(yàn)證配置 132
7.6.2 驗(yàn)證應(yīng)用程序 133
7.6.3 在生產(chǎn)環(huán)境中監(jiān)控可靠性 133
7.7 小結(jié) 134
第 8 章 精確一次性語義 135
8.1 冪等生產(chǎn)者 135
8.1.1 冪等生產(chǎn)者的工作原理 136
8.1.2 冪等生產(chǎn)者的局限性 137
8.1.3 如何使用冪等生產(chǎn)者 138
8.2 事務(wù) 138
8.2.1 事務(wù)的應(yīng)用場景 139
8.2.2 事務(wù)可以解決哪些問題 139
8.2.3 事務(wù)是如何保證精確一次性的 140
8.2.4 事務(wù)不能解決哪些問題 141
8.2.5 如何使用事務(wù) 143
8.2.6 事務(wù)ID和隔離 145
8.2.7 事務(wù)的工作原理 146
8.3 事務(wù)的性能 148
8.4 小結(jié) 148
第 9 章 構(gòu)建數(shù)據(jù)管道 149
9.1 構(gòu)建數(shù)據(jù)管道時需要考慮的問題 150
9.1.1 及時性 150
9.1.2 可靠性 150
9.1.3 高吞吐量和動態(tài)吞吐量 151
9.1.4 數(shù)據(jù)格式 151
9.1.5 轉(zhuǎn)換 152
9.1.6 安全性 152
9.1.7 故障處理 153
9.1.8 耦合性和靈活性 153
9.2 何時使用Connect API或客戶端API 154
9.3 Kafka Connect 154
9.3.1 運(yùn)行Connect 155
9.3.2 連接器示例:文件數(shù)據(jù)源和文件數(shù)據(jù)池 157
9.3.3 連接器示例:從MySQL到ElasticSearch 159
9.3.4 單一消息轉(zhuǎn)換 164
9.3.5 深入理解Connect 167
9.4 Connect之外的選擇 169
9.4.1 其他數(shù)據(jù)存儲系統(tǒng)的數(shù)據(jù)攝入框架 169
9.4.2 基于圖形界面的ETL工具 169
9.4.3 流式處理框架 170
9.5 小結(jié) 170
第 10 章 跨集群數(shù)據(jù)鏡像 171
10.1 跨集群鏡像的應(yīng)用場景 171
10.2 多集群架構(gòu) 172
10.2.1 跨數(shù)據(jù)中心通信的一些現(xiàn)實(shí)情況 173
10.2.2 星型架構(gòu) 173
10.2.3 雙活架構(gòu) 175
10.2.4 主備架構(gòu) 176
10.2.5 延展集群 180
10.3 MirrorMaker 181
10.3.1 配置MirrorMaker 183
10.3.2 多集群復(fù)制拓?fù)? 184
10.3.3 保護(hù)MirrorMaker 185
10.3.4 在生產(chǎn)環(huán)境中部署MirrorMaker 186
10.3.5 MirrorMaker調(diào)優(yōu) 189
10.4 其他跨集群鏡像方案 190
10.4.1 Uber的uReplicator 190
10.4.2 LinkedIn的Brooklin 191
10.4.3 Confluent的跨數(shù)據(jù)中心鏡像解決方案 191
10.5 小結(jié) 193
第 11 章 保護(hù)Kafka 194
11.1 鎖住 Kafka 194
11.2 安全協(xié)議 196
11.3 身份驗(yàn)證 197
11.3.1 SSL 198
11.3.2 SASL 201
11.3.3 重新認(rèn)證 210
11.3.4 安全更新不停機(jī) 211
11.4 加密 212
11.5 授權(quán) 214
11.5.1 AclAuthorizer 214
11.5.2 自定義授權(quán) 217
11.5.3 安全方面的考慮 219
11.6 審計(jì) 219
11.7 保護(hù)ZooKeeper 220
11.7.1 SASL 220
11.7.2 SSL 221
11.7.3 授權(quán) 221
11.8 保護(hù)平臺 222
11.9 小結(jié) 223
第 12 章 管理Kafka 225
12.1 主題操作 225
12.1.1 創(chuàng)建新主題 226
12.1.2 列出集群中的所有主題 227
12.1.3 列出主題詳情 227
12.1.4 增加分區(qū) 228
12.1.5 減少分區(qū) 229
12.1.6 刪除主題 229
12.2 消費(fèi)者群組 230
12.2.1 列出并描述消費(fèi)者群組信息 230
12.2.2 刪除消費(fèi)者群組 231
12.2.3 偏移量管理 232
12.3 動態(tài)配置變更 233
12.3.1 覆蓋主題的默認(rèn)配置 233
12.3.2 覆蓋客戶端和用戶的默認(rèn)配置 234
12.3.3 覆蓋broker的默認(rèn)配置 235
12.3.4 查看被覆蓋的配置 236
12.3.5 移除被覆蓋的配置 236
12.4 生產(chǎn)和消費(fèi) 236
12.4.1 控制臺生產(chǎn)者 237
12.4.2 控制臺消費(fèi)者 238
12.5 分區(qū)管理 241
12.5.1 首選首領(lǐng)選舉 241
12.5.2 修改分區(qū)的副本 242
12.5.3 轉(zhuǎn)儲日志片段 246
12.5.4 副本驗(yàn)證 248
12.6 其他工具 248
12.7 不安全的操作 249
12.7.1 移動集群控制器 249
12.7.2 移除待刪除的主題 249
12.7.3 手動刪除主題 250
12.8 小結(jié) 250
第 13 章 監(jiān)控Kafka 251
13.1 指標(biāo)基礎(chǔ) 251
13.1.1 指標(biāo)來自哪里 251
13.1.2 需要哪些指標(biāo) 252
13.1.3 應(yīng)用程序健康檢測 253
13.2 服務(wù)級別目標(biāo) 254
13.2.1 服務(wù)級別定義 254
13.2.2 哪些指標(biāo)是好的SLI 255
13.2.3 將SLO用于告警 255
13.3 broker的指標(biāo) 256
13.3.1 診斷集群問題 257
13.3.2 非同步分區(qū)的藝術(shù) 257
13.3.3 broker指標(biāo) 261
13.3.4 主題的指標(biāo)和分區(qū)的指標(biāo) 268
13.3.5 Java虛擬機(jī)監(jiān)控 269
13.3.6 操作系統(tǒng)監(jiān)控 270
13.3.7 日志 272
13.4 客戶端監(jiān)控 272
13.4.1 生產(chǎn)者指標(biāo) 272
13.4.2 消費(fèi)者指標(biāo) 274
13.4.3 配額 276
13.5 滯后監(jiān)控 277
13.6 端到端監(jiān)控 277
13.7 小結(jié) 278
第 14 章 流式處理 279
14.1 什么是流式處理 280
14.2 流式處理相關(guān)概念 282
14.2.1 拓?fù)? 282
14.2.2 時間 282
14.2.3 狀態(tài) 284
14.2.4 流和表 284
14.2.5 時間窗口 285
14.2.6 處理保證 287
14.3 流式處理設(shè)計(jì)模式 287
14.3.1 單事件處理 287
14.3.2 使用本地狀態(tài) 288
14.3.3 多階段處理和重分區(qū) 289
14.3.4 使用外部查找:流和表的連接 290
14.3.5 表與表的連接 291
14.3.6 流與流的連接 291
14.3.7 亂序事件 292
14.3.8 重新處理 293
14.3.9 交互式查詢 294
14.4 Streams示例 294
14.4.1 字?jǐn)?shù)統(tǒng)計(jì) 294
14.4.2 股票市場統(tǒng)計(jì) 296
14.4.3 填充點(diǎn)擊事件流 298
14.5 Streams架構(gòu)概覽 300
14.5.1 構(gòu)建拓?fù)? 300
14.5.2 優(yōu)化拓?fù)? 301
14.5.3 測試拓?fù)? 301
14.5.4 擴(kuò)展拓?fù)? 302
14.5.5 在故障中存活下來 304
14.6 流式處理應(yīng)用場景 305
14.7 如何選擇流式處理框架 306
14.8 小結(jié) 307
附錄 A 在其他操作系統(tǒng)中安裝Kafka 309
附錄 B 其他Kafka工具 314