[淺談]-NoSQL資料庫怎麼選?
NoSQL是目前在雲端服務很常使用的一種型態的資料庫,僅具備BASE原則。然而在市場上有許多種類的NoSQL,如MongoDB、Redis、HBase...等,本文章則從Scalability、Sharding、Replication的角度切入,並同時帶入CAP理論進行分類。
Last updated
NoSQL是目前在雲端服務很常使用的一種型態的資料庫,僅具備BASE原則。然而在市場上有許多種類的NoSQL,如MongoDB、Redis、HBase...等,本文章則從Scalability、Sharding、Replication的角度切入,並同時帶入CAP理論進行分類。
Last updated
[關聯式資料庫(RDBMS)]: 是目前很常用的資料庫,完全遵守ACID原則,在任何情況下(A)都可保持每個Transaction不成功則roll back、(C)資料一致性、 (I)讀寫不互相干擾、 (D)數據永久性。
然而它只支援垂之擴充,若要應用在大量的資料的時候,就只能透過硬體的升級,如cpu 升級、使用NAS、SAN擴充硬碟資源等。
A: Atomicity, C: consistency, I: Isolation, D: duration
[非關聯式資料庫(NoSQL)]: 是目前在雲端服務很常使用的一種型態的資料庫。僅具備BASE原則,(BA)只保證一定的可用性8,(S)不保證在同時有讀寫時資料是一致的,(E)資料最終一致的特性。
但具備水平擴充、垂直擴充。換句話說只要同步的增加主機數量,NoSQL能力就會成比例上升,或者直接升級單一資料庫的效能能達到效果。
BA: Basically Available, S: Soft-state, E: Eventually consistent.
[NoSQL v.s RDBMS 使用場景]:
RDBMS因具備ACID特性,若需要確保資料在任何情況下都穩定的場景就比較推薦。
NoSQL比較適合用在雲端服務上,或者對於資料的穩定性不這麼高的使用場景。因為具備水平擴充,因此不會有single failed的問題、擴充的成本相對垂直擴充低。
主要分為三種,key-value、wide-column、documents的資料型態:
key-value:
在做簡單的Query會比較快,但如果是複雜的Query就不怎麼方便
ex: Redis DB
document:
也是一種key-value store,只是限制value 的結構為semi-structure,像是JSON等。ex: MongoDB
wide-column:
透過多個raw、column進行存取,將要的資料拆解成小資料,然後進行組合。最後可以透過column key 或者row key 進行關聯搜索。好處是有效的壓縮資料以及取用同一等級的資料集相當方便。
Consistency: 讀寫都會遵循Atomicity原則,Availability: 在non-failing node的時候 Client 讀、寫都能正常運行,Partition Tolerance: 在cluster 狀態下,node 之間的網路不穩的狀態下,還能夠維持availability。
從上述CAP中,一般資料庫不可能同時達到,因為在Available的情況下,Consistency與Partition Tolerance是互相矛盾的。(cluster node不能互相溝通時,不能保證資料的一致性),因此大致的分類有 AP、CA、CP:
AP: 不管是在 single-node 或者是 cluster,只有要 node 可用就能持續運作
CA: 在沒有任何的例外下,都是可用並保證資料的一致性。
CP: 在 node 之前不穩定的時候不接受 request。
傳統的RDBMS依賴 shard-disk 架構增加data repository的容量,NoSQL則是可透過 Sharding 技術做到。主要有分三種: Ranged Sharding、Hash Sharding、Entity group Sharding方式。
Ranged Sharding:
主要是利用編號的方式進行分群,如下圖當x>20的時候,分配給shard C。
Hash Sharding:
透過 Hash 的方式進行分群,分佈起來會比較均勻。Ranged Sharding 則有可能會有分佈不均的問題。
-> Consistent Hashing: 使得每一個chunk 存資料的機率都一樣。
Entity Group Sharding:
將有關聯的欄位做Sharding,這樣一來在搜尋上、資料一致性上都會來的更有保障。
在大型應用場景域中,幾乎會遇到各種裝置在已知例外、未知例外的情況下導致節點失靈的問題,然而Replication就是屬於用於解決問題的解法。透過將資料備份的方式使得即使失靈,也不影響運作。
Master and Slave: 當client將資料注入Master 資料庫,然而Master 會自動透過Replication,將slave更新。
Multi-master Replication: 類似Master and Slave 的方式,Master 主機同時也是slave角色,當其中一台Master 更新的時候,其他Slave也會同時更新。
Replication 的動作可分成 Eager (sync)、Lazy(async):
Eager Replication: 在同步下,當資料注入的時候,全部的node 都會具備相同的資料,但缺點是在效能上必須有所犧牲。
Lazy Replication: 在非同步下則是透過被動的方式,在一段時間後才會同步完成。
下圖為文獻中的分類表[1],給出不同的需求而所適用的資料庫。從Query 的角度分類,[(左)搜尋速度快、(右)複雜的搜尋],進而對於抓取資料的大小、容量(volume)進行分類,最後則是以資料庫的特性進行分類。
專有名詞: 1. Unbounded: 指的是在分散式架構中,可搜尋的容量為無限 2. HDD-Size: 之的是在single node 情況下,可搜尋的容量為硬碟容量 3. Ad-hoc: 即時查詢,如sql中的 select ..from aDB where [condictions..] 4. Analytics: 只的是在query 的時候可具備資料分析的能力 5. OLTP((online transaction processing): 網路交易process
[1] Gessert, Felix, et al. “NoSQL database systems: a survey and decision guidance.” Computer Science-Research and Development 32.3 (2017): 353–365. [2] https://docs.mongodb.com/manual/core/ranged-sharding/ [3] https://docs.mongodb.com/manual/core/hashed-sharding/ [4] https://medium.com/@jeeyoungk/how-sharding-works-b4dec46b3f6 [5] https://galeracluster.com/library/documentation/tech-desc-introduction.html [6] https://stackoverflow.com/questions/2460954/what-is-ad-hoc-query
Dimension
MongoDB
HBase
Cassandra
Riak
Redis
Data Structure
Document
Wide-column
Wide-column
Key-value
Key-value
CAP
CP
CP
AP
AP
CP
Disk latency per get by row key
Several disk seeks
Several disk seeks
Several disk seeks
One disk seeks
Memory
Write performance
High(I/O)
High(I/O)
High(I/O)
High(I/O)
super High (Memory)
Sharding
Hash、range-based
range-based
consistent hashing
consistent hashing
hash
Replication
Master-slave,snyc configurable
File-system-level
consistent hashing
consistent hashing
Async master-slave