MongoDB NoSQL 資料庫技術

MongoDB 簡介

黃荻堯 Daniel Huang 2021/07/21 13:47:00
5058

一、什麼是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 IsolationShard key應該常被查詢操作當作條件

     • Shard key選擇的重要性

      (1) 影響效能與擴充性

      (2) 事後變更成本高

 

六、MongoDB Atlas

   MongoDB Atlas為一雲端全託管分散式資料庫服務,可以在AWS、Azure和Google Cloud上完全託管。

   提供跨雲端平台的資料搬移自動化佈署、視覺化管理和修復等功能

黃荻堯 Daniel Huang