NoSQL主要指非关系型、分布式、不提供ACID的数据库设计模式,NoSQL并不单指一个产品或一种技术,它代表一族产品,以及一系列不同的、有时相互关联的、有关数据存储及处理的概念。
1.NoSQL的含义
在当今的网络(包括互联网、物联网等)环境中,随着用户内容的增长,系统需要生成、处理、分析和归档的数据规模快速增大,数据类型也快速增多。一些新数据源、新应用领域也在生成大量数据,如物联网、传感器网络、全球定位系统(GPS)、环境保护、天气预报、自动追踪器和监控系统等,数据增长快、半结构化和稀疏的趋势明显,关系数据库在处理这些数据密集型应用时出现灵活性差、扩展性差、性能差等问题,需要采用不同的解决方案进行扩展。在探索海量数据和半结构化数据相关问题的过程中,诞生了一系列新型数据库产品,其中包括列簇数据库、键值对数据库、文档数据库和图数据库,这些数据库统称为NoSQL数据库。
2.NoSQL的共同特征
NoSQL的数据没有明确的范围和定义,普遍存在如下共同特征:
1)不用预定义模式:不需要事先定义表结构;数据中的每条记录都可能有不同的属性和格式,按照需要对数据进行插入操作。
2)无共享架构:将数据分区或者分段后存储在各个本地服务器上。
3)弹性可扩展:可以动态增加或者删除节点,数据可以自动在节点间迁移。
4)分区:数据库将数据分区或分段存储在多个节点上,每个分区或分段可以有多个副本。这既提高了并行性能,又保证了没有单点失效的问题。
5)异步复制:采用基于日志的异步复制,数据被尽快地写入一个节点,但不保证副本数据的随时一致性,出现故障可能会丢失少量数据。
6)BASE:满足BASE要求,保证事务的最终一致性和软事务。
NoSQL数据库并没有一个统一的架构,不同的NoSQL数据库适应不同的应用场景。
3.NoSQL采用的技术
为了满足对海量数据的高速存储需求和支持以云端应用为目标的、去中心化的系统,实现高并发、高吞吐量,NoSQL应运而生。NoSQL具有的优势表现在持续的可用性、线性拓展、操作低延迟、功能整体性、操作成熟性和低拥有成本等方面。NoSQL采用的技术如下:
1)简单数据类型和反规范化。数据库中每个记录都拥有唯一的键,系统支持单记录级别的原子性,不支持外键和跨记录的关联。对单个记录进行约束,增强了系统的可扩展性,数据操作在单台机器中执行,减少了分布式事务的开销。反规范化是把相同的数据复制到不同的文档或者表中,从而简化和优化查询,或是正好适合用户的某种特别的数据模型。
2)元数据和应用数据的分离。系统存储元数据和应用数据:元数据是定义数据对象的数据,用于系统管理,如数据分区到集群中节点和副本的映射数据;应用数据是用户存储在系统中需要处理的数据。
3)弱一致性。系统通过应用数据的多副本数据复制来达到一致性,减少同步开销,用最终一致性和时间一致性来满足对数据一致性的要求。
NoSQL处理的数据类型简单,以提供较少的功能来提高系统的性能;结构简单,可以达到高吞吐量;用元数据来定义系统处理的数据格式,使系统具有高水平的扩展能力,应用数据借助云平台和低端硬件集群,提高系统的可用性;避免昂贵的对象-关系映射,缓解由RDBMS引发的数据处理效率低的问题,降低处理海量稀疏数据的难度,但这反过来减弱了事务完整性的处理、灵活的索引及查询能力。
4.NoSQL数据库的分类
NoSQL数据库要提供非常高效、强大的海量数据存储与处理工具,其存储方式灵活。NoSQL的数据模型是基于高性能的需求提出的。根据数据的存储模型和特点,NoSQL数据库有很多种类,按存储方式分为列簇存储、键值对存储、文档存储、图形存储等。
1)列簇(Column Family)存储方式:在数据表的定义中只定义列簇,存储时按照列簇分块存储,用来应对分布式存储的海量数据。键仍然存在,特点是指向了多个列。列簇中的列可以随应用而变化。列存储数据库不管数据类型,将同一列的数据存储在一起;可以存储结构化和半结构化数据;由于数据类型相同,因此压缩率高,针对某一列或者某几列的查询有非常大的I/O优势。典型的例子有HBase、Cassandra和Hypertable等。
2)键值对(Key-Value)存储方式:用哈希表存储数据,表中有一个特定的键和一个指向特定数据的指针。模型简单、易部署。键值对数据库存储的数据由键(Key)和值(Value)两部分组成,通过键快速查询到其值,值的格式可以根据具体应用来确定。典型的例子有Redis、Tokyo Cabinet、Tyrant Berkeley DB、MemcacheDB等。
3)文档(Document)存储方式:数据模型是格式化的文档,半结构化的文档以特定的格式存储。文档存储时允许文档的嵌套和引用,文档的查询效率更高。文档存储数据库采用格式化文件(类似JSON、XML等)的格式存储,对某些字段建立索引以提高查询效率。典型的例子有MongoDB、CouchDB等。
4)图形(Graph)存储方式:数据以图形(节点和边的集合)的方式存储,使用灵活的图形模型,容易扩展,具体而言,数据以有向加权图的方式存储。社交关系、推荐系统、关系图谱的存储以图形存储方式为最佳。典型的例子是Neo4j等。
5.NoSQL的整体框架
NoSQL支持多样灵活的数据模型,无须事先为要存储的数据建立字段,随时可以存储自定义的数据格式。例如灵活的Schema允许用一种嵌套式的内部数据格式来存储一组有关联的业务实体,可以带来的好处之一是可以少一些表联结,可以让内部技术上的数据存储更接近于业务实体,特别是那种混合式业务实体。
NoSQL的整体框架包括4层,从上到下分别是接口层、数据逻辑模型层、数据分布层和数据持久层。
1)接口层给出用户使用的工具:REST(REpresentational State Transfer,表述性状态传递,一种软件架构风格)、Thrft(一个软件框架,用来开发可扩展、跨语言的服务,它结合了功能强大的软件堆栈和代码生成引擎)、MapReduce、GET/PUT、语言特定API和SQL子集等。
2)数据逻辑模型层中的数据模型包括Key-Value(键值对)、Column Family(列簇)、Document(文档)、Graph(图形)等模型。
3)数据分布层对应于数据的物理存储,包括支持CAP、多数据中心、动态部署等分布式数据库的环境。
4)数据持久层给出数据长期保存的方法,包括基于内存、基于硬盘、基于内存和硬盘、定制可插拔等。
NoSQL分层架构不代表每个产品在每一层只有一种选择,分层设计提供了很强的灵活性和兼容性,每种数据库在不同层面可以支持多种特性。