[NoSQL] NoSQL資料庫設計概念導讀

本文章主要是針對非關聯式資料庫設計的一些概念以及理論說明,本文會著重在非關聯式資料庫是什麼,非關聯式資料庫的定理與原則,最後會簡單介紹目前常見的非關聯式資料庫

Liu Cheng Lee
技術學習
Oct 10, 2020

--

本文架構

  • 何謂NoSQL?
  • 何謂分散式儲存?
  • CAP & BASE 定理
  • NoSQL種類
  • 現行常見的NoSQL

何謂NoSQL?

記得在之前的文章中洋洋灑灑寫了許多關聯式資料庫的好處,然而非關聯式資料庫在近期卻大幅崛起,其原因就在於大數據時代的來臨。
以往對於資料的存取其實很單一,可能是文字或者純數,但近期科技的發展,對於影音、圖片、聊天紀錄以及大型文字等各式各樣資料儲存的需求增加。再者大數據之所以稱為大數據,就是因為數據量龐大,對於資料的儲存以及效能都有更高的要求,因此NoSQL的概念由然而生。

NoSQL並不像關聯式資料庫一樣有明確的規範,目前常見的NoSQL如目前最知名的MongoDB以及Redis,這兩者在本質上就是完全不一樣的東西!

因此其實可以說只要不是屬於關聯式資料庫的資料庫就是NoSQL。

何謂分散式儲存?

分散式系統大致的架構可以參考上圖,簡單說明分散式儲存的架構。基本上分散式儲存就是將資料切成一小塊一小塊,分別儲存在不同的硬碟中,在分散式架構中,會有一個Master負責管理客戶端的資料存取需求,這樣一整個架構被稱作簇集(或叢集)。

利用這樣分散式儲存的概念的最主要好處在於,我不需要去找到一個超級大的硬碟去儲存我的資料(可能找不到,就算找到也是天文價格),當我儲存空間不足,我只要在加入一台新的硬碟即可,就如同上圖加入HDD4。
另一個好處是,當其中一個硬碟故障時,並不會影響其他台硬碟運行。

那有人可能會問,如果我這樣分散儲存,其中一個硬碟故障,那不是那個硬碟資料就消失了嗎?分散式架構有很多獨特的備份以及工作紀錄的方法。
分散式模型根據使用需求會進行切片(sharding)以及複製(replication),分散式儲存的架構有以下幾種:

  • 單一伺服器:只在一台機台上進行資料存取,速度最快也沒有其他問題,如果一台機台足夠盡量就使用一台就好。
  • 切片:將資料切成小片,方便分散儲存。
  • 主從式複製:資料的讀寫都要經過Master,Master會在叫其他Server同步更新。
  • 對等式複製:任何Server都可以進行存取,效能較好,但是不太好控制一致性能力較差。
  • 切片與主從式複製
  • 切片與對等式複製

法定人數概念(Quorums)

法定人數概念是指,我的讀寫關係應該如何才能確保我讀取的資料為正確,上圖假設今天將資料切成三份,三份資料都寫入完成,那今天只需要讀取一份資料就可以確保讀取資料是正確的。但我今天如果只寫入一份資料,就需要讀取三份資料確保讀取正確。

因此端看所注重的原則為何:
嚴格一致性: R+W>N 寫入與讀取數量超過複製數量能確保每次讀取到的都是正確數值,因此是嚴格一致性。
最終一致性: R+W<N
寫入與讀取數量小於複製的數量,可能在讀取過程中沒有讀取到最終的正確資料,因此此種模式就是注重最終一致性。

CAP & BASE 定理

CAP定理

CAP定理是以下三個字開頭的縮寫。

  • 一致性(Consistency):確保在同一時間數據都是相同的。
  • 可用性(Availability):確保每次請求都有回應,不論成功或失敗。
  • 分隔容錯(Partition tolerance):確保訊息丟失不會對系統造成影響,即使其中一台機器斷線也不影響整個系統。

CAP定理指的是資料庫的選擇,我們在設計資料庫時,是為了協助我們完成工作,達到特定的目標,然而當我們在做選擇時,就必須要有取捨。
關聯式資料庫中需要時時保持資料一致以及每次請求都有回應,且關聯式資料庫不會分散儲存,因此我們可以說關連式資料庫注重的是CA。
通常我會將C視為重視嚴謹,A視為重視效能,P則是NoSQL與RDB最主要的區別所在,有分隔容忍(P)才能視為NoSQL,因此NoSQL的組合只有PA、PC兩者。

PA則是選擇注重效能,PC則是選擇注重資料一致。

這邊舉例說明,Facebook使用的資料庫是Cassandra,其中的點讚就是採用PA的概念。今天一篇文章的點讚數量在其中一個機台中的紀錄是9999,另一台機器則是10000,其實影響不大,點讚數量並不會有太大影響。
設想看看今天如果Facebook是採用PC概念,也就是注重一致性,那當我在點讚的時候,另一個想要點讚的人可能會有延遲,因為為了要注重一致性,要短暫將資料庫Lock,如果今天是一個明星的貼文,你可能一直點不了讚,這樣不是很奇怪嗎?

這邊講述一個Amazon一個很特別的模式,Amazon的商品庫存量採用的是PA,可能很多人會有很多疑問,庫存系統應該要準確才對吧?
如果你今天點入頁面,商品是有庫存的,但是你下單時沒有庫存,Amazon會給你一個coupon。
對此的原因是,如果今天採用PC這種模式,每次消費者點入頁面可能要等待較長的時間,等待的時間可能會導致許多消費者流失,經過Amazon商業分析計算後,消費者流失所產生的損失比因無庫存所賠償的損失大,因此採用PA模式。

BASE定理

  • 基本可用(Basically Available):資料基本可以獲得,但可能讀取或者回應失敗,也可能資料不一致。
  • 軟狀態(Soft state):資料在轉變成一致性的過程中,資料還會持續變化。
  • 最終一致性(Eventual consistency):資料庫最終還是會達到一致性。

關聯式資料庫通常為了資料一致性通常會有Lock機制,但是NoSQL可以不用等待資料達到一致性,就可以直接讀取。但是如果要改寫資料,NoSQL會判斷在寫入時與讀寫到的資料是否一致,與讀取到的資料一致才會進行改寫。

小玄機:BASE在英文中是鹼的意思,剛好對應到關聯式資料庫ACID(酸)原則。

上面洋洋灑灑寫了一堆,
那到底為何要使用非關聯式資料庫呢?

綜合以上說明非關聯式資料庫有以下幾個優點:

  1. 可以管理大規模資料:透過分散式儲存資料的方式,非關聯式資料庫可以存取更大量的資料。
  2. 資料系統設計較為自由:沒有既定的資料庫規則,系統架構師可以有較自由的系統規劃設計。
  3. 不易損壞:當其中一個資料庫節點損壞時,不太會影響其他其他資料可用性。
  4. 容易擴充:當儲存空間需要擴充時只需要新增一台普通硬體即可。
  5. 查詢快速:讀取不需要等待,也不需要經過繁瑣的關聯,執行的效能會比關聯式資料庫好。

非關聯式資料庫的種類

  • 鍵值資料庫(Key-Value Database)

上圖左邊是一般的資料,如果要做成關聯式資料庫至少要存成兩個列,左邊就是鍵值資料庫,只要有學號跟各個欄位的名稱就能找到資料,且資料不用考量多值屬性,可以直接存放。

  • 列導向資料庫(Column-Oriented Database)

列導向資料庫是Google與Amazon使用的資料庫模式,他在所有的欄位上又給予一層新的Column-Family,如果我今天要查詢王大明的科系,我要輸入的指令就是(D0001,基本資料:科系)。

那這樣能夠帶來怎樣的好處呢?
以往的關聯式資料庫,所擁有的欄位是固定的,但列導向資料庫可以將欄位做延長,如下圖所示,當今天需要新增資料庫這個欄位,只需要橫向擴充即可。

  • 文檔資料庫(Document-Oriented Database)

文檔式資料庫最著名的代表就式MongoDB,MongoDB是以JSON資料格式寫成,JSON主要就是由{ " : ,,等四種標點符號組成,與關聯式資料庫不同,沒有複雜的關聯關係,且方便擴展。

MongoDB也可以與其他資料進行關聯,但要注意關聯的方向,關聯方向若正確可以大幅度提升查詢效率,反之則會造成反效果,關於關聯式資料庫轉換MongoDB的塑模原理又是另一門大學問,怎麼聚集?怎麼參考?又可以另起一篇文章,因此本文不多贅述。

  • 圖形資料庫(Graph Database)

圖形資料庫最主要的應用就是在社群網站的交友網絡,如Facebook、Instagram等朋友資料存取,人際網絡正好就與圖形資料庫的概念吻合,以下是圖形資料庫的示意圖。

到底該使用關聯式資料庫?還是非關聯式資料庫?

到此好像關聯式資料庫與非關聯式資料庫各有千秋,那到底應該選擇哪一種資料庫做為資料存取呢?
答案是一起用,這種概念被稱為混何性持久資料庫,可以依照資料的類型/型態,判斷最方便存取與查詢的方式在進而選擇資料庫。

現行常見的NoSQL

目前最常見的兩個NoSQL就是MongoDB以及Redis兩者,MongoDB在一群關聯式資料庫中殺出重圍,變成排名第六的資料庫,Redis幾乎是分散式儲存不可不知的技術。

Redis是屬於鍵值資料庫的一種,但卻擁有多種資料類型,且由於是透過虛擬記憶體的方式進行,存取速度之快,讀的速度是每秒110000次,而寫的速度是每秒81000次 。

關於Redis似乎又是一個可以開啟一篇新文章的內容。這邊建議如果要針對求職可以從MongoDB以及Redis下手。

如果喜歡我的文章可以給我拍拍手,會給我很大的鼓勵~

#數據分析/SQL/機器學習 #技術學習

--

--

Liu Cheng Lee
技術學習

畢業於北京大學研究所─計算機技術。曾任美團點評產品運營,希望大家一起跟我研究互聯網的相關專業內容。現任緯創資通IT部門。金融/會計/計算機專業背景。此外我也是日本旅行愛好者,喜歡研究日文分享日本小事。也喜歡學習設計跟藝術,透過記錄教學相長!是一顆小白菜,如有錯誤歡迎指正!