NoSQL简介
NoSQL思想起源
在Web项目开发初期,项目开发人员使用关系型数据库(如MySQL、Oracle DB)来存储用户信息,商品信息,使用本地服务器或专门文件管理系统工具来存储大型文件,例如视频、音频。
随着时代发展和业务发展,对外项目的流量也随之增大,对数据库流量的要求也越来越高,数据库频繁操作磁盘、开启关闭数据库连接都是非常耗时耗性能的操作。
对于一些数据,使用关系型数据库并不合适,这些业务数据可能包含大文档,可能没有明确的行式数据结构,可能在业务上不需要长时间存储,可能对性能要求非常高。
如果在实现业务时能尽量减少对磁盘的I/O操作,将数据读写对象转移到内存,将大大提高系统吞吐能力。对于一些特殊的数据,使用键值对或以列存储,也能提高存取效率。以上问题也是NoSQL(Not Only SQL)思想提出的实践来源。
NoSQL数据库分类
针对传统数据库的性能问题,市场上出现了各种NoSQL数据库,它们的不同存储结构决定了它们有各自的特点和使用场景,主要包括键值存储数据库、列存储数据库、文档型数据库、图形数据库。
键值(Key-Value)存储数据库
这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署。但是如果数据库管理员(DBA)只对部分值进行查询或更新的时候,Key/value就显得效率低下了。举例如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB。
列存储数据库
这类数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。如:Cassandra, HBase, Riak.
文档型数据库
文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值,在处理网页等复杂数据时,文档型数据库比传统键值数据库的查询效率更高。如:CouchDB, MongoDb. 国内也有文档型数据库SequoiaDB,已经开源。
图形(Graph)数据库
图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。如:Neo4J, InfoGrid, Infinite Graph。
不同分类特点对比
分类 | Examples举例 | 典型应用场景 | 数据模型 | 优点 | 缺点 |
---|---|---|---|---|---|
键值(key-value) | Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB | 内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。 | Key 指向 Value 的键值对,通常用hash table来实现 | 查找速度快 | 数据无结构化,通常只被当作字符串或者二进制数据 |
列存储数据库 | Cassandra, HBase, Riak | 分布式的文件系统 | 以列簇式存储,将同一列数据存在一起 | 查找速度快,可扩展性强,更容易进行分布式扩展 | 功能相对局限 |
文档型数据库 | CouchDB, MongoDb | Web应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容) | Key-Value对应的键值对,Value为结构化数据 | 数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构 | 查询性能不高,而且缺乏统一的查询语法。 |
图形(Graph)数据库 | Neo4J, InfoGrid, Infinite Graph | 社交网络,推荐系统等。专注于构建关系图谱 | 图结构 | 利用图结构相关算法。比如最短路径寻址,N度关系查找等 | 很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。 |
NoSQL数据库体系
NoSQL数据库体系框架主要包括四层:持久层、数据分布层、数据逻辑层、接口层。
-
持久层定义了数据存储在哪里,主要包括内存、硬盘、内存和硬盘、可热插拔。内存形式的数据存取速度最快,但是断电或重启服务后会丢失数据。内存和硬盘结合则结合了内存存取速度和硬盘持久化的优点。可热插拔则提供了较高的数据存取灵活性。
-
数据分布层定义了数据的存储位置,是存储在单一服务器上还是多个服务器上?如果是多个服务器的分布式架构,数据是分片还是复制?如果使用分片,数据将根据一定规则均匀地分布在不同数据库服务器上,达到相对负载均衡的效果。如果使用复制,数据将在每个数据库服务器上都有备份,到时候对服务使用负载均衡也能达到提升整体系统吞吐能力的目的。在流量很大的项目中,分片和复制会同时使用,比如在数据库集群与集群间采用分片,在集群内部采用主从复制。
-
数据逻辑层定义了数据在服务器内部存储的具体形式,主要有键值、列、文档、图四种常见形式。其中列存储逻辑是将原本传统数据库按行存储的逻辑转变为按列存储,例如有一个用户表的数据,按列存储将变为:
1,2,3;Smith,Jones,Johnson;Joe,Mary,Cathy;40000,50000,44000;
按列存储适合大批量查询,但是插入删除操作的性能较差。文档存储逻辑是键值存储的一个变种,它更加关心对大量文本内部数据的重新解析构建,以提升对大文本的存取效率。图存储逻辑重在存储不同数据之间的联系,包括图概念里的顶点和边,比如不同用户之间的关注信息、演员与电影之间的关系等。 -
接口层定义了外部程序如何访问数据库,接口层具体实现包括Rest、Thrift、Map/Reduce、Get/Put,特定语言API等。方便易用的调用接口是每个数据库应当实现的部分。
NoSQL适用场景
NoSQL数据库在以下的这几种情况下比较适用:
- 数据模型比较简单;
- 需要灵活性更强的IT系统;
- 对数据库性能要求较高;
- 不需要高度的数据一致性
- 对于给定key,比较容易映射复杂值的环境。