1. 简介
NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。
现代计算系统每天在网络上都会产生庞大的数据量。这些数据有很大一部分是由关系型数据库管理系统(RDBMSs)来处理,其严谨成熟的数学理论基础使得数据建模和应用程序编程更加简单。
2. 理论基础
2.1 关系型数据库理论——ACID
A – Atomicity – 原子性
一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有被执行过一样。
C – Consistency – 一致性
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
I – Isolation – 隔离性
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
D – Durability – 持久性
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
关系型数据库严格遵循ACID理论。但当数据库要开始满足横向扩展、高可用、模式自由等需求时,需要对ACID理论进行取舍,不能严格遵循ACID。以CAP理论和BASE理论为基础的NoSQL数据库开始出现。
2.2 分布式系统
2.2.1 分布式系统介绍
分布式系统的核心理念是让多台服务器协同工作,完成单台服务器无法处理的任务,尤其是高并发或者大数据量的任务。分布式是NoSQL数据库的必要条件。
- 因为分布式集群里的服务器是通过内部网络松散耦合,各节点之间的通讯有一定的网络开销,因此分布式系统在设计上尽可能减少节点间通讯。
- 因为网络传输瓶颈,单个节点的性能高低对分布式系统整体性能影响不大。
- 提升分布式系统的整体性能是通过横向扩展(增加更多的服务器),而不是纵向扩展(提升每个节点的服务器性能)实现。
- 分布式系统最大的特点是可扩展性,可以通过增加服务器数量来增强分布式系统整体的处理能力,以应对企业的业务增长带来的计算需求增加。
2.2.2 分布式存储的问题——CAP理论
- Consistency – 一致性(与ACID的C完全不同):一致性是指“all nodes see the same data at the same time”,即更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致。
权衡一致性和可用性——BASE理论
- BA:基本可用。允许损失部分可用性,即保证核心功能或者当前最重要功能可用。
- S:Soft State,软状态。允许系统数据存在中间状态,即允许系统在不同节点的数据副本之间进行数据同步时存在延时。
- E: Eventually Consistent,最终一致性。要求系统数据副本最终能够一致,而不需要实时保证数据副本一致。最终一致性是弱一致性的一种特殊情况。
2.2.3 分布式存储算法
1. 一致性算法 - Paxos
节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing)。Paxos 算法就是一种基于消息传递模型的一致性算法。
2. 分区(Partitioning)
原来所有的数据都是在一个数据库上的,而分区的方案就是把某一个表或某几个相关的表的数据放在一个独立的数据库上
3. 分片(Replication)
分区有两种模式,一种是主从模式,用于做读写分离;另外一种模式是分片模式,也就是说把一个表中的数据分解到多个表中。一个分区只能是其中的一种模式。
4. 一致性哈希(Consistent Hashing)
3. NoSQL
与SQL对比
模式: 预定义的模式 没有预定义的模式
查询语言:结构化查询语言 没有声明行查询语言
一致性:严格的一致性 最终一致性
事务:支持 不支持
理论基础:ACID CAP,BASE
扩展:纵向扩展 横向扩展(分布式)
NoSQL数据库分类
1. 键值存储数据库
这一类数据库主要会使用到哈希表
Redis
2. 列储存数据库
这部分数据库通常是用来应对分布式存储的海量数据。
HBase
3. 文档型数据库
该类型的数据模型是版本化、半结构化的文档以特定的格式存储,比如JSON。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。
MongoDB
4. 图形数据库
Neo4
4. 参考链接
2. 维基百科-NoSQL