序 XV
前言 XVII
第一部分 MongoDB 介紹
第1章 MongoDB 簡介 3
1.1 易於使用 3
1.2 易於擴展 4
1.3 豐富的功能 4
1.4 卓越的性能 5
1.5 小結 5
第2章 MongoDB 基礎知識 7
2.1 文檔 7
2.2 集閤 8
2.2.1 動態模式 8
2.2.2 命名 9
2.3 數據庫 10
2.4 啓動MongoDB 11
2.5 MongoDB shell 簡介 12
2.5.1 運行shell 12
2.5.2 MongoDB 客戶端 13
2.5.3 shell 中的基本操作 14
2.6 數據類型 16
2.6.1 基本數據類型 16
2.6.2 日期 18
2.6.3 數組 18
2.6.4 內嵌文檔 19
2.6.5 _id 和ObjectId 20
2.7 使用MongoDB shell 21
2.7.1 shell 小貼士 22
2.7.2 使用shell 執行腳本 23
2.7.3 創建.mongorc.js 文件 25
2.7.4 定製shell 提示 26
2.7.5 編輯復閤變量 26
2.7.6 集閤命名注意事項 27
第3章 創建、更新和刪除文檔 29
3.1 插入並保存文檔 29
3.1.1 批量插入 29
3.1.2 插入校驗 30
3.2 刪除文檔 31
3.3 更新文檔 32
3.3.1 文檔替換 32
3.3.2 使用修改器 34
3.3.3 upsert 45
3.3.4 更新多個文檔 47
3.3.5 返迴被更新的文檔 48
3.4 寫入安全機製 50
第4章 查詢 53
4.1 find 簡介 53
4.1.1 指定需要返迴的鍵 54
4.1.2 限製 55
4.2 查詢條件 55
4.2.1 查詢條件 55
4.2.2 OR 查詢 56
4.2.3 $not 57
4.2.4 條件語義 57
4.3 特定類型的查詢 58
4.3.1 null 58
4.3.2 正則錶達式 59
4.3.3 查詢數組 59
4.3.4 查詢內嵌文檔 64
4.4 $where 查詢 65
4.5 遊標 67
4.5.1 limit、skip 和sort 69
4.5.2 避免使用skip 略過大量結果 70
4.5.3 高級查詢選項 72
4.5.4 獲取一緻結果 73
4.5.5 遊標生命周期 75
4.6 數據庫命令 75
第二部分 設計應用
第5章 索引 81
5.1 索引簡介 81
5.1.1 復閤索引簡介 84
5.1.2 使用復閤索引 90
5.1.3 $ 操作符如何使用索引 91
5.1.4 索引對象和數組 96
5.1.5 索引基數 98
5.2 使用explain() 和hint() 98
5.3 何時不應該使用索引 103
5.4 索引類型 104
5.4.1 唯一索引 104
5.4.2 稀疏索引 106
5.5 索引管理 107
5.5.1 標識索引 108
5.5.2 修改索引 108
第6章 特殊的索引和集閤 111
6.1 固定集閤 111
6.1.1 創建固定集閤 113
6.1.2 自然排序 113
6.1.3 循環遊標 115
6.1.4 沒有_id 索引的集閤 115
6.2 TTL 索引 116
6.3 全文本索引 116
6.3.1 搜索語法 119
6.3.2 優化全文本搜索 120
6.3.3 在其他語言中搜索 121
6.4 地理空間索引 121
6.4.1 地理空間查詢的類型 122
6.4.2 復閤地理空間索引 123
6.4.3 2d 索引 123
6.5 使用GridFS 存儲文件 125
6.5.1 GridFS 入門 126
6.5.2 在MongoDB 驅動程序中使用GridFS 126
6.5.3 揭開GridFS 的麵紗 127
第7章 聚閤 129
7.1 聚閤框架 129
7.2 管道操作符 131
7.2.1 $match 132
7.2.2 $project 132
7.2.3 $group 137
7.2.4 $unwind 140
7.2.5 $sort 141
7.2.6 $limit 142
7.2.7 $skip 142
7.2.8 使用管道 142
7.3 MapReduce 143
7.3.1 示例1:找齣集閤中的所有鍵 143
7.3.2 示例2:網頁分類 145
7.3.3 MongoDB 和MapReduce 146
7.4 聚閤命令 148
7.4.1 count 149
7.4.2 distinct 149
7.4.3 group 150
第8章 應用程序設計 155
8.1 範式化與反範式化 155
8.1.1 數據錶示的例子 156
8.1.2 基數 159
8.1.3 好友、粉絲,以及其他的麻煩事項 160
8.2 優化數據操作 162
8.2.1 優化文檔增長 162
8.2.2 刪除舊數據 164
8.3 數據庫和集閤的設計 164
8.4 一緻性管理 165
8.5 模式遷移 166
8.6 不適閤使用MongoDB 的場景 167
第三部分 復製
第9章 創建副本集 171
9.1 復製簡介 171
9.2 建立副本集 172
9.3 配置副本集 176
9.3.1 rs 輔助函數 178
9.3.2 網絡注意事項 178
9.4 修改副本集配置 178
9.5 設計副本集 180
9.6 成員配置選項 184
9.6.1 選舉仲裁者 184
9.6.2 優先級 185
9.6.3 隱藏成員 186
9.6.4 延遲備份節點 187
9.6.5 創建索引 187
第10章 副本集的組成 189
10.1 同步 189
10.1.1 初始化同步 190
10.1.2 處理陳舊數據 193
10.2 心跳 193
10.3 選舉 195
10.4 迴滾 195
第11章 從應用程序連接副本集 201
11.1 客戶端到副本集的連接 201
11.2 等待寫入復製 202
11.2.1 可能導緻錯誤的原因 203
11.2.2 "w" 的其他值 204
11.3 自定義復製保證規則 204
11.3.1 保證復製到每個數據中心的一颱服務器上 204
11.3.2 保證寫操作被復製到可見節點中的“大多數” 206
11.3.3 創建其他規則 206
11.4 將讀請求發送到備份節點 207
11.4.1 齣於一緻性考慮 207
11.4.2 齣於負載的考慮 208
11.4.3 何時可以從備份節點讀取數據 208
第12章 管理 211
12.1 以單機模式啓動成員 211
12.2 副本集配置 212
12.2.1 創建副本集 212
12.2.2 修改副本集成員 213
12.2.3 創建比較大的副本集 213
12.2.4 強製重新配置 214
12.3 修改成員狀態 215
12.3.1 把主節點變為備份節點 215
12.3.2 阻止選舉 215
12.3.3 使用維護模式 215
12.4 監控復製 216
12.4.1 獲取狀態 216
12.4.2 復製圖譜 218
12.4.3 復製循環 220
12.4.4 禁用復製鏈 220
12.4.5 計算延遲 221
12.4.6 調整oplog 大小 222
12.4.7 從延遲備份節點中恢復 223
12.4.8 創建索引 224
12.4.9 在預算有限的情況下進行復製 225
12.4.10 主節點如何跟蹤延遲 226
12.5 主從模式 227
12.5.1 從主從模式切換到副本集模式 228
12.5.2 讓副本集模仿主從模式的行為 228
第四部分 分片
第13章 分片 233
13.1 分片簡介 233
13.2 理解集群的組件 234
13.3 快速建立一個簡單的集群 235
第14章 配置分片 243
14.1 何時分片 243
14.2 啓動服務器 244
14.2.1 配置服務器 244
14.2.2 mongos 進程 245
14.2.3 將副本集轉換為分片 245
14.2.4 增加集群容量 247
14.2.5 數據分片 247
14.3 MongoDB 如何追蹤集群數據 248
14.3.1 塊範圍 249
14.3.2 拆分塊 250
14.4 均衡器 254
第15章 選擇片鍵 257
15.1 檢查使用情況 257
15.2 數據分發 258
15.2.1 升序片鍵 258
15.2.2 隨機分發的片鍵 261
15.2.3 基於位置的片鍵 262
15.3 片鍵策略 263
15.3.1 散列片鍵 264
15.3.2 GridFS 的散列片鍵 265
15.3.3 流水策略 266
15.3.4 多熱點 267
15.4 片鍵規則和指導方針 270
15.4.1 片鍵限製 270
15.4.2 片鍵的勢 270
15.5 控製數據分發 270
15.5.1 對多個數據庫和集閤使用一個集群 270
15.5.2 手動分片 272
第16章 分片管理 275
16.1 檢查集群狀態 275
16.1.1 使用sh.status 查看集群摘要信息 275
16.1.2 檢查配置信息 277
16.2 查看網絡連接 282
16.2.1 查看連接統計 283
16.2.2 限製連接數量 283
16.3 服務器管理 285
16.3.1 添加服務器 285
16.3.2 修改分片的服務器 285
16.3.3 刪除分片 286
16.3.4 修改配置服務器 288
16.4 數據均衡 289
16.4.1 均衡器 289
16.4.2 修改塊大小 290
16.4.3 移動塊 290
16.4.4 特大塊 292
16.4.5 刷新配置 295
第五部分 應用管理
第17章 瞭解應用的動態 299
17.1 瞭解正在進行的操作 299
17.1.1 尋找有問題的操作 301
17.1.2 終止操作的執行 301
17.1.3 假象 302
17.1.4 避免幽靈操作 302
17.2 使用係統分析器 303
17.3 計算空間消耗 305
17.3.1 文檔 305
17.3.2 集閤 305
17.3.3 數據庫 306
17.4 使用mongotop 和monogostat 307
第18章 數據管理 311
18.1 配置身份驗證 311
18.1.1 身份驗證基本原理 312
18.1.2 配置身份驗證 313
18.1.3 身份驗證的工作原理 314
18.2 建立和刪除索引 315
18.2.1 在獨立的服務器上建立索引 315
18.2.2 在副本集上建立索引 315
18.2.3 在分片集群上建立索引 316
18.2.4 刪除索引 316
18.2.5 注意內存溢齣殺手 316
18.3 預熱數據 317
18.3.1 將數據庫移至內存 317
18.3.2 將集閤移至內存 318
18.3.3 自定義預熱 318
18.4 壓縮數據 320
18.5 移動集閤 321
18.6 預分配數據文件 322
第19章 持久性 323
19.1 日記係統的用途 323
19.1.1 批量提交寫入操作 324
19.1.2 設定提交時間間隔 325
19.2 關閉日記係統 325
19.2.1 替換數據文件 325
19.2.2 修復數據文件 326
19.2.3 關於mongod.lock 文件 326
19.2.4 隱蔽的異常退齣 327
19.3 MongoDB 無法保證的事項 327
19.4 檢驗數據損壞 327
19.5 副本集中的持久性 329
第六部分 服務器管理
第20章 啓動和停止MongoDB 333
20.1 從命令行啓動 333
20.2 停止MongoDB 336
20.3 安全性 337
20.3.1 數據加密 338
20.3.2 SSL 安全連接 338
20.4 日誌 338
第21章 監控MongoDB 341
21.1 監控內存使用狀況 341
21.1.1 有關電腦內存的介紹 341
21.1.2 跟蹤監測內存使用狀況 342
21.1.3 跟蹤監測缺頁中斷 343
21.1.4 減少索引樹的脫靶次數 345
21.1.5 IO 延遲 345
21.1.6 跟蹤監測後颱刷新平均時間 346
21.2 計算工作集的大小 347
21.3 跟蹤監測性能狀況 349
21.4 監控副本集 352
第22章 備份 355
22.1 對服務器進行備份 355
22.1.1 文件係統快照 355
22.1.2 復製數據文件 356
22.1.3 使用mongodump 357
22.2 對副本集進行備份 359
22.3 對分片集群進行備份 360
22.3.1 備份和恢復整個集群 360
22.3.2 備份和恢復單獨的分片 360
22.4 使用mongooplog 進行增量備份 361
第23章 部署MongoDB 363
23.1 設計係統結構 363
23.1.1 選擇存儲介質 363
23.1.2 推薦的RAID 配置 367
23.1.3 CPU 368
23.1.4 選擇操作係統 368
23.1.5 交換空間 369
23.1.6 文件係統 369
23.2 虛擬化 370
23.2.1 禁止內存過度分配 370
23.2.2 神秘的內存 370
23.2.3 處理網絡磁盤的IO 問題 371
23.2.4 使用非網絡磁盤 372
23.3 係統配置 372
23.3.1 禁用NUMA 372
23.3.2 更智能地預讀取數據 375
23.3.3 禁用大內存頁麵 376
23.3.4 選擇一種磁盤調度算法 377
23.3.5 不要記錄訪問時間 377
23.3.6 修改限製 378
23.4 網絡配置 379
23.5 係統管理 381
23.5.1 時鍾同步 381
23.5.2 OOM Killer 381
23.5.3 關閉定期任務 382
附錄A 安裝MongoDB 383
附錄B 深入MongoDB 387
· · · · · · (
收起)