教材:《NoSQL数据库技术与应用》
1.NoSQL数据库分类※
ACID原则:事务的四个特性
- 原子性(A)
一个事务的所有系列操作步骤被看成一个动作,所有的步骤要么全部完成,要么一个也不会完成。如果在事务过程中发生错误,则会回滚到事务开始前的状态,将要被改变的数据库记录不会被改变。 - 一致性(C)
在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏,即数据库事务不能破坏关系数据的完整性及业务逻辑上的一致性。 - 隔离性(I)
主要用于实现并发控制,隔离能够确保并发执行的事务按顺序一个接一个地执行。通过隔离,一个未完成事务不会影响另外一个未完成事务。 - 持久性(D)
一旦一个事务被提交,它应该持久保存,不会因为与其他操作冲突而取消这个事务。
关系型数据库是要求强一致性的,但是这一点在 NoSQL 数据库中是重点弱化的机制。 原因是当数据库保存强一致性时,很难保证系统具有横向扩展和可用性的优势。
1.1 大数据时代对数据存储的挑战
- 高并发读写需求
对于实时性、动态性要求较高的的社交网站,如论坛、微博等,往往需要达到每秒上万次的读写请求,这种很高的并发性对数据库的并发负载相当大,特别是对与传统关系数据库的硬盘I/O是个很大的负担。 - 高效率存储和访问需求
动态交互网站Web2.0每天产生的数据量是巨大的,如果采用传统的关系型数据库将海量数据存放到具有固定结构的二维表格中,不管是查询还是更新操作效率都是非常低。 - 高扩展性
关系型数据库是很难水平扩展的,当数据量和访问量多到需要增加硬件和服务器节点来扩大容量和负载量,关系型数据库往往需要停机维护和数据迁移(关系数据库),这对一个需要24小时不停服务的网站是非常不可取。
1.2 认识NoSQL
全称:Not Only SQL
特点:
- 易扩展
NoSQL数据库去掉关系数据库的关系型特性,数据之间均无关系,这就使得数据库可以非常容易地扩展,这是完全区别于传统关系型数据库的一大特性。 - 高性能
NoSQL数据库具有高并发读写性能,这一点是得益于NoSQL数据库的无关系性,NoSQL数据库的结构比较简单。 - 灵活的数据模型
NoSQL数据库不需要事先为要存储的数据建立相应的字段,用户可以随时存储自定义的各种数据格式。 - 高可用
NoSQL在不太影响性能的情况下,可以方便地实现高可用的架构。如Hbase集群、MongoDb副本集等。
| SQL | NoSQL |
---|
存储方式 | 表的格式,数据以行和列的方式进行存储,读取和查询十分方便 | 数据集的方式进行存储,即将大量数据都集中在一起存储,类似于键值对、图结构或者文档 | 存储结构 | 按照结构化的方法存储数据,在插入数据前需定义好存储数据的表结构,这使得整张数据表的可靠性和稳定性都比较高,但数据表存储数据后,若要修改数据表的结构就会十分困难 | 采用的是动态结构,如果面对大量非结构化数据的存储,它可以非常轻松的适应数据类型和结构的改变,也可以根据数据存储的需要灵活的改变数据库的结构 | 存储规范 | 为了规范化数据、避免重复数据以及充分利用存储空间,将数据按照最小关系表的形式进行存储,这使得数据管理变得很清晰、一目了然。不过随着表数量的增加,表之间的关系会导致数据的管理变得越来越复杂 | 采用用平面数据集的方式集中存放数据,虽然会出现数据被重复存储造成浪费存储空间的情况。但是通常单个数据库都是采用单独存储的形式,很少采用分割存储的方式,因此数据往往被存储成一个整体对数据的读写提供了极大的方便 | 扩展方式 | 主要通过提高计算机自身性能缓解存储与读写压力,即所谓的纵向扩展。因为数据表之间存在着各种关系,所以采用横向扩展的方式会较为复杂,需要保证具有关联的数据表在同一服务器 | 采用数据集存储数据,这使得数据之间无关联性,可以分布式存储,因此可以采用横向扩展方式来扩展数据库,也就是说,可以添加更多数据库服务器到资源池来缓解存储与读取压力 | 查询方式 | 采用结构化查询语言(即 SQL)来对数据库进行查询,SQL支持数据库的CRUD操作,具有非常强大的功能 | 使用的是非结构化查询语言(UnQL),UnQL以数据集(如文档)为单位来管理和操作数据,由于没有统一的标准,所以每个数据库厂商提供产品标准是不一样的 | 规范化 | 一个数据实体需要分割成多个部分,然后再对分割的部分进行规范化,规范化后再分别存储到多张关系型数据表中,这是一个复杂的过程 | 不需要规范化数据,通常是在一个单独的存储单元中存储一个复杂的数据实体 | 读写性能 | 强调数据的一致性,为此降低了数据的读写性能。虽然关系型数据库可以很好的存储和处理数据,但是处理海量数据时效率会变得很低,尤其是遇到高并发读写时,性能会很快的下降 | 可以很好的应对海量数据,也就是说,它可以很好的读写每天产生的非结构化数据。由于非关系型数据库是以数据集的方式进行存储的,因此扩展和读写都是非常容易的 | 授权方式 | 关系型数据库包括Oracle、SQLServer、DB2以及MySQL等,除了MySQL以外,大多数的关系型数据库都是非开源的,若要使用的话,则需要支付高昂的费用 | 非关系型数据库包括Redis、HBase、MongoDB、Memcache等都是开源的,使用时不需要支付费用(企业版除外) |
1.3 NoSQL基础理论
CAP原则: 又称CAP定理,包括一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)三大要素。
- 一致性(Consistency)
系统在执行过某项操作后,仍然处于一致的状态。 - 可用性(Availability)
系统的结果必须在给定的时间内返回,若超时,则被认为是不可用。 - 分区容错性(Partition Tolerance)
分区容错性可理解为系统对节点动态加入和离开的处理能力(集群一直处于可用状态),因为节点的加入和离开可认为是集群内部的网络分区。
CAP原则一个分布式系统最多可以同时实现两个要素,即AP或CP或AC。
- AC策略保证了系统的一致性和可用性,却违背了分布式系统的分区容错性;
- CP策略保证了系统的一致性和分区容错性,但用户的体验较差,即当系统宕机时,需要等待所有节点的数据一致时,用户才可访问系统;
- AP策略保证了系统的可用性和分区容错性,但是节点之间的数据会出现不一致的现象。因此,我们可以根据自己的需求,选择对应的策略。
BASE理论: BASE理论是对CAP原则中一致性和可用性权衡的结果,也是对CAP原则的延伸。
BASE理论的核心思想是即使无法保证系统的强一致性(Strong Consistency,即CAP的一致性就是强一致性),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。
- 基本可用(Basically Available)
分布式系统在出现不可预知故障的时候,允许损失部分可用性,保证系统的核心可用即可。 - 软状态(Soft-State)
允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。 - 最终一致性(Eventually Consistent)
系统中的所有数据副本经过一定时间后,最终能够达到一致的状态,不需要实时保证系统数据的强一致性。
最终一致性(Eventually Consistent): 是保证用户最终能够读取到某操作对系统特定数据的更新,它是弱一致性的一种特殊形式。 NoSQL数据库通常选择放弃强一致性,用最终一致性的思想设计分布式系统,从而使得系统达到高可用性和高扩展性。
一致性:
- 强一致性
强一致性要求集群中的所有节点的状态实时保持一致。 - 弱一致性
弱一致性不要求系统各节点状态实时保持一致。 - “因果”一致性
如果进程A通知进程B它已更新了一个数据项,那么进程B的后续访问将返回更新后的值,且一次写入将保证取代前一次写入。与进程A无因果关系的进程C的访问遵守一般的最终一致性规则。 - “读己之所写”一致性
进程A在修改了数据后,它总能读取到修改过的数据值,而不会读取到原始值。读己所写一致性是因果一致性的一个特例。 - “会话”一致性
访问存储系统的进程存放在会话的上下文中,若会话存在,则系统保证“读己之所写”一致性;若系统宕机或者网络不稳定导致会话终止,则需要建立新的会话。 - “单调读”一致性
若进程已经读取过数据对象的某个值,则任何后续访问都不会返回到原始值,这样就可以保证每个客户端在之后的请求中获取到的数据是最新的数据。 - “单调写”一致性
系统保证来自同一个进程的写操作是顺序执行的。
1.4 NoSQL数据库分类
键对值存储数据库
数据存储: 键值对存储数据库中的数据是以键值对的形式来存储的。
键值对存储数据库的结构实际上是一个映射,即Key是查找每条数据的唯一标识符,Value是该数据实际存储的内容。
键值对存储数据库结构: 采用哈希函数来实现键到值的映射,当查询数据时,基于Key的哈希值会直接定位到数据所在的位置,实现快速查询,并支持海量数据的高并发查询。
NoSQL数据库中的一种类型,也是最简单的NoSQL数据库。
常见的键值对存储数据库: Redis、Tokyo Cabinet/Tyrant、Voldemort以及Oracle BDB等数据库。
键值对存储数据库的结构示意图:
文档存储数据库
文档存储数据库是用于存储和管理文档,其中文档是结构化的数据(如JSON格式)。
常见的文档存储数据库: MongoDB、CouchDB以及RavenDB等数据库。
文档存储数据库存储的文档可以是不同结构的,即JSON、XML以及BSON等格式。
文档存储数据库不是文档管理系统。
文档存储数据库的结构示意图:
列式存储数据库
列式存储数据库是以列为单位存储数据,然后将列值顺序地存入数据库中,这种数据存储方法不同于基于行式存储的传统关系型数据库。
特点: 列式存储数据库可以高效地存储数据,也可以快速地处理批量数据实时查询数据。
常见的列式存储数据库: HBase、Cassandra、Riak以及HyperTable等数据库。
在列式存储数据库中,如果列值不存在,则不需要存储(阴影部分为列值不存在),这样的话,遇到Null值,就不需要存储,可以减少I/O操作和避免内存空间的浪费。
列式存储数据库的结构示意图:
图形存储数据库
图形存储数据库不是网络数据库,它是NoSQL数据库的一种类型,其主要是应用图形理论来存储实体之间的关系信息,其中,实体被视为图形的“节点”,关系被视为图形的“边”,“边”按照关系将“节点”按进行连接。
常见的图形存储数据库: Neo4j、FlockDB、AllegroGrap以及GraphDB等数据库。
图形存储数据库的结构示意图: 利用图形存储数据库存储的数据,可以很清晰知道两个实体之间的关系,即A和D是朋友,C是A朋友的朋友。
2.大数据时代对数据存储的挑战(略)
3.NoSQL基础理论※(略)
4.NoSQL及其特点(略)
|