和SQL一樣簡單的NoSQL,從汎汎小工程師昇華到資料庫宗師的一大步!
MongoDB是當今業界使用最廣泛的文件資料庫之一,本書特別結合實踐案例,再以開發管理者的角度對MongoDB技術進行系統地整理,想要從SQL跳槽的讀者,這本書是市面上難得的最佳範例手冊。
本書內容概要
第1 部分:MongoDB 入門(第1 ~ 6 章)
該部分介紹MongoDB 的基本概念及入門知識。透過該部分的學習,讀者可對MongoDB 自身的技術全貌形成一定的認識。
第2 部分:MongoDB 微服務開發(第7 ~ 10 章)
該部分介紹微服務的基本概念及微服務架構中應用MongoDB 的相關技術實現。透過該部分的學習,讀者將能深入了解基於Java 微服務技術堆疊開發MongoDB 應用的實踐方法。
第3 部分:MongoDB 進階(第11 ~ 15 章)
該部分介紹MongoDB 更加進階的一些使用技巧。透過該部分的學習,讀者可掌握MongoDB 在性能最佳化方面的一些最佳實踐及指導方案。
第4 部分:MongoDB 架構管理(第16 ~ 18 章)
該部分介紹MongoDB 在架構管理方面的一些經驗。透過該部分的學習,讀者可獲得MongoDB 在架構可靠性、安全方面的指導及如何在專案中進行資料庫問題防治的一些想法。
適合讀者群
本書適合希望了解、使用MongoDB 資料庫的技術從業者。
對有一定基礎的研發人員,透過閱讀本書可以更深入地了解MongoDB在性能最佳化、叢集技術方面的一些原理。
對初學者,可以根據書中的一些案例快速開發基於 MongoDB 的微服務應用。
對系統架構師,可以透過本書了解 MongoDB 的一些進階特性及原理,並獲得在技術選型、架構管理方面的指導資訊。
作者簡介:
唐卓章(博客園ID:美碼師)
十年研發老兵,持續關注NoSQL分散式資料庫技術,在系統高可用、彈性擴展、性能調優等方面有著豐富的實踐及管理經驗。
MongoDB中文社區核心成員之一。
常活躍于Mongoing社區原創及問答板塊。
華為雲 MongoDB 技術專家。
致力於萬物互聯事業,負責物聯網平臺系統的架設及研發工作。
作者序
MongoDB 是當今業界使用最廣泛的文件資料庫之一,其從2009 年誕生以來,已經吸引了無數開發者的目光。曾經MongoDB 被冠以「四不像」的稱號,被大家稱為「非關聯式資料庫中最像關聯式資料庫的軟體」。即使如此,MongoDB 在其發展歷程中仍表現出強大的生命力。尤其在近幾年,隨著雲端運算、巨量資料的高速發展,企業專案對分散式資料庫的需求越來越多,MongoDB 為靈活好用、高可用、高可擴充的分散式資料庫,在許多網際網路產品及企業專案中大展拳腳。
筆者從2016 年開始真正接觸MongoDB 資料庫,而在此之前曾有過很長一段時間的關聯式資料庫使用經驗。從自身的感受來說,採用傳統的關聯式資料庫可能是一種「萬金油」的方案,選擇MongoDB 則很大程度取決於團隊對NoSQL 的接受程度,或是來自敏捷開發、高效擴充方面的權衡。
MongoDB 的名字來自英文單字"Humongous",中文含義是「龐大」「巨大」,命名者的意圖是可以處理大規模的資料。但筆者所在的團隊更喜歡稱呼它為「芒果」資料庫,除了譯音更加相近,還有這幾年使用MongoDB 的兩層感受。
■ 第一層感受是「爽」。相比關聯式資料庫,MongoDB 幾乎沒有太多的約束。一方面,MongoDB 的文件模型是基於JSON 的,開發者更容易瞭解。另一方面,動態化模式的特性讓資料庫的管理工作變得更加簡單,例如一些線上的變更可以更快速地完成。
■ 第二層感受是「酸爽」。這一點對 MongoDB 資料管理員來說可能更有感觸一些。MongoDB 由於入門體驗「過於友善」,導致初學者很容易產生一種誤解,即MongoDB 不需要在管理方面投入太多的精力,最終導致系統上線後不斷被發現一些技術債務。更戲謔的說法是,「發表一時爽,維護火葬場」。當然,這麼說可能並不恰當,但筆者想表達的觀點是,與傳統的關聯式資料庫一樣,MongoDB 在使用上仍然需要認真地考量和看護,只有如此才可能最大限度地發揮出MongoDB 的優勢。
本書寫作想法
本書除了介紹MongoDB 技術,還會介紹與微服務相關的技術範例。在當今的背景下,風靡業界的微服務架構已成為分散式系統的事實標準。因此,我們在談MongoDB 應用程式開發時,必然免不了和微服務技術堆疊產生一些關聯。以開發者的角度來看,在成為一名MongoDB 高手之前,掌握全端式的知識技能仍然是必需的,這些技能可概括為以下3個方面。
■ MongoDB 資料庫技術的掌握:包括基本的文件模型概念和資料操作,以及叢集高可用、資料分片方面的知識。
■ MongoDB 整合微服務的技能:需要對微服務週邊的技術框架有一定的掌握。本書以當前最流行的 Java 微服務技術堆疊為背景,介紹了從MongoDB Java Driver、Spring Data Mongo(ODM 層)到上層應用整合的各種實戰範例。
■ MongoDB 高階技巧的掌握:包括 MongoDB 系統性能最佳化及MongoDB 架構高可用、安全性、高效運行維護管理方面的一些知識和經驗。
由此可見,初學者在從MongoDB 入門到進階的過程中,需要學習及掌握的知識並不算少。尤其是高階技巧方面,這部分是最難也是最花費時間成本的。而筆者一貫認同的是,好記性不如爛筆頭,在學習MongoDB 的歷程中,筆者將MongoDB 在專案中的實戰經驗進行了複習,並多次以文章的形式發表。在和一些讀者交流之後,筆者發現大家實際上都遇到了不少應用層面的開發問題。儘管MongoDB 的官方文件已經做得非常詳細(大多數基本的資料庫問題都可以從官方文件中找到答案),然而其在週邊技術堆疊的整合、系統管理及最佳化方面仍缺乏一些富有針對性的內容。因此筆者認為在結合一些實踐案例的前提下,再以開發管理者的角度對MongoDB 技術進行系統地梳理,則可能會產生事半功倍的效果,遂出現了編寫本書的想法。
本書內容概要
第1 部分:MongoDB 入門(第1 ~ 6 章)
該部分介紹MongoDB 的基本概念及入門知識。
透過該部分的學習,讀者可對MongoDB 自身的技術全貌形成一定的認識。
第2 部分:MongoDB 微服務開發(第7 ~ 10 章)
該部分介紹微服務的基本概念及微服務架構中應用MongoDB 的相關技術實現。
透過該部分的學習,讀者將能深入了解基於Java 微服務技術堆疊開發MongoDB 應用的實踐方法。
第3 部分:MongoDB 進階(第11 ~ 15 章)
該部分介紹MongoDB 更加進階的一些使用技巧。
透過該部分的學習,讀者可掌握MongoDB 在性能最佳化方面的一些最佳實踐及指導方案。
第4 部分:MongoDB 架構管理(第16 ~ 18 章)
該部分介紹MongoDB 在架構管理方面的一些經驗。
透過該部分的學習,讀者可獲得MongoDB 在架構可靠性、安全方面的指導及如何在專案中進行資料庫問題防治的一些想法。
適合讀者群
本書適合希望了解、使用MongoDB 資料庫的技術從業者。
對有一定基礎的研發人員,透過閱讀本書可以更深入地了解MongoDB在性能最佳化、叢集技術方面的一些原理。
對初學者,可以根據書中的一些案例快速開發基於 MongoDB 的微服務應用。
對系統架構師,可以透過本書了解 MongoDB 的一些進階特性及原理,並獲得在技術選型、架構管理方面的指導資訊。
特別說明
本書的重點是討論MongoDB 開發進階方面的內容, 但書中會介紹MongoDB 整合Java 微服務所必備的一些關鍵技能( 如Java 驅動、Spring 框架整合等)。微服務本身是一個非常大的課題,由於篇幅和筆者水準有限,這裡對容器化、分散式框架方面的細節不會做過多介紹,而實際上這也超出了本書的範圍。如果讀者感興趣,建議參閱其他書籍。
致謝
決定寫一本書,不僅是分享知識,還是踐行長期主義的一次歷程。不得不說,這個過程的確是痛並快樂著。由於平日裡工作非常繁忙,筆者無數次不得不堅持在深夜裡趕稿子,由此也犧牲了很多陪伴家人和孩子的寶貴時間。在此特別感謝我的家人,如果沒有你們的大力支持,本書不會如此順利地完成。另外還要感謝筆者的專案團隊,讓筆者有機會在工作過程中學習到大量的MongoDB 的知識。
本書提供了大量的案例說明,旨在分享MongoDB 在應用程式開發、系統最佳化及管理中的一些實戰經驗。由於筆者個人能力有限,書中難免存在錯漏之處,懇請讀者提出問題並幫忙指正,再次感謝!
MongoDB 是當今業界使用最廣泛的文件資料庫之一,其從2009 年誕生以來,已經吸引了無數開發者的目光。曾經MongoDB 被冠以「四不像」的稱號,被大家稱為「非關聯式資料庫中最像關聯式資料庫的軟體」。即使如此,MongoDB 在其發展歷程中仍表現出強大的生命力。尤其在近幾年,隨著雲端運算、巨量資料的高速發展,企業專案對分散式資料庫的需求越來越多,MongoDB 為靈活好用、高可用、高可擴充的分散式資料庫,在許多網際網路產品及企業專案中大展拳腳。
筆者從2016 年開始真正接觸MongoDB 資料庫,而在此之前曾有過很長一段時間的關聯式資...
目錄
第1 部分 MongoDB 入門
01 什麼是MongoDB
1.1 認識MongoDB
1.2 類比SQL 模型
02 體驗MongoDB
2.1 安裝MongoDB
2.2 使用mongo shell
2.3 插入文件
2.4 查詢文件
2.5 更新文件
2.6 刪除文件
2.7 使用聚合
2.8 計算文件大小
2.9 小技巧—定義mongo shell 環境
03 資料模型
3.1 BSON 協定與類型
3.2 使用日期
3.3 ObjectId 生成器
3.4 陣列、內嵌
3.5 固定集合
3.6 小技巧—使用固定集合實現FIFO 佇列
04 索引介紹
4.1 索引簡述
4.2 單鍵、複合索引
4.3 陣列索引
4.4 地理空間索引
4.5 唯一性約束
4.6 TTL 索引
4.7 其他索引特性
4.8 小技巧—使用explain 命令驗證最佳化
05 複本集
5.1 複本集架構
5.2 叢集選舉
5.3 即時複製
5.4 自動容錯移轉
5.5 架設複本集
5.6 小技巧—檢查複製的延遲情況
06 分片
6.1 分片叢集架構
6.2 分片策略
6.3 讀寫分發模式
6.4 資料均衡
6.5 使用mtools 架設叢集
6.6 使用分片叢集
6.7 小技巧—使用標籤
第2 部分 MongoDB 微服務開發
07 微服務入門
7.1 微服務定義
7.2 微服務基礎設施
7.3 CAP 與BASE 理論
7.4 為什麼MongoDB 適合微服務
08 使用Java 操作MongoDB
8.1 架設Java 開發環境
8.2 安裝Robo 3T
8.3 使用MongoDB Java Driver
8.4 實例:文章列表的儲存與檢索
8.5 非同步驅動
8.6 使用CommandListener檢測慢操作
8.7 MongoDB Java Driver 的工作原理
8.8 小技巧—如何監視驅動的連接數
09 SpringBoot 框架整合
9.1 SpringBoot 簡介
9.2 第一個SpringBoot 專案
9.3 Spring Data 框架介紹
9.4 使用Spring Data MongoDB操作資料庫
9.5 進階操作
9.6 自訂設定
9.7 實現單元測試
9.8 多資料來源
9.9 使用稽核功能
9.10 小技巧—自訂資料序列化方式
10 專案實戰
10.1 初始化專案
10.2 實現資源抓取
10.3 發佈RssFeed
10.4 統計功能
10.5 開發門戶介面
10.6 打包應用程式
第3 部分 MongoDB 高效進階
11 性能基準
11.1 性能基準
11.2 WiredTiger 讀寫模型
11.3 性能監控工具
11.4 使用YCSB 測試MongoDB性能
11.5 使用 nmon 監視伺服器性能
12 合理使用索引
12.1 索引檢索原理
12.2 索引檢索範例
12.3 覆蓋索引
12.4 查詢計畫
12.5 實戰:查詢案例分析
12.6 查詢快取原理
12.7 強制命中
12.8 索引正交
12.9 使用MongoDB Compass
12.10 最佳化原則
13 併發最佳化
13.1 MongoDB 的鎖模式
13.2 MVCC
13.3 原子性操作
13.4 樂觀鎖
13.5 緩解行鎖競爭
13.6 避免重複資料
13.7 那些影響併發的操作
14 應用設計最佳化
14.1 應用範式設計
14.2 巢狀結構設計
14.3 桶模式
14.4 巨量資料分頁
14.5 批次操作
14.6 讀寫分離與一致性
14.7 聚合範例
15 進階特性
15.1 Change Stream 介紹
15.2 Change Stream 案例:資料移轉
15.3 多文件交易
15.4 基於Spring 開發交易
15.5 交易實現原理
15.6 寫入衝突模式
15.7 使用交易的限制
第4 部分MongoDB 架構管理
16 安全管理
16.1 MongoDB 如何身份驗證
16.2 角色管理
16.3 最小許可權原則
16.4 安全最佳實踐
17 高可用性
17.1 節點部署最佳化
17.2 叢集高可用性
17.3 應用層高可用性
17.4 備份可用性
17.5 災難恢復可用性
18 治理經驗
18.1 強化約束
18.2 使用Mongobee 實現升級
18.3 規範與自動化
18.4 運行維護管理
第1 部分 MongoDB 入門
01 什麼是MongoDB
1.1 認識MongoDB
1.2 類比SQL 模型
02 體驗MongoDB
2.1 安裝MongoDB
2.2 使用mongo shell
2.3 插入文件
2.4 查詢文件
2.5 更新文件
2.6 刪除文件
2.7 使用聚合
2.8 計算文件大小
2.9 小技巧—定義mongo shell 環境
03 資料模型
3.1 BSON 協定與類型
3.2 使用日期
3.3 ObjectId 生成器
3.4 陣列、內嵌
3.5 固定集合
3.6 小技巧—使用固定集合實現FIFO 佇列
04 索引介紹
4.1 索引簡述
4.2 單鍵、複合索引
4.3 陣列索引
4.4 地理空間索引
4.5 唯一性約...