NoSQL是目前在云端服务很常使用的一种型态的资料库,仅具备BASE原则。然而在市场上有许多种类的NoSQL,如MongoDB、Redis、HBase...等,本文章则从Scalability、Sharding、Replication的角度切入,并同时带入CAP理论进行分类。
[关联式资料库(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 使用场景]:
主要分为三种,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:
传统的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就是属於用於解决问题的解法。透过将资料备份的方式使得即使失灵,也不影响运作。
Replication 的动作可分成 Eager (sync)、Lazy(async):
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 |
下图为文献中的分类表[1],给出不同的需求而所适用的资料库。从Query 的角度分类,[(左)搜寻速度快、(右)复杂的搜寻],进而对於抓取资料的大小、容量(volume)进行分类,最後则是以资料库的特性进行分类。
专有名词:
- Unbounded: 指的是在分散式架构中,可搜寻的容量为无限
- HDD-Size: 之的是在single node 情况下,可搜寻的容量为硬碟容量
- Ad-hoc: 即时查询,如sql中的 select ..from aDB where [condictions..]
- Analytics: 只的是在query 的时候可具备资料分析的能力
- 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
好的,中秋节连假第二天,大家是吃烤肉吃的不要不要的阿? 那我们今天主要要做的就是关於登入页面。今天...
Youtube连结:https://bit.ly/33cfaZS 红黑树有着自我平衡的特性,透过「...
Ruby是直译语言 程序码要能让电脑读懂,一定会有一个转译过程。 编译(Compiled langu...
接下来的两篇文章,会结合前面 GitHub Action 所学,实作持续整合与持续布署两个部分。因为...
了解分支的用途後,在合作开发上一定便利许多,但同样地,不是每件事情都顺顺利利,只要有合作的事情,总是...