【資料庫寶典 - MongoDB】基礎介紹

2023/08/08閱讀時間約 5 分鐘

我們在「【資料庫寶典】什麼是NoSQL?能吃嗎?」有談到一些NoSQL的特性,雖然本質上有所差異,但兩方技術發展的產品也都開始互相支援了,比如說MongoDB後來也發展出類SQL語法讓熟悉SQL的開發者可以降低進入門檻,而SQL、postgresql…等也紛紛納入一些NoSQL的元素,雙方都有開始接納不同陣營的開發者,就讓我們來好好了解一下MongoDB吧!

與RDBMS的對應

raw-image

圖片來源…

SQL有join, 那mongo呢?

  1. Embedded Document。
  2. Document reference Document。
  3. Aggregate & $lookup。

特性

  • Schema Free, 因應各種不同結構的資料來源。
  • 反正規化, 減少過多的表。
  • 高度相容於javascript, 並以json作為儲存格式。
  • 讀取效能高於寫入效能。
  • Sharding機制, 可以將資料水平切割。

適用場景

  • 網站登入/登出。
  • 快取。
  • 易擴充的系統。
  • Event log。
  • 關聯性較簡單、業務邏輯單純。

不適用場景

  • 高交易需求的系統, 銀行/會計系統, 不嚴謹保證ACID
  • BI應用。

Replica Set

MongoDB 是 NoSQL 的一種,因此也有提供這種高可用性架構。這在 MongoDB 的術語中被稱為 Replica Set

典型的架構

raw-image

圖片來源…

  • 預設所有的請求都是對 Primary 節點進行。
  • Client也可以指定Secondary做為讀取節點。
  • 資料會自動複製到另外兩組 Secondary 節點。
  • 這些節點彼此透過 Heartbeat (每隔一段時間試探節點是否存活的方式) 檢測狀態,正常的情況每 2 秒會送出 Heartbeat,若是超過 10 秒沒有回覆,代表連線故障。如下:
raw-image

圖片來源…

當主要連線的節點發生故障時, mongo有自己的機制, 透過選舉的方式會選出一台 Secondary 成為 Primary 接手工作,這樣的能力稱為 Automatic Failover,如下:

raw-image

圖片來源…

primary到secondary的切換過程中,這一段時間,mongodb是無法提供寫操作的。因此這個時候應用程式需要判斷這些錯誤,然後做retry。

Arbiter

  • 一個 Replica Set 中可以有零個或一個 Arbiter。
  • 不實際儲存資料內容,僅參與選舉的投票,為的是讓選舉可以達成有效人數。
  • 較節省硬體資源。
raw-image

圖片來源…

MongoDB Sharding 簡介

raw-image

圖片來源…

  • 每一個Shard都是由獨立的mongod 實體或者 Replica Set 所構成。
  • Sharding 機制本身是不負責備份的。
  • 建議使用 Replica Set 來搭建 MongoDB Sharded Cluster, 如下。

Sharded Cluster 運作機制

raw-image

圖片來源…

  • Router: 主要處理Client端的請求, 並存取Config Servers來決定要往哪個Shard來存取資料。
  • Config Servers: 儲存集群的位置、資料及分片的關係,建議要有三個實體以上, 因為Meta太重要了。
  • Shard: 實際儲存資料的地方, 可以是單一的mongod也可以是Replica Set。

角色及權限控管(Role Base Access Controller)

raw-image

圖片來源…

對每個創建的user設置對應的角色:

use test // 到test這個db底下建立user
db.createUser({
user: "boss",
pwd: "boss",
roles: [
{
role: "userAdminAnyDatabase",
db: "admin",
},
],
});

也可以自訂角色來對db進行更細部的控管

  • 建立的角色也能繼承其他角色的權限。
  • 每個角色可以對db、collection定義可以執行的操作。
db.createRole({
role: "customRole", // 自訂的角色
privileges: [
{
// 對哪個db裡面的哪個collection配置允許的操作
resource: { db: "users", collection: "usersCollection" },
actions: ["find"], // 允許的操作
},
],
roles: [],
});

MongoDB將角色分類為:

raw-image


raw-image

圖片來源…

結語

簡單的了解一下MongoDB的基礎特性之後,接下來就可以開始玩玩看這套DB囉,實際使用下來還蠻彈性的,但由於過往都被SQL Schema給框住了,突然少了框框條條卻有些不習慣,但這也是MongoDB的特點,提供靈活彈性的操作方式,讓所有可能性賦能給開發者去發揮。


學習軟體開發的路上常常苦於網路資訊爆炸嗎? 教學何其多,但卻遇到無法明確選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您業界開發重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。

91會員
260內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
留言0
查看全部
發表第一個留言支持創作者!