爱你所爱,行你所行,听从你心,无问西东。
NoSQL
NoSQL (Not Only SQL),意为 “不仅仅是SQL”。仅仅是一个概念,泛指非关系型数据库。传统的关系型数据库在处理 web2.0 网站,特别是超大规模和高并发的 SNS(社交网络) 类型和 web2.0 纯***站 已经显得力不从心,而非关系型数据库则由于其本身的特点得到了非常迅速的发展。
Why NoSQL
今天我们可以通过第三方平台(Google,Facebook等)可以很方便地访问和抓取数据。用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍增加。这些类型的数据存储不需要固定的模型,同时需要易于横向扩展,那 SQL 数据库已经不适合这些应用了,NoSQL 数据库的发展却能很好的处理这些数据。
RDBMS vs NoSQL
RDBMS | NoSQL |
---|---|
高度组织化结构化数据 | 代表着不仅仅是 SQL |
结构化查询语言(SQL) | 没有声明性查询语言 |
数据和关系都存储在单独的表中 | 没有预定义的模式 |
数据操纵语言,数据定义语言 | 键值对存储,列存储,文档存储,图形数据库 |
严格一致性 | 最终一致性,而非 ACID 特性 |
基础事务 | 非结构化和不可预知的数据 |
特点
对于 NoSQL 并没有一个明确的范围和定义,但是他们都普遍存在下面一些共性特征:
-
易扩展
NoSQL 数据库种类繁多,但有一个共同特点就是去除关系型数据库的关系型特性。无形之间,在架构的层面带来的可扩展能力
-
大数据量,高性能
NoSQL 数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀,得益于它的无关系型,数据库结构简单
-
灵活的数据模型
NoSQL 无需实现为要存储的数据建立字段,随时都可以存储自定义的数据格式。而在关系型数据库中,增删字段是一件非常麻烦的事情
-
高可用
NoSQL 在不太影响性能的情况,就可以方便地实现高可用的架构。比如 Cassandra,HBase模型,通过赋值模型也能实现高可用
分类
分类 | 举例 | 应用场景 | 数据模型 |
---|---|---|---|
键值(key-value)数据库 | redis | 内容缓存 | key 指向 value 的键值对,通常用 hash table 实现 |
列存储数据库 | Cassandra,HBase | 分布式文件系统 | 列簇式存储,同一列数据存在一起 |
文档型数据库 | MongoDB | web应用 | 与key-value类似,value为结构化数据 |
图形数据库 | Neo4J | 社交网络,推荐系统 | 图结构,专注于构建关系图谱 |
体系框架
NoSQL 框架体系 整体分为四层,由下至上分为数据持久层(data persistence),整体分布层(data distribution model),数据逻辑模型层(data logical model),接口层(interface),层次之间相辅相成,协调工作。
-
数据持久层
定义了数据的存储形式,主要包括 基于内存,基于硬盘,内存和硬盘接口,订制可插拔 四种形式。
基于内存形式的数据存取速度最快,但可能会造成数据丢失。
基于硬盘的数据存储可能保存很久,但存取速度相对于内存形式较慢。
内存和硬盘相结合的形式,结合了前两种形式的优点,保证了速度又保证了数据不丢失。
订制可插拔则保证了数据存取具有较高的灵活性
-
数据分布层
定义了数据是如何分布的,相对于关系型数据库,NoSQL可选的机制比较多,主要有三种形式:一是 CAP 支持,可用于水平扩展。二是多数据中心支持,可以保证在横跨多数据中心时也能够平稳运行。三是动态部署支持,可以在运行的集群中动态地添加或删除节点
-
数据逻辑层
表述了数据的逻辑变现形式,与关系型数据库相比,NoSQL在逻辑表现形式上相当灵活,主要有四种形式:一是键值模型,这种模型在表现形式上比较单一,但却有很强的扩展性。二是列式模式,这种模型相比于键值模型能够支持较为复杂的数据,但扩展性较差。三是文档模型,这种模型对于复杂数据的支持和扩展性都有很大优势。四是图模型,这种模型的使用场景不多,通常是基于图数据结构的数据定制的。
-
接口层
接口层为上层应用提供了方便的数据调用接口,提供了选择远多于关系型数据库。接口层提供了五种选择:Rest,Thrift,Map/Reduce,Get/Put,特定语言 API。使得应用程序和数据的交互更加方便。
NoSQL 分层架构并不代表每个产品在每一层只有一种选择。相反,这种分层设计提供了很大的灵活性和兼容性,每种数据库在不同层面可以支持多种特性。
CAP定理(CAP theorem)
在计算机科学中,CAP定理,也被称作 布鲁尔定理,它指出对于一个分布式计算机系统来说,不可能同时满足以下三点:
- 一致性(Consistency):所有节点在同一时间具有相同的数据
- 可用性(Availability):保证每个请求不管成功或失败都有响应
- 分隔容忍(Partition tolerance):系统中任意信息的丢失或失败不会影响系统的继续运作
CAP 理论的核心是:一个分布式系统不可能很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA原则,满足 CP 原则和 满足 AP 原则三大类:
- CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大
- CP - 满足一致性,分区容忍性的系统,通常性能不是特别高
- AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一点
BASE
BASE 是 NoSQL 数据库通常对可用性及一致性 (CP)的弱要求原则:
- Basically Availble - 基本可用
- soft-state - 软状态 / 柔性事务
- Eventual Consistency - 最终一致性,也是 ACID 最终目的
最终一致性
最终一致性要求系统中数据副本最终能够一致,而不需要实时保证数据副本一致。例如,银行系统中的非实时转账操作,允许 24 小时内用户账户的状态在转账前后是不一致的,但 24 小时后账户数据必须正确。
最终一致性是 BASE 原理的核心,也是 NoSQL 数据库的主要特点,通过弱化一致性,提供系统的可伸缩性,可靠性和可用性。而对于大多数 WEB 应用,其实并不需要强一致性,因此牺牲一致性换区高可用性,是多数分布式数据库产品的方向。