本書主要包括MongoDB安裝部署、增刪改查、索引、聚集框架等基礎知識;WiredTiger存儲引擎、事務、復制集、分片集群等高階知識;MongoDB的導入導出、備份恢復、性能監(jiān)控、權限控制等運維管理知識;MongoDB的驅動、應用開發(fā)、來自中文社區(qū)的精選案例與問答等一線實踐知識等。本書在滿足現(xiàn)實中的數(shù)據(jù)庫管理及應用需求的基礎上,重點突出WiredTiger存儲引擎和實踐案例的講解。
郭遠威曾為華為前大數(shù)據(jù)遷移工程師,目前是亞信科技資深大數(shù)據(jù)顧問,在數(shù)據(jù)存儲,特別是MongoDB方面有豐富的知識和實踐積累,有寫作經(jīng)驗。
目錄
第1篇 MongoDB基礎知識
第1章 初識MongoDB 2
1.1 MongoDB的發(fā)展與現(xiàn)狀 2
1.2 MongoDB與Hadoop比較 5
1.3 關鍵特性 8
1.4 安裝部署 10
1.4.1 在Windows中安裝MongoDB 11
1.4.2 在Linux中安裝MongoDB 11
1.4.3 在Docker中安裝MongoDB 13
1.5 幾個重要的可執(zhí)行文件 16
1.6 適合的業(yè)務 19
1.6.1 高并發(fā)Web應用 19
1.6.2 實時計算類的應用 20
1.6.3 數(shù)據(jù)中臺 20
1.6.4 游戲類應用 21
1.6.5 日志分析類系統(tǒng) 22
1.6.6 AI應用場景 22
1.7 小結 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 正則表達式 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 小結 58
第3章 索引 59
3.1 索引原理 59
3.2 創(chuàng)建索引 61
3.3 單個字段的索引 61
3.4 多字段的復合索引 63
3.5 數(shù)組的多鍵索引 65
3.6 查詢計劃分析 66
3.7 索引覆蓋查詢 70
3.8 全文索引 71
3.9 地理位置索引 72
3.10 Hash索引 73
3.11 刪除索引 73
3.12 TTL索引 74
3.13 小結 76
第4章 聚集操作 77
4.1 單個集合中的基礎聚集函數(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關聯(lián)查詢 86
4.2.4 $project投射 88
4.2.5 $out將結果輸出到新集合 88
4.2.6 MongoDB聚集操作語句與SQL語句的比較 89
4.3 MapReduce編程 89
4.4 小結 92
第2篇 深入理解MongoDB
第5章 WiredTiger存儲引擎 94
5.1 存儲引擎的數(shù)據(jù)結構 95
5.1.1 典型的B-Tree數(shù)據(jù)結構 95
5.1.2 磁盤中的基礎數(shù)據(jù)結構 96
5.1.3 內存中的基礎數(shù)據(jù)結構 97
5.1.4 page的其他數(shù)據(jù)結構 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包含的關鍵信息 108
5.6.2 checkpoint執(zhí)行流程與觸發(fā)時機 109
5.7 wt工具和磁盤中的元數(shù)據(jù)文件 111
5.7.1 wt工具 111
5.7.2 元數(shù)據(jù)相關文件 112
5.8 事務 115
5.8.1 事務的基本原理 115
5.8.2 與事務相關的數(shù)據(jù)結構 118
5.8.3 事務的snapshot隔離 119
5.8.4 MVCC并發(fā)控制機制 120
5.8.5 事務日志(Journal) 122
5.9 一個完整的寫操作流程 123
5.10 小結 124
第6章 復制集 125
6.1 復制集功能概述 125
6.2 復制集部署架構 126
6.2.1 典型的3節(jié)點復制集部署架構 126
6.2.2 多數(shù)據(jù)中心復制集部署架構 128
6.3 完整部署一個復制集 129
6.3.1 創(chuàng)建每個節(jié)點上存儲數(shù)據(jù)的目錄 129
6.3.2 創(chuàng)建每個節(jié)點的日志文件 130
6.3.3 創(chuàng)建每個節(jié)點啟動時的配置文件 130
6.3.4 啟動每個節(jié)點上的mongod實例 131
6.3.5 初始化復制集 131
6.3.6 將其他節(jié)點添加到復制集 132
6.3.7 觀察復制集的運行狀態(tài) 132
6.4 復制集的維護 137
6.4.1 刪除節(jié)點 137
6.4.2 添加Secondary節(jié)點 138
6.4.3 添加Arbiter節(jié)點 140
6.4.4 復制集的配置信息 140
6.4.5 重新配置復制集 143
6.4.6 故障轉移Failover分析 145
6.5 復制集選舉Primary節(jié)點的機制 149
6.5.1 復制集中的投票節(jié)點和非投票節(jié)點 149
6.5.2 選舉觸發(fā)條件和選舉為Primary節(jié)點的因素 150
6.5.3 復制集能正常完成選舉的條件 152
6.6 基于Oplog的數(shù)據(jù)同步機制 154
6.6.1 Oplog集合包含的內容分析 155
6.6.2 Oplog的默認大小及性能影響 156
6.6.3 Oplog集合大小的修改 158
6.6.4 使用initial sync解決Oplog嚴重落后的問題 159
6.7 寫關注(writeConcern)模式 162
6.7.1 默認的“寫關注”場景 162
6.7.2 配置寫關注 162
6.8 讀參考(readPreference)模式 165
6.8.1 讀參考常見的應用場景 166
6.8.2 讀參考的幾種模式分析 167
6.8.3 設置tags標簽使讀請求指向特定節(jié)點 168
6.8.4 如何從多個匹配的節(jié)點中選擇一個目標 169
6.9 讀關注(readConcern)模式 171
6.9.1 Primary節(jié)點切換可能導致數(shù)據(jù)回滾 171
6.9.2 設置讀關注避免讀到的數(shù)據(jù)被回滾 172
6.10 Change Streams實現(xiàn)數(shù)據(jù)實時同步 176
6.10.1 實現(xiàn)原理 176
6.10.2 實時數(shù)據(jù)流的格式 177
6.10.3 打開實時數(shù)據(jù)流 178
6.10.4 控制實時數(shù)據(jù)流的輸出 179
6.11 小結 181
第7章 分片集群 182
7.1 分片集群的部署架構 182
7.2 手動部署一個分片集群 184
7.2.1 分片shard1配置 184
7.2.2 分片shard2配置 186
7.2.3 config服務器配置 187
7.2.4 mongos路由配置 188
7.2.5 啟動分片集群 189
7.2.6 配置集合使其分片 192
7.2.7 正確關閉和重啟集群 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 一個完整的chunk遷移過程 212
7.5.2 Balancer的管理 214
7.5.3 存儲元數(shù)據(jù)的config數(shù)據(jù)庫 217
7.6 小結 220
第8章 分布式文件存儲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 小結 231
第3篇 MongoDB運維管理
第9章 管理與監(jiān)控 234
9.1 數(shù)據(jù)導入/導出 234
9.1.1 導出工具mongoexport 235
9.1.2 導入工具mongoimport 237
9.2 數(shù)據(jù)備份/恢復 240
9.2.1 備份工具mongodump 241
9.2.2 恢復工具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 內嵌mongoshell開發(fā)環(huán)境 263
9.5 小結 264
第10章 權限控制 265
10.1 基于角色與權限控制原理 265
10.2 啟動角色權限控制功能 267
10.3 MongoDB默認提供的角色 271
10.3.1 針對特定數(shù)據(jù)庫中的讀/寫角色 271
10.3.2 針對特定數(shù)據(jù)庫中的管理角色 272
10.3.3 針對所有數(shù)據(jù)庫中的角色 272
10.3.4 超級用戶角色 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 查看角色對應的權限信息 278
10.5.3 創(chuàng)建一個自定義角色 280
10.5.4 驗證自定義角色的權限 282
10.5.5 刪除自定義的角色 283
10.6 小結 283
第4篇 MongoDB應用實踐
第11章 MongoDB應用開發(fā) 286
11.1 基于Python的開發(fā) 286
11.1.1 單實例中的CRUD操作 287
11.1.2 復制集中的操作 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 小結 306
第12章 基于MongoDB的數(shù)據(jù)中臺案例 308
12.1 現(xiàn)代企業(yè)數(shù)據(jù)架構及痛點 308
12.2 什么是數(shù)據(jù)中臺 309
12.3 數(shù)據(jù)中臺的價值 312
12.4 數(shù)據(jù)中臺的技術模塊 313
12.5 基于MongoDB的數(shù)據(jù)中臺方案 320
12.6 數(shù)據(jù)中臺方案選型 327
12.7 小結 328
第13章 百萬級高并發(fā)集群性能提高案例 329
13.1 背景 329
13.2 軟件優(yōu)化 330
13.2.1 業(yè)務層面優(yōu)化 330
13.2.2 MongoDB線程模型優(yōu)化 331
13.2.3 WiredTiger存儲引擎優(yōu)化 333
13.3 解決服務器系統(tǒng)磁盤I/O問題 342
13.3.1 服務器I/O硬件問題背景 342
13.3.2 服務器I/O硬件問題解決后性能對比 343
13.4 主節(jié)點硬件升級后續(xù)優(yōu)化 346
13.4.1 readConcern配置優(yōu)化 346
13.4.2 替換從節(jié)點服務器為升級后的高I/O服務器 350
13.4.3 結論 351
13.4.4 繼續(xù)優(yōu)化調整存儲引起參數(shù) 352
13.5 小結 353
第14章 基于MongoDB的金融系統(tǒng)案例 355
14.1 項目背景 355
14.2 面臨的主要挑戰(zhàn) 355
14.3 技術選型 356
14.4 方案介紹 356
14.5 技術創(chuàng)新 358
14.6 技術特點 359
14.7 運營情況 360
14.8 項目成效 360
14.9 小結 361
第15章 云原生MongoDB部署案例 363
15.1 部署環(huán)境準備 363
15.2 Docker安裝 364
15.3 Kubernetes組件安裝 365
15.4 集群Master節(jié)點初始化 366
15.5 將Work節(jié)點添加到集群 369
15.6 分布式網(wǎng)絡文件系統(tǒng)安裝 369
15.7 PV、PVC、Deployment配置 372
15.8 小結 374
第16章 常見問題分析 375
16.1 集合與關系型數(shù)據(jù)庫表的區(qū)別 375
16.2 是否支持事務 376
16.3 鎖的類型及粒度有哪些 377
16.4 服務器的內存多大合適 378
16.5 如何解決join查詢需求 379
16.6 創(chuàng)建索引對性能的影響 380
16.7 GridFS適合什么應用場景 381
16.8 Journaling、Oplog、Log三種日志的區(qū)別 382
16.9 連接數(shù)設置為多少合適 383
16.10 集合被分片后是否可以修改片鍵 387
16.11 為什么分片集合中的文檔記錄沒有分布到所有分片上 387
16.12 通過mongos連接集群時連接數(shù)分析 387
16.13 復制集節(jié)點之間是否可以使用不同的存儲引擎 388