通常数据库分为关系型数据库和非关系型数据库,关系型数据库的优势到现在也是无可替代的,比如MySQL、Oracle、SQL Server、DB2、SyBase、Informix、PostgreSQL以及比较小型的Access等等数据库,这些数据库支持复杂的SQL操作和事务机制,适合小量数据读写场景;但是到了大数据时代,人们更多的数据和物联网加入的数据已经超出了关系数据库的承载范围。
大数据时代初期,随着数据请求并发量大不断增大,一般都是采用的集群同步数据的方式处理,就是将数据库分成了很多的小库,每个数据库的数据内容是不变的,都是保存了源数据库的数据副本,通过同步或者异步方式保证数据的一致性,每个库设定特定的读写方式,比如主数据库负责写操作,从数据库是负责读操作,等等根据业务复杂程度以此类推,将业务在物理层面上进行了分离,但是这种方式依旧存在一定的负载压力的问题,企业数据在不断的扩增中,后面就采用分库分表的方式解决,对读写负载进行分离,但是这种实现依旧存在不足,且需要不断进行数据库服务器扩容。
本文着重介绍一下NoSQL(Not Only SQL)数据库。我总体将NoSQL分为5类
下面简单介绍几个
Cassandra是一个列存储数据库,支持跨数据中心的数据复制。它的数据模型提供列索引,log-structured修改,支持反规范化,实体化视图和嵌入超高速缓存。
Apache Hbase源于Google的Bigtable,是一个开源、分布式、面向列存储的模型。在Hadoop和HDFS之上提供了像Bigtable一样的功能。
Amazon SimpleDB是一个非关系型数据存储,它卸下数据库管理的工作。开发者使用Web服务请求存储和查询数据项
Apache Accumulo的有序的、分布式键值数据存储,基于Google的BigTable设计,建立在Apache Hadoop、Zookeeper和Thrift技术之上。
Hypertable是一个开源、可扩展的数据库,模仿Bigtable,支持分片。
Windows Azure Table Storage Service为要求大量非结构化数据存储的应用提供NoSQL性能。表能够自动扩展到TB级别,能通过REST和Managed API访问。
下面简单介绍几个
Redis是一个开源的键值存储。支持主从式复制、事务,Pub/Sub、Lua脚本,还支持给Key添加时限。
Riak是一个开源,分布式键值数据库,支持数据复制和容错。
Dynamo是一个键值分布式数据存储。它直接由亚马逊Dynamo数据库实现;在亚马逊S3产品中使用。
来自Oracle的键值NoSQL数据库。它支持事务ACID(原子性、一致性、持久性和独立性)和JSON。
具备数据备份和分布式键值存储系统。
Aerospike数据库是一个键值存储,支持混合内存架构,通过强一致性和可调一致性保证数据的完整性。
开源、面向文档,也是当下最人气的NoSQL数据库。
Apache CounchDB是一个使用JSON的文档数据库,使用Java做MapReduce查询,以及一个使用HTTP的API。
NoSQL文档数据库基于JSON模型。
RavenDB是一个基于.NET语言的面向文档数据库。
MarkLogic NoSQL数据库用来存储基于XML和以文档为中心的信息,支持灵活的模式。
Neo4j是一个图数据库;支持ACID事务(原子性、独立性、持久性和一致性)。
一个图数据库用来维持和遍历对象间的关系,支持分布式数据存储。
AllegroGraph是结合使用了内存和磁盘,提供了高可扩展性,支持SPARQ、RDFS++和Prolog推理。
Hazelcast CE是一个开源数据分布平台,它允许开发者在数据库集群之上共享和分割数据。
Oracle的内存数据网格解决方案提供了常用数据的快速访问能力,一致性支持事务处理能力和数据的动态划分。
来自Terracotta的分布式内存管理解决方案。这项产品包括一个Ehcache界面、Terracotta管理控制台和BigMemory-Hadoop连接器。
Infinispan是一个基于Java的开源键值NoSQL数据存储,和分布式数据节点平台,支持事务,peer-to-peer 及client/server 架构。
分布式、面向对象、基于内存、SQL+NoSQL键值数据库。支持ACID事务。
GigaSpaces内存数据网格能够充当应用的记录系统,并支持各种各样的高速缓存场景。
NoSQL数据库一直以性能、可扩展性、灵活的模式和分析能力聚焦着人们的注意力。尽管关系型数据库对于某些用例来说仍是一个不错的选择,就像结构数据和要求ACID事务的应用。
1、存储的数据实质上是半结构化或者松散的;
2、要求一定的等级的性能和扩展性;
3、存取该数据的应用与最终的一致性相吻合;
4、灵活的模式;
5、无共享架构;
6、分片作为数据存储模型的一部分;
7、异步复制;
8、使用BASE替代ACID事务。