本書主要包括MongoDB安裝部署、增刪改查、索引、聚集框架等基礎(chǔ)知識(shí);WiredTiger存儲(chǔ)引擎、事務(wù)、復(fù)制集、分片集群等高階知識(shí);MongoDB的導(dǎo)入導(dǎo)出、備份恢復(fù)、性能監(jiān)控、權(quán)限控制等運(yùn)維管理知識(shí);MongoDB的驅(qū)動(dòng)、應(yīng)用開發(fā)、來自中文社區(qū)的精選案例與問答等一線實(shí)踐知識(shí)等。本書在滿足現(xiàn)實(shí)中的數(shù)據(jù)庫管理及應(yīng)用需求的基礎(chǔ)上,重點(diǎn)突出WiredTiger存儲(chǔ)引擎和實(shí)踐案例的講解。
郭遠(yuǎn)威曾為華為前大數(shù)據(jù)遷移工程師,目前是亞信科技資深大數(shù)據(jù)顧問,在數(shù)據(jù)存儲(chǔ),特別是MongoDB方面有豐富的知識(shí)和實(shí)踐積累,有寫作經(jīng)驗(yàn)。
目錄
第1篇 MongoDB基礎(chǔ)知識(shí)
第1章 初識(shí)MongoDB 2
1.1 MongoDB的發(fā)展與現(xiàn)狀 2
1.2 MongoDB與Hadoop比較 5
1.3 關(guān)鍵特性 8
1.4 安裝部署 10
1.4.1 在Windows中安裝MongoDB 11
1.4.2 在Linux中安裝MongoDB 11
1.4.3 在Docker中安裝MongoDB 13
1.5 幾個(gè)重要的可執(zhí)行文件 16
1.6 適合的業(yè)務(wù) 19
1.6.1 高并發(fā)Web應(yīng)用 19
1.6.2 實(shí)時(shí)計(jì)算類的應(yīng)用 20
1.6.3 數(shù)據(jù)中臺(tái) 20
1.6.4 游戲類應(yīng)用 21
1.6.5 日志分析類系統(tǒng) 22
1.6.6 AI應(yīng)用場景 22
1.7 小結(jié) 24
第2章 CRUD操作 25
2.1 查詢操作 25
2.1.1 查詢條件 27
2.1.2 比較操作符 28
2.1.3 邏輯操作符 30
2.1.4 字段名匹配 31
2.1.5 文本查詢 32
2.1.6 正則表達(dá)式 34
2.1.7 嵌套文檔查詢 34
2.1.8 數(shù)組查詢 35
2.1.9 地理位置查詢 38
2.1.10 查詢投射與排序 40
2.2 插入操作 41
2.2.1 insertOne 41
2.2.2 insertMany 42
2.2.3 insert 44
2.3 修改操作 45
2.3.1 updateOne 45
2.3.2 updateMany 48
2.3.3 replaceOne 52
2.3.4 update 53
2.4 刪除操作 55
2.4.1 deleteOne 55
2.4.2 deleteMany 55
2.5 批量寫操作 56
2.6 小結(jié) 58
第3章 索引 59
3.1 索引原理 59
3.2 創(chuàng)建索引 61
3.3 單個(gè)字段的索引 61
3.4 多字段的復(fù)合索引 63
3.5 數(shù)組的多鍵索引 65
3.6 查詢計(jì)劃分析 66
3.7 索引覆蓋查詢 70
3.8 全文索引 71
3.9 地理位置索引 72
3.10 Hash索引 73
3.11 刪除索引 73
3.12 TTL索引 74
3.13 小結(jié) 76
第4章 聚集操作 77
4.1 單個(gè)集合中的基礎(chǔ)聚集函數(shù) 77
4.1.1 count()函數(shù) 77
4.1.2 estimatedDocumentCount()函數(shù) 79
4.1.3 countDocuments()函數(shù) 80
4.1.4 distinct()函數(shù) 80
4.2 管道聚集框架 82
4.2.1 $group分組 84
4.2.2 $addFields添加新字段 85
4.2.3 $lookup關(guān)聯(lián)查詢 86
4.2.4 $project投射 88
4.2.5 $out將結(jié)果輸出到新集合 88
4.2.6 MongoDB聚集操作語句與SQL語句的比較 89
4.3 MapReduce編程 89
4.4 小結(jié) 92
第2篇 深入理解MongoDB
第5章 WiredTiger存儲(chǔ)引擎 94
5.1 存儲(chǔ)引擎的數(shù)據(jù)結(jié)構(gòu) 95
5.1.1 典型的B-Tree數(shù)據(jù)結(jié)構(gòu) 95
5.1.2 磁盤中的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu) 96
5.1.3 內(nèi)存中的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu) 97
5.1.4 page的其他數(shù)據(jù)結(jié)構(gòu) 99
5.2 page eviction頁面淘汰 100
5.3 page reconcile將數(shù)據(jù)寫入磁盤 101
5.4 Cache的分配規(guī)則 102
5.5 page的生命周期、狀態(tài)、大小 103
5.5.1 page的生命周期 104
5.5.2 page的各種狀態(tài) 105
5.5.3 page的大小參數(shù) 105
5.6 checkpoint的原理 107
5.6.1 checkpoint包含的關(guān)鍵信息 108
5.6.2 checkpoint執(zhí)行流程與觸發(fā)時(shí)機(jī) 109
5.7 wt工具和磁盤中的元數(shù)據(jù)文件 111
5.7.1 wt工具 111
5.7.2 元數(shù)據(jù)相關(guān)文件 112
5.8 事務(wù) 115
5.8.1 事務(wù)的基本原理 115
5.8.2 與事務(wù)相關(guān)的數(shù)據(jù)結(jié)構(gòu) 118
5.8.3 事務(wù)的snapshot隔離 119
5.8.4 MVCC并發(fā)控制機(jī)制 120
5.8.5 事務(wù)日志(Journal) 122
5.9 一個(gè)完整的寫操作流程 123
5.10 小結(jié) 124
第6章 復(fù)制集 125
6.1 復(fù)制集功能概述 125
6.2 復(fù)制集部署架構(gòu) 126
6.2.1 典型的3節(jié)點(diǎn)復(fù)制集部署架構(gòu) 126
6.2.2 多數(shù)據(jù)中心復(fù)制集部署架構(gòu) 128
6.3 完整部署一個(gè)復(fù)制集 129
6.3.1 創(chuàng)建每個(gè)節(jié)點(diǎn)上存儲(chǔ)數(shù)據(jù)的目錄 129
6.3.2 創(chuàng)建每個(gè)節(jié)點(diǎn)的日志文件 130
6.3.3 創(chuàng)建每個(gè)節(jié)點(diǎn)啟動(dòng)時(shí)的配置文件 130
6.3.4 啟動(dòng)每個(gè)節(jié)點(diǎn)上的mongod實(shí)例 131
6.3.5 初始化復(fù)制集 131
6.3.6 將其他節(jié)點(diǎn)添加到復(fù)制集 132
6.3.7 觀察復(fù)制集的運(yùn)行狀態(tài) 132
6.4 復(fù)制集的維護(hù) 137
6.4.1 刪除節(jié)點(diǎn) 137
6.4.2 添加Secondary節(jié)點(diǎn) 138
6.4.3 添加Arbiter節(jié)點(diǎn) 140
6.4.4 復(fù)制集的配置信息 140
6.4.5 重新配置復(fù)制集 143
6.4.6 故障轉(zhuǎn)移Failover分析 145
6.5 復(fù)制集選舉Primary節(jié)點(diǎn)的機(jī)制 149
6.5.1 復(fù)制集中的投票節(jié)點(diǎn)和非投票節(jié)點(diǎn) 149
6.5.2 選舉觸發(fā)條件和選舉為Primary節(jié)點(diǎn)的因素 150
6.5.3 復(fù)制集能正常完成選舉的條件 152
6.6 基于Oplog的數(shù)據(jù)同步機(jī)制 154
6.6.1 Oplog集合包含的內(nèi)容分析 155
6.6.2 Oplog的默認(rèn)大小及性能影響 156
6.6.3 Oplog集合大小的修改 158
6.6.4 使用initial sync解決Oplog嚴(yán)重落后的問題 159
6.7 寫關(guān)注(writeConcern)模式 162
6.7.1 默認(rèn)的“寫關(guān)注”場景 162
6.7.2 配置寫關(guān)注 162
6.8 讀參考(readPreference)模式 165
6.8.1 讀參考常見的應(yīng)用場景 166
6.8.2 讀參考的幾種模式分析 167
6.8.3 設(shè)置tags標(biāo)簽使讀請(qǐng)求指向特定節(jié)點(diǎn) 168
6.8.4 如何從多個(gè)匹配的節(jié)點(diǎn)中選擇一個(gè)目標(biāo) 169
6.9 讀關(guān)注(readConcern)模式 171
6.9.1 Primary節(jié)點(diǎn)切換可能導(dǎo)致數(shù)據(jù)回滾 171
6.9.2 設(shè)置讀關(guān)注避免讀到的數(shù)據(jù)被回滾 172
6.10 Change Streams實(shí)現(xiàn)數(shù)據(jù)實(shí)時(shí)同步 176
6.10.1 實(shí)現(xiàn)原理 176
6.10.2 實(shí)時(shí)數(shù)據(jù)流的格式 177
6.10.3 打開實(shí)時(shí)數(shù)據(jù)流 178
6.10.4 控制實(shí)時(shí)數(shù)據(jù)流的輸出 179
6.11 小結(jié) 181
第7章 分片集群 182
7.1 分片集群的部署架構(gòu) 182
7.2 手動(dòng)部署一個(gè)分片集群 184
7.2.1 分片shard1配置 184
7.2.2 分片shard2配置 186
7.2.3 config服務(wù)器配置 187
7.2.4 mongos路由配置 188
7.2.5 啟動(dòng)分片集群 189
7.2.6 配置集合使其分片 192
7.2.7 正確關(guān)閉和重啟集群 194
7.3 片鍵及選擇策略 195
7.3.1 片鍵選擇策略 197
7.3.2 基于Hash分片 200
7.3.3 基于范圍的分片 203
7.4 chunk 204
7.4.1 chunk的分割 204
7.4.2 chunk大小的修改 209
7.5 Balancer 210
7.5.1 一個(gè)完整的chunk遷移過程 212
7.5.2 Balancer的管理 214
7.5.3 存儲(chǔ)元數(shù)據(jù)的config數(shù)據(jù)庫 217
7.6 小結(jié) 220
第8章 分布式文件存儲(chǔ)GridFS 221
8.1 什么是GridFS 222
8.2 使用GridFS的場景 226
8.3 GridFS常用操作 227
8.3.1 上傳文件 228
8.3.2 下載文件 229
8.3.3 刪除文件 230
8.3.4 查詢文件 230
8.4 小結(jié) 231
第3篇 MongoDB運(yùn)維管理
第9章 管理與監(jiān)控 234
9.1 數(shù)據(jù)導(dǎo)入/導(dǎo)出 234
9.1.1 導(dǎo)出工具mongoexport 235
9.1.2 導(dǎo)入工具mongoimport 237
9.2 數(shù)據(jù)備份/恢復(fù) 240
9.2.1 備份工具mongodump 241
9.2.2 恢復(fù)工具mongorestore 243
9.3 命令行工具監(jiān)控管理 245
9.3.1 mongotop 246
9.3.2 mongostat 247
9.3.3 db.stats() 249
9.3.4 db.serverStatus() 251
9.4 可視化數(shù)據(jù)庫操作 256
9.4.1 Compass工具的安裝與連接 256
9.4.2 可視化性能監(jiān)控 257
9.4.3 可視化數(shù)據(jù)庫操作 258
9.4.4 可視化聚集操作 262
9.4.5 內(nèi)嵌mongoshell開發(fā)環(huán)境 263
9.5 小結(jié) 264
第10章 權(quán)限控制 265
10.1 基于角色與權(quán)限控制原理 265
10.2 啟動(dòng)角色權(quán)限控制功能 267
10.3 MongoDB默認(rèn)提供的角色 271
10.3.1 針對(duì)特定數(shù)據(jù)庫中的讀/寫角色 271
10.3.2 針對(duì)特定數(shù)據(jù)庫中的管理角色 272
10.3.3 針對(duì)所有數(shù)據(jù)庫中的角色 272
10.3.4 超級(jí)用戶角色 273
10.4 用戶管理 274
10.4.1 查看數(shù)據(jù)庫中的用戶 274
10.4.2 創(chuàng)建新用戶 275
10.4.3 修改用戶的角色 276
10.4.4 刪除用戶 276
10.5 角色管理 277
10.5.1 查看數(shù)據(jù)庫中的角色 278
10.5.2 查看角色對(duì)應(yīng)的權(quán)限信息 278
10.5.3 創(chuàng)建一個(gè)自定義角色 280
10.5.4 驗(yàn)證自定義角色的權(quán)限 282
10.5.5 刪除自定義的角色 283
10.6 小結(jié) 283
第4篇 MongoDB應(yīng)用實(shí)踐
第11章 MongoDB應(yīng)用開發(fā) 286
11.1 基于Python的開發(fā) 286
11.1.1 單實(shí)例中的CRUD操作 287
11.1.2 復(fù)制集中的操作 290
11.1.3 分片集群中的操作 291
11.1.4 GridFS分布式文件操作 292
11.2 基于.net core的開發(fā) 294
11.2.1 CRUD操作 296
11.2.2 GridFS分布式文件操作 298
11.3 基于Java和Spring Boot框架的開發(fā) 301
11.3.1 開發(fā)框架介紹 301
11.3.2 CRUD操作 304
11.4 小結(jié) 306
第12章 基于MongoDB的數(shù)據(jù)中臺(tái)案例 308
12.1 現(xiàn)代企業(yè)數(shù)據(jù)架構(gòu)及痛點(diǎn) 308
12.2 什么是數(shù)據(jù)中臺(tái) 309
12.3 數(shù)據(jù)中臺(tái)的價(jià)值 312
12.4 數(shù)據(jù)中臺(tái)的技術(shù)模塊 313
12.5 基于MongoDB的數(shù)據(jù)中臺(tái)方案 320
12.6 數(shù)據(jù)中臺(tái)方案選型 327
12.7 小結(jié) 328
第13章 百萬級(jí)高并發(fā)集群性能提高案例 329
13.1 背景 329
13.2 軟件優(yōu)化 330
13.2.1 業(yè)務(wù)層面優(yōu)化 330
13.2.2 MongoDB線程模型優(yōu)化 331
13.2.3 WiredTiger存儲(chǔ)引擎優(yōu)化 333
13.3 解決服務(wù)器系統(tǒng)磁盤I/O問題 342
13.3.1 服務(wù)器I/O硬件問題背景 342
13.3.2 服務(wù)器I/O硬件問題解決后性能對(duì)比 343
13.4 主節(jié)點(diǎn)硬件升級(jí)后續(xù)優(yōu)化 346
13.4.1 readConcern配置優(yōu)化 346
13.4.2 替換從節(jié)點(diǎn)服務(wù)器為升級(jí)后的高I/O服務(wù)器 350
13.4.3 結(jié)論 351
13.4.4 繼續(xù)優(yōu)化調(diào)整存儲(chǔ)引起參數(shù) 352
13.5 小結(jié) 353
第14章 基于MongoDB的金融系統(tǒng)案例 355
14.1 項(xiàng)目背景 355
14.2 面臨的主要挑戰(zhàn) 355
14.3 技術(shù)選型 356
14.4 方案介紹 356
14.5 技術(shù)創(chuàng)新 358
14.6 技術(shù)特點(diǎn) 359
14.7 運(yùn)營情況 360
14.8 項(xiàng)目成效 360
14.9 小結(jié) 361
第15章 云原生MongoDB部署案例 363
15.1 部署環(huán)境準(zhǔn)備 363
15.2 Docker安裝 364
15.3 Kubernetes組件安裝 365
15.4 集群Master節(jié)點(diǎn)初始化 366
15.5 將Work節(jié)點(diǎn)添加到集群 369
15.6 分布式網(wǎng)絡(luò)文件系統(tǒng)安裝 369
15.7 PV、PVC、Deployment配置 372
15.8 小結(jié) 374
第16章 常見問題分析 375
16.1 集合與關(guān)系型數(shù)據(jù)庫表的區(qū)別 375
16.2 是否支持事務(wù) 376
16.3 鎖的類型及粒度有哪些 377
16.4 服務(wù)器的內(nèi)存多大合適 378
16.5 如何解決join查詢需求 379
16.6 創(chuàng)建索引對(duì)性能的影響 380
16.7 GridFS適合什么應(yīng)用場景 381
16.8 Journaling、Oplog、Log三種日志的區(qū)別 382
16.9 連接數(shù)設(shè)置為多少合適 383
16.10 集合被分片后是否可以修改片鍵 387
16.11 為什么分片集合中的文檔記錄沒有分布到所有分片上 387
16.12 通過mongos連接集群時(shí)連接數(shù)分析 387
16.13 復(fù)制集節(jié)點(diǎn)之間是否可以使用不同的存儲(chǔ)引擎 388