背景及簡介
NoSQL 技術主要解決以互聯網業務應用爲主的大數據應用問題,重點要突出處理速度的響應和海量數據的存儲問題。
NoSQL 的定義 :主體符合非關係型、分佈式、開放源碼和具有橫向擴展能力的下一代數據庫。英文名稱 NoSQL 本身的意思是“Not not SQL”,意即“不僅僅是 SQL ” 。
在 NoSQL 裏經常要用到 的一些時間單位爲秒 (s )、毫秒( ms )、微秒(µs )、納秒(ns )。
從數據存儲結構原理的角度,一般將 NoSQL 數據庫分爲鍵值存儲、文檔存儲、列族存儲、圖存儲、其他存儲 5 種模式。
傳統關係向數據庫(TRDB) 與 NoSQL主要技術區別:
- 數據庫數據存儲模式不一樣, TRDB 爲強數據存儲模式, NoSQL 爲弱數據存儲模式 。
- 分佈式技術是 NoSQL 的核心技術思路,而 TRDB 以集中部署 一 臺物理機爲最初出發點 。
- TRDB 的事物嚴格遵循 ACID 原則,而 NoSQL 主體遵循 Base 原則 。
- TRDB 都遵循 SQL 操作標準, NoSQL 沒有統一 的操作標準 。
- TRD B 基於單機的硬盤數據處理技術爲主 , NoSQL 基於分佈式的或者內存數據處理技術爲主。
帽子定理( CAP Theorem ):
當網絡環境一旦出現故障,某一條網線鬆脫、某一臺服務器巖機、某一條網絡鏈路出現嚴重擁牆問題,就必須認真考慮以下三大問題即帽子定理( CAP Theorem ):
- 一 致性( Cons i s te ncy ),指的是在同 一 時刻 , 任何 一個終端客戶在每個節點都能讀到最新寫入的數據 : 這裏的核心要求至少兩臺服務器保存着一樣的數據, 一致性從客戶角度是針對“讀(選擇〉”。可以簡單理解爲同步數據複製功能。
- 可用性( Availab i lity ),指的是一個運行的節點在合理的時間內總能響應更新請求,不會發生錯誤或超時 ; 可用 性從客戶角度是針對 “ 更新(插入、修改、刪除)”,可以簡單理解爲滿足隨時更新操作功能。
- 分區容錯 性 ( Partition Tolerance ),指 的 是當網絡發生故障時,系統仍能繼續保持響應客戶讀請求的能力。可以簡單理解爲滿足隨時讀有效數據功能 。
帽子定理被證明在分佈式處理情況下,發生故障節點,三種期望屬性最多隻能滿足兩個。
ACID :原子性( A )、一致性 CC )、隔離性( I )、持久性( D)
TRDB 在具體數據處理過程中,經常需要用到事務( Transaction )處理功能,目的爲了保證數據處理的原子性、 一致性、隔離性、持久性。這四個屬性通常稱爲 ACID 特性 。
- 原子性( Atomicity )。一個事務是一個不可分割的工作單位,事務中包括的許多操作要麼都做,要麼都不做。
- 一致性 C Consistency ) 。事務必須是使數據庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。
- 隔離性( Isolation )。一個事務的執行不能被其他事務干擾。即 一個事務內部的操作及使用的數據對併發的其他事務是隔離的,併發執行的各個事務之間不能互相干擾 。
- 持久性( Durability ) 。持久性也稱永久性( Permanence ),指 一個事務 一 旦提交,它對數據庫中數據的改變就應該是永久性的 。 接下來的其他操作或故障不應該對其有任何影響。
BASE :基本可用( BA)、軟狀態 CS)、最終一致性( E)
- 基本可用 CBasicallyAvailable), NoSQL 允許分佈式系統中某些部分出現故障,那麼系統的其餘部分依然可以繼續運作。它不會像 ACID 那樣,在系統出現故障時,進行強制拒絕,允許繼續部分訪問。
- 軟狀態 C Soft State) , NoSQL 在數據處理過程中,允許這個過程,存在數據狀態暫時不一致的情況。但經過糾錯處理 ,最終會一致的。
- 最終一 致性( Eventually Consistent) , NoSQL 的軟狀態允許數據處理過程狀態的暫時不一致,但是最終處理結果將是一致的。這句話告訴我們 NoSQL 對數據處理過程可以有短暫的時間間隔,也允許分更細的步驟一個 一個地處理,最後數據達到 一致性即可 。 這在互聯網 上進行分佈式應用具有其明顯的優勢。
NoSQL 數據存儲模式
鍵值數據存儲模式:
鍵值數據庫是一類輕量級結合內存處理爲主的NoSQL數據庫。輕量級是指它的存儲數據結構特別簡單,數據庫系統本身規模也比較小;而以內存爲主的運行處理,設計目的是爲了更快地實現對大數據的處理。
鍵起唯一索引值的作用,確保一個鍵值結構裏數據記錄的唯一性,同時也起信息記錄的作用。鍵內容不是越長越好,越多的鍵內容,意味更多的內存開銷,而且在大數據環境下,給數據查找這類計算帶來更大的運行負擔。
值是對應鍵相關的數據,通過鍵來獲取,可以存放任何類型的數據。鍵值數據庫的值由 二進制大對象( BLOB, Binary Large Object )進行存儲,這意味着任何類型的數據都可以保存,鍵值數據庫無預先定義數據類型的要求 。
基本數據操作方式:
NoSQL 數據庫沒有 SQL 概念,它們對數據操作的實現是通過 Put 、 Get 和 Delete實現的:
- Put 命令:用於寫或更新鍵值存儲裏指定地址的值 。 當指定地址有值時,更新值;當指定地址沒有值時,新增一個值。
即,Put (鍵地址,待插入的值) - Get 命令:用於讀鍵值存儲裏指定地址的值,如果沒有值,返回 一條錯誤提示信息。即,Get (鍵地址)
- Delete 命令:用於刪除鍵值存儲裏指定地址的鍵和值,如果鍵值存儲裏沒有該鍵,就返回一條錯誤提示信息。即,Delete (鍵地址)
鍵值存儲優缺點:
優點:
- 簡單
- 快速
- 高效計算
- 分佈式處理
缺點:
- 對值進行多值查找功能很弱
- 缺少約束,意味着更容易出錯
- 不容易建立複雜關係:多表關聯方式在鍵值數據庫裏無法直接操作,鍵值數據庫侷限於兩個數據集之間的有限計算
文檔數據存儲模式
被用於管理文檔,尤其適合於處理各種非結構化與半結構化的文檔數據、建立工作流應用、建立各類基於 Web 的應用。
文檔數據庫存儲結構基本要素:
1)鍵值對( Key-Value Pair)
文檔數據庫數據存儲結構的基本形式爲鍵值對形式 ,具體由數據和格式組成。數據分鍵和值兩部分,格式根據數據種類的不同有所區別,如 JSON (JavaScript Object Notation )、 XML 、 BSON ( Binary Serialized Document Format ) 等。
鍵一般用字符串來表示,值可用各種數據類型表示,如數字、字符串、日期 、邏輯值 ( True 或 False ),也可以是更加複雜的結構,如數組、文檔 。
2)文檔( Document)
文檔是由鍵值對所構成的有序集 。每個文檔裏的鍵值對必須唯 一。
3)集合( Collection)
集合是由若干條文檔構成的對象; 一個集合對應的文檔應該具有相關性。在文檔數據庫中爲了便於操作 , 每個集合都有一個集合名稱。
4)數據庫( Database)
文檔數據庫中包含若干個集合,在進行數據操作之前,必須指定數據庫名。
基本數據操作方式:
對文檔數據庫進行操作的基本方式包括了讀、 寫 、改、刪 4 種,以 MongoDB 文檔數據庫爲例進行介紹。
- 寫(insert)命令
假設我們想往 DB 數據庫 Books 集合裏寫入一條關於《 C 語言》 的新文檔 ,用代碼實現如下 :
DB.Books.Insert ({” Book ID ”:” 100005 ”,”Name ”:”《C 語言》”,” Price ”:” 60 ”})
- 讀( Select )命令
假設我們想在DB數據庫Books集合裏讀取《C語言》這本書的信息,用代碼實現如下 :
DB.Books.find({” Name”:”《c 語言》”})
- 改( Update )命令
當《Python 語言》價格有變化時,我們應該允許修改其值。其代碼如下 :
DB.Books.Update ({”Book_ ID”:”1 00002 ”} , ($set {”Price”: 78)))
- 刪( Remove )命令
當《 Java 語言》這本書銷售完畢後 ,我們不想在 Books 集合裏保留該信息,就可以把它刪除。具體代碼如下:
DB.Books.Remove ({” Book ID”:”1 00004 ”}}
文檔存儲優缺點:
優點:
- 簡單
- 相對高效
- 文檔格式處理:
既然是文檔數據庫,那麼它們擅長的就是基於 JSON 、 XML 、 BSON 類似的格式文檔數據處理。在選擇該類數據庫產品時,必須遵循這樣的格式約定,否則應該選擇其他類型的數據庫產品。 - 查詢功能強大
- 分佈式處理:
文檔數據庫具有分佈式多服務器處理功能,那麼它們就具有了很強的可伸縮性, 給大數據處理帶來了很多方便。它們可以輕鬆解決 PB 級甚至是 EB 級的數據存儲應用 需要。
缺點:
- 缺少約束
- 數據出現冗餘
- 相對低效
列族數據存儲模式
列族數據庫爲了解決大數據存儲問題引入了分佈式處理技術,爲了提高數據操作效率,針對傳統數據庫的弱點,採用了去規則、去約束化的思路 。
列族數據庫存儲結構基本要素:
1)命名空間( NameSpace)
命名空間是列族數據庫的頂級數據庫結構。相當於傳統關係型數據庫的表名 。
2)行鍵( Row Key)
行鍵用來唯一確定列族數據庫中不同行數據區別的標識符。它的作用與傳統關係型數據庫表的行主鍵作用類似 。 但是列族數據庫的行是虛的,只存在邏輯關係,因爲它們的值以列爲單位進行存儲 。 而傳統關係型數據庫表的行是一 條連續而緊密的記錄。另外行鍵還起分區和排序作用 。 當列族的列存放於不同服務器的分區裏時,則行鍵起分區地址指向的標識作用 。 列族數據庫存放數據時,自動按照行鍵進行排序。
3)列族( Column Family)
由若干個列所構成的一個集合稱爲列族。對於關係緊密的列可以放到 一個列族裏,目的是提高查詢速度 。
4)列( Column)
列是列族數據庫裏用來存放單個數值的數據結構 。列的每個值( Value )都附帶時間戳( Time Stamp)。通過時間戳來區分值的不同版本。
列族存儲特點:
- 擅長大數據處理,特別是 PB 、 EB 級別的大數據存儲和從幾千臺到幾萬臺級別的服務器分佈式存儲管理,體現了更好的可擴展性和高可用性。
- 對於命名空間、行鍵、列族需要預先定義,列無需預先定義,隨時可以增加。
- 在大數據應用環境下,管理複雜,必須藉助各種高效的管理工具來監控系統的正常運行。
- Hadoop 生態系統爲基於列族的大數據分析,提供了各種開發工具。
- 數據存儲模式相對鍵值數據庫、文檔數據庫要複雜。
- 查詢功能相對更加豐富。
- 高密集寫入處理能力,不少列族數據庫一般都能達到每秒百萬次的併發插入處理能力。
圖數據存儲模式
圖存儲是一個包含若干個節點、節點之間存在邊關係,節點和邊可以附加相關屬性的結合系統,簡稱圖( Graph ) 。
注意:
1)圖裏的節點 ( Node ) 不同於服務器集羣裏的節點 , 服務器集羣節點指一臺服務器。
2)圈裏的節點也不同於分佈式數據庫裏的片或節點軟件 , 那個片指存儲於一臺服務器上的若干數據存儲區域( Region )。
圖數據庫存儲結構基本要素:
- 節點( Node ):代表一個個事物實體
- 邊( Edge ):表明實體之間的關係
- 屬性( At tribute )
- 圖( Graph )
基本數據操作方式:
1)對於單個節點,提供建立( Create )、 刪 除( Delete )、更新( Update 〉、移動(Re move )、合併( Merge )等操作
2)對於圖,提供圖的交集、圖的並集、圖的遍歷等操作功能
圖存儲特點:
1)處理各種具有圖結構的數據
2)應用領域相對明確
3)以單臺服務器運行的圖數據庫爲主
4)圖偏重於查找、統計、分析應用