[浅谈]-NoSQL资料库怎麽选?

前言

NoSQL是目前在云端服务很常使用的一种型态的资料库,仅具备BASE原则。然而在市场上有许多种类的NoSQL,如MongoDB、Redis、HBase...等,本文章则从Scalability、Sharding、Replication的角度切入,并同时带入CAP理论进行分类。

NoSQL v.s RDBMS

[关联式资料库(RDBMS)]:
是目前很常用的资料库,完全遵守ACID原则,在任何情况下(A)都可保持每个Transaction不成功则roll back、(C)资料一致性、 (I)读写不互相干扰、 (D)数据永久性

然而它只支援垂之扩充,若要应用在大量的资料的时候,就只能透过硬体的升级,如cpu 升级、使用NAS、SAN扩充硬碟资源等。

A: Atomicity, C: consistency, I: Isolation, D: duration

[非关联式资料库(NoSQL)]:
是目前在云端服务很常使用的一种型态的资料库。仅具备BASE原则,(BA)只保证一定的可用性,(S)不保证在同时有读写时资料是一致的,(E)资料最终一致的特性

但具备水平扩充、垂直扩充。换句话说只要同步的增加主机数量,NoSQL能力就会成比例上升,或者直接升级单一资料库的效能能达到效果。

BA: Basically Available, S: Soft-state, E: Eventually consistent.

[NoSQL v.s RDBMS 使用场景]:

  • RDBMS因具备ACID特性,若需要确保资料在任何情况下都稳定的场景就比较推荐。
  • NoSQL比较适合用在云端服务上,或者对於资料的稳定性不这麽高的使用场景。因为具备水平扩充,因此不会有single failed的问题、扩充的成本相对垂直扩充低。

1. [NoSQL 分类]- 以资料型态分类

主要分为三种,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 进行关联搜索。好处是有效的压缩资料以及取用同一等级的资料集相当方便。

2. [NoSQL 分类]- CAP (Consistency, Availability, Partition Tolerance)

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。

3. [NoSQL 分类]- Sharding

传统的RDBMS依赖 shard-disk 架构增加data repository的容量,NoSQL则是可透过 Sharding 技术做到。主要有分三种: Ranged Sharding、Hash Sharding、Entity group Sharding方式。

  • Ranged Sharding:

    主要是利用编号的方式进行分群,如下图当x>20的时候,分配给shard C。

Ranged Sharding

  • Hash Sharding:

    透过 Hash 的方式进行分群,分布起来会比较均匀。Ranged Sharding 则有可能会有分布不均的问题。

    -> Consistent Hashing: 使得每一个chunk 存资料的机率都一样。

Hash Sharding

  • Entity Group Sharding:

    将有关联的栏位做Sharding,这样一来在搜寻上、资料一致性上都会来的更有保障。

Entity Group Sharding

4. [NoSQL 分类]- Replication

在大型应用场景域中,几乎会遇到各种装置在已知例外、未知例外的情况下导致节点失灵的问题,然而Replication就是属於用於解决问题的解法。透过将资料备份的方式使得即使失灵,也不影响运作。

  • Master and Slave: 当client将资料注入Master 资料库,然而Master 会自动透过Replication,将slave更新。

Master and Slave

  • Multi-master Replication: 类似Master and Slave 的方式,Master 主机同时也是slave角色,当其中一台Master 更新的时候,其他Slave也会同时更新。

Multi-master

Replication 的动作可分成 Eager (sync)、Lazy(async):

  • Eager Replication: 在同步下,当资料注入的时候,全部的node 都会具备相同的资料,但缺点是在效能上必须有所牺牲。
  • Lazy Replication: 在非同步下则是透过被动的方式,在一段时间後才会同步完成。

5. [NoSQL 比较表]

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

6. 常见资料库推荐与适合场域

下图为文献中的分类表[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


<<:  test

>>:  伸缩自如的Flask [day6] Jinja

【Day4】Navigation导航X注册画面X Firebase Auth

好的,中秋节连假第二天,大家是吃烤肉吃的不要不要的阿? 那我们今天主要要做的就是关於登入页面。今天...

【红黑树十讲】总学习路径分享

Youtube连结:https://bit.ly/33cfaZS 红黑树有着自我平衡的特性,透过「...

D-27. 编译直译、动态静态、强型弱型 && Leetcode:Add Digits && Move Zeroes

Ruby是直译语言 程序码要能让电脑读懂,一定会有一个转译过程。 编译(Compiled langu...

GitHub Action 实作持续整合 - 以 ASP.NET Core 专案为例

接下来的两篇文章,会结合前面 GitHub Action 所学,实作持续整合与持续布署两个部分。因为...

Day23|【Git】各种合并冲突与分别解决方式

了解分支的用途後,在合作开发上一定便利许多,但同样地,不是每件事情都顺顺利利,只要有合作的事情,总是...