本書介紹Kafka的技術原理和應用技巧。內容包括如何安裝和配置Kafka、如何使用Kafka API、Kafka的設計原則和可靠性保證,以及Kafka的一些架構細節(jié),如復制協(xié)議、控制器和存儲層。本書列舉了一些非常流行的Kafka應用場景,比如基于事件驅動的微服務系統(tǒng)的消息總線、流式處理應用程序和大規(guī)模數(shù)據(jù)管道。通過學習本書,你不僅能夠深入理解這項大數(shù)據(jù)核心技術,還能夠將所學知識付諸實踐,在生產環(huán)境中更好地運行Kafka,并基于它構建穩(wěn)健的高性能應用程序。
本書第1版出版時,有超過30%的《財富》世界500強公司使用Kafka。5年后,這個比例已經達到70%。毋庸置疑,作為大數(shù)據(jù)時代的核心技術,Kafka已然成為所有動態(tài)數(shù)據(jù)平臺的事實基礎。本書為使用Kafka的軟件工程師、架構師和運維工程師勾勒出一條完整的學習曲線,并強調原理剖析和應用實踐。
來自Confluent和LinkedIn的一線Kafka開發(fā)人員將為你解釋如何部署生產級Kafka集群、編寫可靠的事件驅動微服務,以及使用Kafka構建可伸縮的流處理應用程序。通過詳細的示例,你將了解Kafka的設計原則、可靠性保證,以及架構細節(jié),包括復制協(xié)議、控制器和存儲層。
* 部署和配置Kafka的良好實踐
* Kafka生產者和消費者如何讀寫消息
* 確?煽總鬟f數(shù)據(jù)的模式和用例要求
* 用Kafka構建數(shù)據(jù)管道和應用程序
* 用Kafka在生產環(huán)境中執(zhí)行監(jiān)控、調優(yōu)和維護任務
* Kafka的關鍵運維指標
* Kafka針對流處理系統(tǒng)的交付能力
【作者介紹】
格溫·沙皮拉(Gwen Shapira)是Kafka項目的Committer和PMC成員,也是Confluent的工程主管,領導云原生Kafka團隊,致力于打造更具彈性和可伸縮性的Kafka云服務。
托德·帕利諾(Todd Palino)是LinkedIn的站點可靠性工程師,他開發(fā)了Kafka消費者監(jiān)控工具Burrow。
拉吉尼·西瓦拉姆(Rajini Sivaram)是Kafka項目的Committer和PMC成員。她在Confluent為Kafka設計和開發(fā)跨集群復制和安全功能。
克里特·佩蒂(Krit Petty)是LinkedIn的Kafka站點可靠性工程經理,曾負責將LinkedIn的大規(guī)模Kafka集群遷移到微軟的Azure云。
【譯者介紹】
薛命燈,畢業(yè)于廈門大學軟件學院,十余年軟件開發(fā)和架構經驗,InfoQ高級社區(qū)編輯。另譯有《硅谷革命》《生產微服務》等書。微信公眾號CodeDeep。
本書贊譽 xvii
第 2 版序 xix
第 1 版序 xxi
前言 xxiii
第 1 章 初識Kafka 1
1.1 發(fā)布與訂閱消息系統(tǒng) 1
1.1.1 如何開始 2
1.1.2 獨立的隊列系統(tǒng) 3
1.2 Kafka登場 3
1.2.1 消息和批次 4
1.2.2 模式 4
1.2.3 主題和分區(qū) 4
1.2.4 生產者和消費者 5
1.2.5 broker和集群 6
1.2.6 多集群 7
1.3 為什么選擇Kafka 8
1.3.1 多個生產者 8
1.3.2 多個消費者 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 主題的默認配置 20
2.4 選擇硬件 24
2.4.1 磁盤吞吐量 25
2.4.2 磁盤容量 25
2.4.3 內存 25
2.4.4 網絡 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)調優(yōu) 28
2.7 生產環(huán)境的注意事項 31
2.7.1 垃圾回收器選項 31
2.7.2 數(shù)據(jù)中心布局 32
2.7.3 共享ZooKeeper 32
2.8 小結 33
第 3 章 Kafka生產者——向Kafka寫入數(shù)據(jù) 34
3.1 生產者概覽 35
3.2 創(chuàng)建 Kafka生產者 36
3.3 發(fā)送消息到Kafka 37
3.3.1 同步發(fā)送消息 38
3.3.2 異步發(fā)送消息 39
3.4 生產者配置 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 標頭 52
3.8 攔截器 53
3.9 配額和節(jié)流 54
3.10 小結 56
第 4 章 Kafka消費者——從Kafka讀取數(shù)據(jù) 57
4.1 Kafka消費者相關概念 57
4.1.1 消費者和消費者群組 57
4.1.2 消費者群組和分區(qū)再均衡 60
4.1.3 群組固定成員 62
4.2 創(chuàng)建 Kafka消費者 63
4.3 訂閱主題 63
4.4 輪詢 64
4.5 配置消費者 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 提交當前偏移量 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 在消費者里使用Avro反序列器 83
4.11 獨立的消費者:為什么以及怎樣使用不屬于任何群組的消費者 83
4.12 小結 84
第 5 章 編程式管理Kafka 85
5.1 AdminClient概覽 85
5.1.1 異步和最終一致性API 86
5.1.2 配置參數(shù) 86
5.1.3 扁平的結構 86
5.1.4 額外的話 86
5.2 AdminClient生命周期:創(chuàng)建、配置和關閉 87
5.2.1 client.dns.lookup 87
5.2.2 request.timeout.ms 88
5.3 基本的主題管理操作 88
5.4 配置管理 91
5.5 消費者群組管理 92
5.5.1 查看消費者群組 93
5.5.2 修改消費者群組 94
5.6 集群元數(shù)據(jù) 95
5.7 高級的管理操作 96
5.7.1 為主題添加分區(qū) 96
5.7.2 從主題中刪除消息 96
5.7.3 首領選舉 97
5.7.4 重新分配副本 98
5.8 測試 99
5.9 小結 101
第 6 章 深入Kafka 102
6.1 集群的成員關系 102
6.2 控制器 103
6.3 復制 105
6.4 處理請求 107
6.4.1 生產請求 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 壓實 117
6.5.7 壓實的工作原理 118
6.5.8 被刪除的事件 119
6.5.9 何時會壓實主題 119
6.6 小結 120
第 7 章 可靠的數(shù)據(jù)傳遞 121
7.1 可靠性保證 121
7.2 復制 122
7.3 broker配置 123
7.3.1 復制系數(shù) 123
7.3.2 不徹底的首領選舉 125
7.3.3 最少同步副本 126
7.3.4 保持副本同步 126
7.3.5 持久化到磁盤 126
7.4 在可靠的系統(tǒng)中使用生產者 127
7.4.1 發(fā)送確認 127
7.4.2 配置生產者的重試參數(shù) 128
7.4.3 額外的錯誤處理 129
7.5 在可靠的系統(tǒng)中使用消費者 129
7.5.1 消費者的可靠性配置 130
7.5.2 手動提交偏移量 130
7.6 驗證系統(tǒng)可靠性 132
7.6.1 驗證配置 132
7.6.2 驗證應用程序 133
7.6.3 在生產環(huán)境中監(jiān)控可靠性 133
7.7 小結 134
第 8 章 精確一次性語義 135
8.1 冪等生產者 135
8.1.1 冪等生產者的工作原理 136
8.1.2 冪等生產者的局限性 137
8.1.3 如何使用冪等生產者 138
8.2 事務 138
8.2.1 事務的應用場景 139
8.2.2 事務可以解決哪些問題 139
8.2.3 事務是如何保證精確一次性的 140
8.2.4 事務不能解決哪些問題 141
8.2.5 如何使用事務 143
8.2.6 事務ID和隔離 145
8.2.7 事務的工作原理 146
8.3 事務的性能 148
8.4 小結 148
第 9 章 構建數(shù)據(jù)管道 149
9.1 構建數(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 轉換 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 運行Connect 155
9.3.2 連接器示例:文件數(shù)據(jù)源和文件數(shù)據(jù)池 157
9.3.3 連接器示例:從MySQL到ElasticSearch 159
9.3.4 單一消息轉換 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 小結 170
第 10 章 跨集群數(shù)據(jù)鏡像 171
10.1 跨集群鏡像的應用場景 171
10.2 多集群架構 172
10.2.1 跨數(shù)據(jù)中心通信的一些現(xiàn)實情況 173
10.2.2 星型架構 173
10.2.3 雙活架構 175
10.2.4 主備架構 176
10.2.5 延展集群 180
10.3 MirrorMaker 181
10.3.1 配置MirrorMaker 183
10.3.2 多集群復制拓撲 184
10.3.3 保護MirrorMaker 185
10.3.4 在生產環(huán)境中部署MirrorMaker 186
10.3.5 MirrorMaker調優(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 小結 193
第 11 章 保護Kafka 194
11.1 鎖住 Kafka 194
11.2 安全協(xié)議 196
11.3 身份驗證 197
11.3.1 SSL 198
11.3.2 SASL 201
11.3.3 重新認證 210
11.3.4 安全更新不停機 211
11.4 加密 212
11.5 授權 214
11.5.1 AclAuthorizer 214
11.5.2 自定義授權 217
11.5.3 安全方面的考慮 219
11.6 審計 219
11.7 保護ZooKeeper 220
11.7.1 SASL 220
11.7.2 SSL 221
11.7.3 授權 221
11.8 保護平臺 222
11.9 小結 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 消費者群組 230
12.2.1 列出并描述消費者群組信息 230
12.2.2 刪除消費者群組 231
12.2.3 偏移量管理 232
12.3 動態(tài)配置變更 233
12.3.1 覆蓋主題的默認配置 233
12.3.2 覆蓋客戶端和用戶的默認配置 234
12.3.3 覆蓋broker的默認配置 235
12.3.4 查看被覆蓋的配置 236
12.3.5 移除被覆蓋的配置 236
12.4 生產和消費 236
12.4.1 控制臺生產者 237
12.4.2 控制臺消費者 238
12.5 分區(qū)管理 241
12.5.1 首選首領選舉 241
12.5.2 修改分區(qū)的副本 242
12.5.3 轉儲日志片段 246
12.5.4 副本驗證 248
12.6 其他工具 248
12.7 不安全的操作 249
12.7.1 移動集群控制器 249
12.7.2 移除待刪除的主題 249
12.7.3 手動刪除主題 250
12.8 小結 250
第 13 章 監(jiān)控Kafka 251
13.1 指標基礎 251
13.1.1 指標來自哪里 251
13.1.2 需要哪些指標 252
13.1.3 應用程序健康檢測 253
13.2 服務級別目標 254
13.2.1 服務級別定義 254
13.2.2 哪些指標是好的SLI 255
13.2.3 將SLO用于告警 255
13.3 broker的指標 256
13.3.1 診斷集群問題 257
13.3.2 非同步分區(qū)的藝術 257
13.3.3 broker指標 261
13.3.4 主題的指標和分區(qū)的指標 268
13.3.5 Java虛擬機監(jiān)控 269
13.3.6 操作系統(tǒng)監(jiān)控 270
13.3.7 日志 272
13.4 客戶端監(jiān)控 272
13.4.1 生產者指標 272
13.4.2 消費者指標 274
13.4.3 配額 276
13.5 滯后監(jiān)控 277
13.6 端到端監(jiān)控 277
13.7 小結 278
第 14 章 流式處理 279
14.1 什么是流式處理 280
14.2 流式處理相關概念 282
14.2.1 拓撲 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 流式處理設計模式 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 字數(shù)統(tǒng)計 294
14.4.2 股票市場統(tǒng)計 296
14.4.3 填充點擊事件流 298
14.5 Streams架構概覽 300
14.5.1 構建拓撲 300
14.5.2 優(yōu)化拓撲 301
14.5.3 測試拓撲 301
14.5.4 擴展拓撲 302
14.5.5 在故障中存活下來 304
14.6 流式處理應用場景 305
14.7 如何選擇流式處理框架 306
14.8 小結 307
附錄 A 在其他操作系統(tǒng)中安裝Kafka 309
附錄 B 其他Kafka工具 314