MongoDB 進階與實戰:微服務整合、性能優化、架構管理
內容描述
本書圍繞如何用好MongoDB這個復雜命題,利用大部分篇幅講述了MongoDB在應用開發方面的各種進階技巧,同時也介紹了MongoDB 4.0版本的事務特性及微服務相關的技術範例。很多基本的數據庫問題都可以從MongoDB的官方文檔中找到答案,但官方文檔中在MongoDB周邊技術棧的整合、系統管理及調優方面仍然缺乏一些富有針對性的內容,所以本書在結合一些實踐案例的前提下,以開發管理者的角度對MongoDB技術進行了系統地梳理,希望能夠讓讀者的學習達到事半功倍的效果。相信本書會對應用MongoDB的開發人員具有廣泛的指導意義。
目錄大綱
第1部分MongoDB入門
第1章什麼是MongoDB 1
1.1認識MongoDB 1
1.1.1面向文檔設計1
1.1.2特性3
1.1.3優勢4
1.1.4需要克服的困難6
1.2類比SQL模型7
1.2.1數據結構7
1.2.2類SQL語句8
第2章體驗MongoDB 11
2.1安裝MongoDB 11
2.1.1 Linux環境下的安裝11
2. 1.2 Windows環境下的安裝15
2.2使用mongo shell 19
2.3插入文檔22
2.4查詢文檔24
2.4.1查詢全部數據24
2.4.2指定條件查詢25
2.4. 3排序、分頁25
2.4.4使用投射25
2.4.5查詢限定符26
2.5更新文檔27
2.5.1 update命令27
2.5.2 findAndModify命令29
2.5.3更新操作符30
2.6刪除文檔31
2.6.1刪除單個文檔31
2.6.2刪除指定條件文檔31
2.6.3刪除全部文檔32
2.6.4返回被刪除文檔32
2.7使用聚合33
2.8計算文檔大小34
2.8.1查看集合大小34
2.8.2計算文檔大小35
2.9小技巧――定義mongo shell環境36
第3章數據模型37
3.1 BSON協議與類型37
3.1.1 JSON標準37
3.1.2 BSON和JSON 38
3.1.3 BSON的數據類型39
3.2使用日期40
3.3 ObjectId生成器41
3.4數組、內嵌44
3.4.1內嵌文檔45
3.4.2數組45
3.4.3嵌套型的數組47
3.5固定集合48
3.5.1固定集合簡介48
3.5.2使用示例49
3.5.3特徵與限制51
3.5.4適用場景52
3.6小技巧――使用固定集合實現FIFO隊列52
第4章索引介紹56
4.1索引簡述56
4.2單鍵、複合索引57
4.2.1單字段索引57
4.2.2複合索引58
4.3數組索引58
4.4地理空間索引59
4.5唯一性約束60
4.6 TTL索引63
4.7其他索引特性64
4.7.1條件索引64
4.7.2稀疏索引(sparse =true) 65
4.7.3文本索引66
4.7.4模糊索引66
4.8小技巧――使用explain命令驗證優化67
第5章副本集72
5.1副本集架構72
5.2集群選舉73
5.2.1 Raft選舉算法73
5.2.2 MongoDB實現的擴展77
5.2.3 MongoDB選舉介紹77
5.2.4副本集模式79
5.3實時復制81
5.3.1 oplog複製81
5.3.2冪等性84
5.3.3複製延遲84
5.3.4初始化同步85
5.3.5數據回滾86
5.4自動故障轉移86
5.5搭建副本集89
5.5.1安裝副本集89
5.5.2創建用戶92
5.5.3寫入數據92
5.5.4主備節點切換93
5.6小技巧――檢查復制的延遲情況93
第6章分片97
6.1分片集群架構97
6.1.1分片簡介97
6.1.2分片集群架構97
6.2分片策略98
6.2.1什麼是chunk 99
6.2.2分片算法100
6.2.3分片鍵的選擇101
6.3讀寫分發模式101
6.3.1數據分發流程101
6 .3.2避免廣播操作103
6.3.3保證索引唯一性104
6.4數據均衡104
6.4.1均衡的方式104
6.4.2 chunk分裂105
6.4.3自動均衡106
6 .4.4數據均衡帶來的問題108
6.5使用mtools搭建集群108
6.5.1 mtools介紹109
6.5.2準備工作109
6.5.3安裝mtools 109
6.5.4創建分片集群110
6.5.5停止、啟動112
6.6使用分片集群112
6.7小技巧――使用標籤114
6.7.1分片標籤114
6.7.2使用場景115
第2部分MongoDB微服務開發
第7章微服務入門117
7.1微服務定義117
7.1.1什麼是微服務117
7.1.2理解微服務117
7.1.3微服務的通用特性120
7.1.4微服務不是“銀彈” 121
7.2微服務基礎設施121
7.2.1服務註冊121
7.2.2服務發現122
7.2.3 API網關123
7.2.4服務容錯123
7.2 .5服務監控124
7.2.6配置中心124
7.2.7接口調用124
7.2.8容器化125
7.3 CAP與BASE理論125
7.3.1 CAP理論125
7.3.2 BASE理論126
7.4為什麼MongoDB適合微服務127
第8章使用Java操作MongoDB 131
8.1搭建Java開發環境131
8.1.1安裝JDK 131
8.1.2安裝IDEA 132
8.2安裝Robo 3T 134
8.2.1 Robo 3T介紹134
8.2.2下載安裝134
8.2.3連接數據庫135
8.2.4操作數據136
8.3使用MongoDB Java Driver 137
8.3.1引入框架137
8.3.2連接數據庫137
8.3.3使用構建器138
8.4實例:文章列表的存儲與檢索141
8.4.1集合操作141
8.4.2文檔操作143
8.5異步驅動146
8.5.1理解響應式146
8.5.2使用響應式流147
8.6使用CommandListener檢測慢操作152
8.7 MongoDB Java Driver的工作原理155
8.7.1游標155
8.7.2連接池158
8.7.3故障轉移160
8.7.4連接池相關參數161
8.8小技巧――如何監視驅動的連接數161
第9章SpringBoot框架整合165
9.1 SpringBoot簡介165
9.1.1 SpringBoot是什麼165
9.1.2 “腳手架”風格167
9.2第一個SpringBoot項目168
9.2.1初始化項目168
9.2.2添加啟動類172
9.2.3編寫Echo接口172
9.2.4配置文件173
9.2.5啟動程序174
9.2.6熱加載175
9.3 Spring Data框架介紹176
9.3.1 Spring Data 176
9.3.2 Spring Data MongoDB 178
9 .4使用Spring Data MongoDB操作數據庫179
9.4.1引入依賴179
9.4.2配置文件180
9.4.3數據模型180
9.4.4數據操作181
9.4.5啟動測試183
9 .5高級操作184
9.5.1實現投射184
9.5.2使用QBE 186
9.5.3自定義Repository方法187
9.6自定義配置190
9.6.1 Spring Boot通用配置190
9. 6.2 JavaConfig配置191
9.6.3自動配置的原理192
9.7實現單元測試194
9.7.1使用flapdoodle.embed.mongo 194
9.7.2原理解析198
9.7.3定制化集成200
9.8多數據源203
9.9使用審計功能208
9.9.1使用註解208
9.9.2實現審計209
9.10小技巧――自定義數據序列化方式210
第10章項目實戰215
10.1初始化項目215
10.2實現資源抓取219
10.3發布RssFeed 229
10.4統計功能232
10.5開發門戶界面235
10.5.1前端組件235
10.5.2 RSS門戶應用237
10.5.3實現後台接口249
10.6打包應用程序252
10.6.1使用spring-boot-maven-
plugin插件252
10.6.2使用assembly插件253
第3部分MongoDB高效進階
第11章性能基準257
11.1性能基準257
11.1.1了解基準測試257
11.1.2吞吐量、並發數、響應時間258
11.2 WiredTiger讀寫模型259
11.2.1讀緩存259
11.2.2寫緩衝260
11.2.3緩存頁管理262
11.2.4數據壓縮264
11.2.5小結265
11.3性能監控工具265
11.3.1 mongostat 265
11.3.2 mongotop 267
11.3.3 Profiler模塊269
11.3.4 db.currentOp 272
11.4使用YCSB測試MongoDB性能277
11.4.1 YCSB簡介277
11.4.2執行壓力測試279
11.4.3生成時序指標序列284
11.5使用nmon監視服務器性能285
第12章合理使用索引288
12.1索引檢索原理288
12.2索引檢索範例291
12.3覆蓋索引295
12.4查詢計劃298
12.4.1查詢計劃構成298
12.4.2 explain命令299
12.5實戰:查詢案例分析304
12.6查詢緩存原理322
12.6.1工作流程322
12.6.2案例323
12.6.3內部原理326
12.7強制命中328
12.7.1使用hint方法328
12.7.2使用IndexFilter方法329
12.8索引正交331
12.9使用MongoDB Compass 332
12.10優化原則333
第13章並發優化337
13.1 MongoDB的鎖模式337
13.2 MVCC 340
13.3原子性操作342
13.4樂觀鎖345
13.4.1電影院訂座的案例345
13.4.2版本號模式348
13.5緩解行鎖競爭349
13.6避免重複數據353
13.7那些影響並發的操作356
第14章應用設計調優358
14.1應用範式設計358
14.1.1什麼是范式358
14.1.2反範式設計360
14.2嵌套設計362
14.2.1在文檔內使用嵌套362
14.2.2表達關聯363
14 .3桶模式365
14.3.1桶模式365
14.3.2桶模式案例366
14.4海量數據分頁374
14.4.1傳統分頁模式375
14.4.2使用偏移量376
14. 4.3折中處理380
14.5批操作381
14.5.1批量讀381
14.5.2批量寫383
14.6讀寫分離與一致性385
14.6.1讀寫分離385
14.6.2讀寫關注387
14.6.3讀自身的寫入(Read yourown writes) 390
14.6.4因果一致性391
14.6.5小結392
14.7聚合範例392
14.7.1聚合框架介紹392
14.7.2找出重複數據393
14.7.3寫入中間表393
14.7. 4表連接(join) 397
14.7.5使用要點401
第15章高級特性402
15.1 Change Stream介紹402
15.2 Change Stream案例:數據遷移408
15.2.1關鍵點409
15.2. 2實戰:使用Change Stream實現增量遷移410
15.2.3小結420
15.3多文檔事務421
15.3.1事務簡介421
15.3.2 MongoDB中的事務422
15.4基於Spring開發事務426
15.4.1在驅動中實現事務426
15.4.2使用Spring Data實現事務428
15.5事務實現原理432
15.5.1 MVCC與快照的一致性432
15.5.2事務持久性434
15.5.3讀寫隔離設定435
15.6寫衝突模式437
15.7使用事務的限制440
第4部分MongoDB架構管理
第16章安全管理441
16.1 MongoDB如何鑑權441
16.1.1初體驗441
16.1.2理解身份認證與授權443
16.1.3身份認證方式443
16.1.4 RBAC訪問控制446
16.2角色管理447
16.2.1角色管理命令447
16.2.2系統內置角色448
16.2.3創建自定義角色449
16.3最小權限原則450
16.4安全最佳實踐452
第17章高可靠457
17.1節點部署優化457
17.1.1硬件規劃457
17.1.2系統調優458
17.1.3數據庫配置460
17.2集群高可靠461
17. 2.1反親和部署462
17.2.2避免集中存儲462
17.2.3警惕資源超分463
17.3應用層高可靠463
17.3.1故障隔離463
17.3.2故障轉移/恢復465
17.4備份可靠性466
17.4.1邏輯備份466
17.4.2物理備份468
17.4.3增量備份469
17.5容災可靠性470
17.5.1同城災備471
17.5.2異地災備472
17.5.3異地多活473
第18章治理經驗476
18.1強化約束476
18.1 .1使用JSON Schema 476
18.1.2管理文檔結構478
18.2使用Mongobee實現升級478
18.2.1模式演進478
18.2.2 Mongobee介紹479
18.2.3範例480
18.3規範與自動化484
18.3.1開發規範485
18.3.2實現自動化486
18.4運維管理487
18.4.1容量規劃487
18.4.2監控時關注哪些指標490
作者介紹
唐卓章(博客園ID:美碼師)。
十年研發老兵,持續關注NoSQL分佈式數據庫技術,在系統高可用、彈性擴展、性能調優等方面有著豐富的實踐及管理經驗。
MongoDB中文社區核心成員之一。
常活躍於Mongoing社區原創及問答板塊。
華為雲MongoDB 技術專家。
致力於萬物互聯事業,負責物聯網平台系統的架設及研發工作。