MongoDB 簡介
一、什麼是MongoDB
• MongoDB(來自於英文單詞“Humongous”,中文含義為“龐大”)是一個開放原始碼的OLTP資料庫。
• 使用靈活的JSON Document模型,非常適合採用敏捷式架構,開發具有高可用性與水平擴充的巨量資料應用程式。
二、MongoDB的特色
MongoDB 的設計理念專注於將關聯式資料庫的關鍵功能與 NoSQL 技術的創新相結合。
1. 關聯式資料庫的關鍵功能
• 具有豐富功能的查詢語言與次級索引
– 用戶能夠使用強大的查詢、投影、聚合和更新操作符操作他們的數據。
• 強一致性
– 應用程序能夠立即讀取已寫入數據庫的內容。
• 企業管理與資料整合
– 具企業等級的管理工具及資料安全和審計服務。
2. NoSQL資料庫的創新
• 彈性的資料模型
– 基於JSON的規格特性,MongoDB可以在欄位中儲存其他文檔,自然形成目錄般的多層結構。
• 可擴充性與效能
– 透過水平擴充增加更多節點,以補足垂直擴充架構的不足,來達到更大的儲存容量與更高的效能。
• 全球部屬的高可用性
– 提供完全託管的雲數據庫MongoDB Atlas。
3. MongoDB與RDBMS的架構比對
4. MongoDB與RDBMS相關名詞對應
RDBMS | MongoDB |
Database | Database |
Table | Collection |
Row | Document |
Column | Field |
Primary Key | _id(特殊Field) |
Index | Index |
Join | JoinLinking |
Group By | Aggregation |
三、MongoDB的基本概念
1. Database
• MongoDB的單個實例 (mongod),可以容納多個獨立的資料庫,每一個都有自己的集合和權限。
2. Collection
• 可包含多筆資料,類似 RDBMS 的表格。
• 集合沒有固定的結構 (schema-free),可以插入不同類型的資料。
• 當第一個文件插入時,集合就會自動被創建。
3. Document
• 文件是一個鍵值(key-value)對,以JSON格式呈現,使用BSON格式儲存。
• 「_id」欄位為必要欄位,可自行定義其值,未定義則由MongoDB自行塞入一組ObjectId。
• Field中的值可以為陣列、內嵌文件等屬性。
四、MongoDB的複製集(Replica set)與容錯機制
Replica set由多台主機組成,其中一台為Primary,其他台為Secondary,多台機器之間的狀態及資料會自動同步。
當Primary因故不可用時,系統會自動在Secondary中選出一台Primary並恢復工作,從而實現高可用性。
1. 相關名詞說明
• Primary:主要資料庫
– 唯一可被寫入的節點。
• Secondary Members:次要資料庫成員
– 其內容由主要資料庫複製而來,可供讀取使用。
– 若目前主要資料庫發生問題,經選舉後,可變成新任主要資料庫。
2. 特殊的次要資料庫成員
• 優先權為0的次要資料庫成員
– 不能變為主要資料庫。
– 不能發起主要資料庫選舉。
– 在選舉時,必須投票給優先權更高的成員。
• 隱藏的次要資料庫成員(Hidden)
– 不能變為主要資料庫。
– 客戶端使用複製集方式連線時,無法連線到隱藏的資料庫(通常用於備份或報表)。
• 延遲的次要資料庫成員
– 須為隱藏的次要資料庫成員。
– 此資料庫內容與主要資料庫內容有一段時間差。
• 複製集仲裁者(Arbitor)
– 此資料庫沒有資料,所以不能變成主要資料庫。
– 會參與主要資料庫選舉的投票。
3. 選舉機制
• 何時會發生主要資料庫選舉?
(1) 初始建立複製集
(2) 複製集重新組態
– 變更成員、優先權、投票權等。
(3) 當某個次要資料庫成員偵測到主要資料庫發生問題
– 每2秒進行一次心跳(Heartbeat)。
– 當10秒內未收到主要資料庫回應訊息,則認定主要資料庫發生問題。
(4) 當主要資料庫主動降級
– 當主要資料庫需要維護。
– 當主要資料庫發現有優先權更高的次要資料庫存在,且該次要資料庫的內容不落後主要資料庫超過10秒。
• 主要資料庫的選舉規則
– 次要資料庫需取得「大多數」可投票成員的同意,才能當選主要資料庫。
– 當次要資料庫只要取得「一張」反對調,則無法被選為主要資料庫。
– 每個複製集的可投票的成員上限為7
投票成員 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
大多數成員 | 1 | 2 | 2 | 3 | 3 | 4 | 4 |
容忍失效成員 | 0 | 0 | 1 | 1 | 2 | 2 | 3 |
五、MongoDB的資料分片(Sharding)與橫向擴充機制
分片(sharding)是一種在多台主機之間分配資料的方法,來實現具有非常大的數據集和高吞吐量操作的部署。
透過水平擴充增加更多節點,以補足垂直擴充架構的不足,來達到更大的儲存容量與更高的效能。
1. 資料分片的優點
• 擴充性方面
(1) 分散讀寫的工作量,讓每台機器只處理叢集的部分資料,提高讀寫效能。
(2) 提高叢集的儲存容量。
(3) 分散每台主機記憶體的使用量,降低存取磁碟的機會。
• 分層式儲存 – 搭配Zone / Tag Sharding
• 快速備份與回存
2. 相關名詞說明
• Mongos
– 為Shard cluster的存取入口,客戶端透過Mongos存取位於Shard的資料。
– 當客戶端透過Mongos存取資料時,Mongos向Config Server詢問該資料位在哪些Chunk,
而Chunk在哪些Shard。
– 可同時設定多個Mongos連線到同一個Shard cluster,以分散負載。
• Config Server
– 記錄著Document與Chunk/Shard的對應關係。
– 必須建置為Replica set,確保高可用性。
• Shard
– 儲存Sharded collection的部分資料於Chunk之內。
– 必須建置為Replica set,確保高可用性。
• Chunk
– Shard的最小單位。
– 預設Chunk size為64MB。當超過大小時,將自動產生第二個Chunk,並將資料分割平均放在兩個Chunk中。
– 當每個Shard中的Chunk數分佈不均時,MongoDB會自動移動Chunk到其他Shard。
– 每個 chunk 儲存的資料範圍,取決於 shard key 值。
• Shard Key
– 即特殊的「索引」欄位,集合內的文檔,都要有此欄位。可為單一欄位或複合欄位。
– 做為分散資料的規則。
– 每個集合只能有一個Shard key。
3. Shard Key的設計
• 合適的Shard key條件
(1) High Cardinality:Shard key應有許多不同的值。
(2) Write Scaling:分散寫入到多個Shard。
(3) Query Isolation:Shard key應該常被查詢操作當作條件。
• Shard key選擇的重要性
(1) 影響效能與擴充性
(2) 事後變更成本高
六、MongoDB Atlas
MongoDB Atlas為一雲端全託管分散式資料庫服務,可以在AWS、Azure和Google Cloud上完全託管。
提供跨雲端平台的資料搬移、自動化佈署、視覺化管理和修復等功能。