
香農·布拉德肖 克里斯蒂娜·霍多羅夫 約恩·布拉齊爾
與傳統的關係數據庫不同,MongoDB是一種面向文檔的數據庫。本書這一版共分爲6個部分,涵蓋開發、管理以及部署等各個方面。這一版對TTL和聚合管道等新特性進行了講解,還增加了配置MongoDB的章節,涵蓋面向文檔的存儲方式及利用MongoDB的無模式數據模型處理文檔、集合和多個數據庫,以及監控、安全性和身份驗證、備份和修復、水平擴展MongoDB數據庫等多方面的內容。
本書內容結構 本書分爲 6 個部分,涵蓋開發、管理以及部署等方面的內容。 MongoDB 入門 第 1 章講述 MongoDB 的背景,包括 MongoDB 創立的原因、試圖達成的目標以及爲什麼要在項目中選用它。第 2 章更深入地介紹 MongoDB 的一些核心概念和術語,以及如何上手操作數據庫和 shell。接下來的兩章介紹 MongoDB 開發人員需要掌握的基礎知識。第 3 章說明如何在不同的安全和速度等級下執行基本的寫入操作。第 4 章解釋如何查找文檔和編寫複雜的查詢,以及如何迭代結果集。這一章會提供一些用於處理結果的方法,比如限制結果的數量、略過一些結果,以及對結果排序。 設計應用程序 第 5 章介紹什麼是索引以及如何爲 MongoDB 集合創建索引。第 6 章說明如何使用幾種特殊類型的索引和集合。第 7 章涵蓋使用 MongoDB 來聚合數據的技術,包括計數、查找唯一值、文檔分組、聚合框架以及將這些操作的結果寫入集合中。第 8 章介紹事務,內容包括什麼是事務,如何在應用程序中使用事務,以及如何調優。在這個部分的最後,第 9 章介紹關於應用程序設計的內容,包括如何更好地在應用程序中使用 MongoDB。 複製 第 10 章開始介紹複製,包括如何快速地在本地建立一個副本集和許多可用的配置選項。第 11 章涵蓋與複製相關的各種概念。第 12 章展示了副本集如何與應用程序進行交互。第 13 章介紹如何管理副本集。 分片 第 14 章開始介紹分片,並在本地展示如何快速進行分片。第 15 章大致介紹集羣的組件以及如何進行設置。第 16 章針對如何爲各種應用程序選擇片鍵給出了建議。第 17 章介紹分片集羣的管理。 應用程序管理 接下來的 3 章從應用程序的角度介紹 MongoDB 管理的各個方面。第 18 章討論如何查看 MongoDB 正在進行的操作。第 19 章介紹與 MongoDB 安全相關的內容,以及如何配置身份驗證和授權。第 20 章解釋 MongoDB 如何對數據進行持久化存儲。 服務器端管理 最後一部分主要討論服務器端的管理。第 21 章介紹啓動和停止 MongoDB 時的一些常用選項。第 22 章討論對數據庫進行監控時需要查看的統計信息以及查看的方法。第 23 章描述在不同部署類型中如何備份和恢復數據庫。最後,第 24 章介紹在部署 MongoDB 時需要關注的一些系統設置。 附錄 附錄 A 介紹 MongoDB 的版本劃分方式,以及如何在 Windows、macOS 和 Linux 系統中進行安裝。附錄 B 詳細說明 MongoDB 的內部工作原理,內容包括存儲引擎、數據格式和傳輸協議。
事無鉅細的mongo使用手冊,但對原理沒有太深的介紹。可以作爲工具書,對照目錄查閱。
本書對 MongoDB 做了以下幾個點的介紹 1. MongoDB的簡介 1.1 易於使用 MongoDB 不是關係數據庫,而是面向文檔(document-oriented)的數據庫。 MongoDB 中也沒有預定義模式(predefined schema):文檔鍵值的類型和大小不是固定的。由於沒有固定的模式,因此按需添加或刪除字段變得更容易。 1.2 易於擴展 MongoDB 會自動平衡跨集羣的數據和負載,自動重新分配文檔,並將讀寫操作路由到正確的機器上。 1.3 功能豐富 MongoDB 支持通用的二級索引,並提供唯一索引、複合索引、地理空間索引及全文索引功能。 MongoDB 提供了一種基於數據處理管道的聚合框架。 MongoDB 支持生命週期有限(TTL)集合,適用於保存將在特定時間過期的數據,比如會話和固定大小的集合,以及用於保存最近的數據(日誌)。 1.4 性能卓越 它在其 WiredTiger 存儲引擎中使用了機會鎖,以最大限度地提高併發和吞吐量。它會使用盡可能多的 RAM(內存)作爲緩存,並嘗試爲查詢自動選擇正確的索引。 2. 入門指南 文檔是 MongoDB 中的基本數據單元,可以粗略地認爲其相當於關係數據庫管理系統中的行(但表達力要強得多)。 2.1 文檔 文檔是 MongoDB 的核心概念:它是一組有序鍵值的集合。 MongoDB 會區分類型和大小寫 MongoDB 中的文檔不能包含重複的鍵 2.2 集合 集合就是一組文檔。如果將文檔比作關係數據庫中的行,那麼一個集合就相當於一張表。 集合名稱不能以 system. 開頭,該前綴是爲內部集合保留的。 用戶創建的集合名稱中不應包含保留字符 $。 使用 . 字符分隔不同命名空間的子集合是一種組織集合的慣例 2.3 數據庫 數據庫名稱不能是空字符串("")。 數據庫名稱不能包含 /、\、.、"、*、<、>、:、|、?、$、單一的空格以及 \0(空字符),基本上只能使用 ASCII 字母和數字。 數據庫名稱區分大小寫。數據庫名稱的長度限制爲 64 字節。 通過將數據庫名稱與該庫中的集合名稱連接起來,可以獲得一個完全限定的集合名稱,稱爲命名空間。 2.4 數據類型 由於只有 null、布爾值、數字、字符串、數組和對象這幾種類型,因此 JSON 的表達能力比較有限。 MongoDB 中存儲的每個文檔都必須有一個 "_id" 鍵。"_id" 的值可以是任何類型,但其默認爲ObjectId。在單個集合中,每個文檔的 "_id" 值都必須是唯一的,以確保集合中的每個文檔都可以被唯一標識。 前 9 字節保證了 ObjectId 在 1 秒內跨機器和進程的唯一性。最後 3 字節只是一個遞增計數器,負責確保單個進程中 1 秒內的唯一性。這允許在 1 秒內爲每個進程生成多達 2563(16 777216)個唯一的 ObjectId。 3. 索引 概括來說,在設計複合索引時:等值過濾的鍵應該在最前面;用於排序的鍵應該在多值字段之前;多值過濾的鍵應該在最後面。 對數組創建索引就是對數組中的每個元素創建索引,而不是對數組本身創建索引。 通常來說,一個字段的基數越高,這個字段上的索引就越有用。 根據經驗來說,應該在基數比較高的鍵上創建索引,或者至少應該把基數比較高的鍵放在複合索引的前面(在低基數的鍵之前)。 4. 範式化與反範式化 確定少與多的關係有助於決定數據的內嵌和引用。通常來說,“少”的關係使用內嵌的方式會比較好,“多”的關係使用引用的方式則比較好。 5. 同步 當一個從節點過期時,它將依次嘗試從副本集中的每個成員進行復制,看看是否有成員擁有更長的oplog 以繼續進行同步。如果沒有一個成員擁有足夠長的 oplog,那麼該成員上的複製將停止,並且需要重新進行完全同步或從最近的備份中恢復。 6. 分片 分片是指跨機器拆分數據的過程,有時也會用術語分區(partitioning)來表示這個概念。 通常來說,如果在查詢中沒有使用片鍵,mongos 就不得不將查詢發送到每個分片上。包含片鍵並可以發送到單個分片或分片子集的查詢稱爲定向查詢(targeted query)。必須發送到所有分片的查詢稱爲分散–收集查詢(scatter-gather query),也稱爲廣播查詢:mongos 會將查詢分散到所有分片,然後再從各個分片收集結果。 mongod 反覆嘗試分裂某個塊卻無法成功的過程被稱爲拆分風暴(split storm)。防止拆分風暴的唯一方法是確保配置服務器儘可能正常運行。 均衡器負責數據的遷移。它會定期檢查分片之間是否存在不均衡,如果存在,就會對塊進行遷移。在MongoDB 3.4 以上的版本中,均衡器位於配置服務器副本集的主節點成員上,而在 MongoDB 3.4及之前的版本中,每個 mongos 會偶爾扮演“均衡器”的角色。 使用集羣的應用程序不需要感知數據的遷移:所有讀寫請求都會被路由到舊的塊上,直到遷移完成。一旦元數據被更新,任何試圖訪問舊位置數據的 mongos 進程都會收到一個錯誤。這個錯誤對客戶端是不可見的:mongos 會默默地處理這個錯誤並在新的分片上重試此操作。 變更流(change stream)允許應用程序跟蹤數據庫中數據的實時變更。 在分片集羣中使用變更流時,有一些事項需要注意。打開變更流可以通過發出打開變更流的操作來實現。在分片集羣中,這個操作必須針對 mongos 發出。如果針對開啓了變更流的分片集合運行帶有 multi: true 的更新操作,那麼可能會出現向孤兒文檔發送通知的情況。如果一個分片被刪除,那麼這可能會導致打開的變更流遊標關閉——而且,該遊標可能無法恢復。 6. 選擇片鍵 最常見的數據拆分方式是升序片鍵、隨機分發的片鍵和基於位置的片鍵。 我們永遠都無法使用哈希片鍵執行指定目標的範圍查詢。如果不打算執行範圍查詢,那麼哈希片鍵就是一個很好的選擇。 片鍵不能是數組。如果任何鍵有數組值,那麼 sh.shardCollection() 就會失敗,並且將數組插入該字段是不允許的。 7. 分片管理 遷移索引。如果這個分片以前從未保存過遷移集合的塊,那麼它需要知道都索引了哪些字段。如果這個集合中曾經有塊遷移到這個分片,那麼這個步驟將被忽略。 如果有多個 mongos 進程,則可能會創建超出分片處理能力的連接:默認情況下,一個 mongos 可以接受 65 536 個連接(與 mongod 一樣),因此如果有 5 個 mongos 進程,每個與 10 000 個客戶端連接,那麼這些 mongos 可能會試圖創建 50 000 個到分片的連接! 爲了防止這種情況發生,可以在 mongos 的命令行配置中使用 --maxConns 選項來限制其可以創建的連接數。一個分片可以處理的單個 mongos 的最大連接數可以用以下公式來計算。maxConns = maxConnsPrimary - (numMembersPerReplicaSet × 3) - (other × 3) /numMongosProcesses 以下是公式的各個部分。maxConnsPrimary 主節點上的最大連接數,通常設置爲 20 000,以避免來自 mongos 的連接沖垮分片。(numMembersPerReplicaSet × 3) 主節點會與每個從節點創建一個連接,而每個從節點會與主節點創建兩個連接,所以總共有 3 個連接。(other × 3) 這裏的其他是指可能連接到 mongods 的各種進程的數量,比如監視或備份的代理、shell 的直接連接(用於管理),或者爲了遷移而連接到其他分片的連接。numMongosProcesses 分片集羣中 mongos 的總數。 均衡器的任務是把要刪除分片上的所有數據移動到其他分片上,這個過程稱爲排空(draining)。要排空數據,可以運行 removeShard 命令。 均衡過程會增加系統的負載:目標分片必須查詢源分片塊中的所有文檔,將文檔插入目標分片的塊中,然後源分片必須刪除這些文檔。在以下兩種特殊情況下,遷移會導致性能問題。 8. 應用程序管理 防止這些幻像寫入的最好方法是執行寫入確認機制:讓每次寫操作都等待,直到前一個寫操作完成,而不是僅僅等到前一個寫操作處於數據庫服務器的緩衝區中就開始下一次寫入。 使用日誌機制的成員級別持久性: 爲了在服務器發生故障時提供持久性,MongoDB 使用了一種稱爲日誌(journal)的預寫式日誌(WAL)機制。WAL 是數據庫系統中一種常用的持久性技術,其基本原理是,在將對數據庫所做的更改應用到數據庫本身之前,將對這些更改的一種表示寫到持久介質(如磁盤)上。在許多數據庫系統中,WAL 也被用來提供原子性這一數據庫屬性。然而,MongoDB 使用其他技術來確保原子寫入。 從 MongoDB 4.0 開始,當應用程序對副本集執行寫操作時,MongoDB 會使用與 oplog1 相同的格式創建日誌條目 刷新數據文件的 60 秒間隔稱爲檢查點(checkpoint)。日誌用於爲自上一個檢查點以來寫入的數據提供持久性。 通過寫關注(write concern),可以指定應用程序在響應寫請求時需要何種級別的確認。 在 MongoDB 中,讀關注(read concern)允許對何時讀取結果進行配置。這可以讓客戶端在寫操作被持久化之前就看到寫入的結果。讀關注可以與寫關注一起使用,以控制對應用程序的一致性和可用性的保證級別。不要將讀關注與讀偏好(read preference)相混淆,後者處理從何處讀取數據的問題。具體來說,讀偏好決定了副本集中承載數據的成員。默認的讀偏好是從主節點中讀取。 讀關注決定了正在讀取的數據的一致性和隔離性。默認的 readConcern 是 local,它所返回的數據不保證已經被寫入了大多數承載數據的副本集成員。這可能會導致數據在將來的某個時刻被回滾。majority 讀關注只返回被大多數副本集成員確認的持久數據(不會被回滾)。MongoDB 3.4 中增加了 linearizable 讀關注,它確保返回的數據反映了在讀操作開始之前已成功完成的經過大多數確認的寫操作。在返回結果之前,它可能會等待那些正在併發執行的寫操作完成。 當磁盤空間不足時,有以下幾種選擇。如果正在使用分片,那麼可以再添加一個分片。刪除未使用的索引。可以對特定集合使用 $indexStats 聚合來識別它們。如果還沒有進行過壓縮操作,那麼可以在一個從節點上執行壓縮看看是否有幫助。這通常只在從集合中刪除了大量數據或索引且沒有新數據替換的情況下才有用。關閉副本集的每個成員(一次一個),將其數據複製到更大的磁盤中並進行掛載。重新啓動該成員,然後繼續對下一個成員重複此操作。用較大驅動器的成員替換副本集中的成員:刪除舊成員並添加新成員,然後讓新成員追趕上副本集中的其餘成員。對集合中的每個成員重複此操作。如果使用了 directoryperdb 選項,並且數據庫增長速度非常快,則可以將數據庫移動到其自身的驅動器中。然後將磁盤卷作爲一個數據目錄進行掛載。這樣其他數據就不需要移動了。無論選擇哪種技術,都需要提前計劃以儘量減少對應用程序的影響。進行備份,依次修改集合中的每個成員,將數據從一個地方複製到另一個地方,這些操作都需要時間。 9. 服務器端管理 推薦的RAID配置 RAID0 將磁盤進行分割(striping)以提高性能。 RAID1 使用鏡像(mirroring)以提高可靠性。 RAID5 對磁盤進行分割,並保留關於已存儲其他數據的額外校驗信息,以防止在服務器發生故障時丟失數據。 RAID10 這是 RAID0 和 RAID1 的組合方式:對數據進行分割以提升速度,同時對數據進行鏡像以提高可靠性。 推薦使用 RAID10:它比 RAID0 更安全,並且可以解決 RAID1 可能出現的性能問題。 BSON 是一種輕量的二進制格式,能夠將任何 MongoDB 文檔表示爲一串字節。數據庫可以理解BSON 格式,而 BSON 也是文檔保存到磁盤中的格式。 WiredTiger 存儲引擎是 MongoDB 的默認存儲引擎。當服務器啓動時,它會打開數據文件並開始檢查點和日誌記錄過程。它會與操作系統進行配合,操作系統的職責主要是對數據頁進行載入載出,以及將數據刷新到磁盤上。該存儲引擎有以下幾個重要特性。 10. 小結 個人感覺O'Reilly系列的圖書大部分對入門很有幫助,很大一部分解釋了一些參數怎麼使用,對運維會比較友好,對於開發來說,很多源碼設計以及架構沒怎麼看到,不過對開發入門還是有一定的幫助,對MongoDB有一定全面的瞭解。
本書詳細介紹了mongoDB的相關操作指導,涉及部分的副本高可用和分片原理,很多分佈式數據庫都採用類似架構方法,大同小異
非常實用的一本書,理論知識夠用還不枯燥,實操性很強,值得反覆閱讀。
內容豐富,但是有些地方不是我想要的
寫的真的相當好,從使用到原理都講到了
在😅😅😅mini好的ii fanwebnj🦀🦀
書的內容很不錯,很適合入門,深度也不錯,就是如果有人工翻譯版本就太棒了,機器翻譯看起來有點費勁
挺全面的 有原理有操作還有運維