一、背景
我们再日常的运维中,应用及接触最多无疑是关系型数据库了,尤其以开源的为主:Mysql、MariaDB、Postgrelsql等;然后随着业务的复杂,数据量及类型的快速转变,我们不得不考虑更多数据库满足我们的业务需要,必须时序性的,全文检索的,k-v的,即时查询的,图形的,音视频的等等,作为运维,我们也不得不了解并掌握其中最常用的典型代表。本文基于此,针对常见nosql非严格关系型数据库,展开介绍,以北参考及后续补充记录。
二、常见Nosql数据库
2.1、文档型数据库
文档型数据库主要用来存储、索引并管理面向文档的数据或者类似的半结构化数据。文档型数据库(面向文档数据库)的关键核心概念即文档(Document),它是数据库中最小的单位。每一种文档型数据库的存储放肆都有所不同,一般都假定文档以某种标准化格式封装并加密数据,并用多种格式进行解码,包括XML、YAML、JSON和BSON,当然也包括二进制格式如PDF、微软Office文档等。文档型数据库存储并检索文档数据,用户在选用的时候应考虑数据访问的模式和用例,以便创建一个高效实用的文档模型。当你的域模型能够分割并分配到多个文档的时候,文档型数据库将是一个不错的选择,而当数据库中有太多的关系和标准化约束的情况下,则传统的关系型数据库更为合适。下面我们根据IBM的高级IT工程师Lijin Joseji的介绍来看11种主流的文档型数据库。
1)MongoDB
MongoDB是目前最为流行的NoSQL数据库,它是一种面向集合,模式无关的文档型数据库。其中数据以集合的方式进行分组,每个集合都有单独的名称并可以包含无限数量的文档。这里的集合同关系型数据库中的表(table)类似,唯一的区别就是它并没有任何明确的schema。
MongoDB以一系列键值对集合的方式存储数据,其中键(Key)是字符串,值(Value)是任何一种数据类型的集合,包括数组和文档。
MongoDB数据文件内部结构:
服务器角色:
主从同步:
分片机制:
2)CouchDB
Apache CouchDB是一款面向文档的数据库,可以使用JavaScript通过MapReduce方法进行查询和索引,它提供了一个RESTful JSON API,使用JavaScript作为查询语言,因此可以在任何环境中通过HTTP访问,CouchDB内置了Web管理控制台,支持通过浏览器管理数据库。CouchDB使用Erlang编写,Erlang是一种健壮的函数式编程语言,非常适合于构建并发的分布式系统,Erlang的设计非常灵活,其可伸缩性与可扩展性都非常棒。一个CouchDB文档就是一个对象,由不同字段组成。字段值可以是字符串、数字、日期,甚至可以是有序列表和关联映射。
3)Terrastore
它是一个基于Terracotta实现的高性能分布式文档数据库,为每一个文档提供了一致性保证,它的一个重要特点是提供了高级的扩展和弹性特征,而无需牺牲一致性。
4)Raven
ta是一个.NET文档型数据库,它的特点是提供了高性能、schema-less、灵活可扩展的面向.NET和Windows平台的NoSQL数据存储平台。RavenDB在其内部可以存储任何JSON文档,他是一个无模式的数据库,你可以使用C#的Linq语法定义索引。
5)OrientDB
OrientDB是用Java编写的开源NoSQL数据库管理系统,虽然是文档型数据库,但是它的关系管理方式却和图形数据库相类似。它支持schema-less、schema-full和schema-mixed多种模式。OrientDB拥有健壮的基于用户角色的安全分析系统,并支持SQL查询。
6)ThruDB
Thrudb是一套建立在Apache Thrift framework下的开源数据库服务,提供索引和文件存储服务的网站建设和推广。其目的是提供Web开发灵活,快速和易于使用的服务,可以加强或取代传统的数据存储和访问层。
Thrudb支持多个数据存储后端,包括BerkeleyDB、Disk、MySQL,还拥有Memcache和Spread集成。 它有2个子服务:
Thrudoc: Document storage service
Thrudex:Indexing and search service
7)SisoDB
SisoDb是一个用C#编写的,专门提供给SQL Server面向文档的less-schema的db-provider。它可以存储POCO (plain old clr-object)的对象图形,而无需设置任何映射。每个实体都别视为一个聚合根,能够快速生成单独的表。
8)RaptorDB
RaptorDB是一个非常小型的快速嵌入式NoSQL数据库,它使用b+tree或者MurMur哈希索引。最初的设计是用来存储JSON数据,但是目前可以存储任何类型的数据。
9)CloudKit
CloudKit提供了模式无关、自动版本化的REST JSON存储,支持OpenID和OAuth,包括OAuth Discovery。
10)Perservere
Persevere是一个开源的工具集,用来应对持久性和分布式计算,它使用了一个标准化的JSON接口。它是是针对Javascript设计的基于REST的JSON数据库,分布式计算,持久对象映射的框架,提供独立的web服务器,主要用于设计富客户端应用,可以用在任何框架和客户端上。Persevere Server是一个基于Java/Rhino的对象存储引擎,在交互式的客户端JavaScript环境中提供持久性的JSON数据格式。Persevere项目的核心就是Persevere Server,它包含了一个Persevere JavaScript客户端,但是基于标准的接口可以用于任何框架或者客户端。
11)Jackrabbit
Apache Jackrabbit是一个JSR-170的开放源码实现,支持结构化与非结构化内容、全文搜索、版本控制、交易以及观测等。
2.2、时序数据库
1)Apache Cassandra
Cassandra是一款高可扩展性第二代分布式数据库,属于混合型的非关系的数据库,类似于Google的 BigTable,支持的数据结构非常松散,类似于JSON的BJSON格式,因此可以存储比较复杂的数据类型。Cassandra最初由 Facebook开发,后转变成了开源项目。Cassandra的主要特点就是它不是一个数据库,而是由一堆数据库节点共同构成的一个分布式网络服务,对 Cassandra 的一个写操作,会被复制到其他节点上去,对Cassandra的读操作,也会被路由到某个节点上面去读取。对于一个Cassandra群集来说,扩展性能是比较简单的事情,只管在群集里面添加节点就可以了。Facebook,Digg,Twitter和Cisco等大型网站都使用了Cassandra。
2.3、其他开源数据库
1)Hypertable
Hypertable是一款高性能分布式数据存储系统,旨在为应用程序提供最好的性能,可扩展性和可靠性,它建立在Google的BigTable之上,主要面向大规模数据集应用,其目标是要成为世界上最好的大规模并发高性能数据库平台。百度目前也使用了 Hypertable。
2)Riak
Riak是一款非常适合于Web应用程序的数据库,它提供了去中心化的Key/Value存储,灵活的map /reduce引擎和友好的HTTP/JSON查询接口。它是一个真正的容错系统,不会出现单点故障,在Riak世界中,没有哪台机器是特殊的或属核心服务器 ,它们都是对等的。
3)Memcached
Memcached是开源的分布式cache系统,现在很多的大型web应用程序包括 facebook,youtube,wikipedia,yahoo等等都在使用memcached来支持他们每天数亿级的页面访问。通过把cache层与他们的web架构集成,他们的应用程序在提高了性能的同时,还大大降低了数据库的负载。
Memcached处理的原子是每一个 key/value对,key会通过一个hash算法转化成hash-key,便于查找、对比以及做到尽可能的散列。同时,memcached用的是一个二级散列,通过一张大hash表来维护。
4)Redis
Redis是一款快速的Key/Value数据库引擎,它在保持键值数据库简单快捷特点的同时,又吸收了部分关系数据库的优点,从而使它的位置处于关系数据库和键值数据库之间。Redis不仅能保存Strings类型的数据,还能保存Lists类型(有序)和 Sets类型(无序)的数据,而且还能完成排序(SORT)等高级功能,在实现INCR,SETNX等功能的时候,保证了其操作的原子性,除此以外,还支持主从复制等功能。Redis使用C语言编写,可以想memcached那样使用,放在传统数据库的前端,它支持许多编程语言,受到许多流行的项目使用,如GitHub和Engine Yard,有一个用PHP编写的客户端叫做Rediska,专门来管理Redis数据库。
5)Firebird
Firebird是一个关系数据库,可以运行在Linux,Windows和各种Unix平台上,Firebird相对MySQL和PostgreSQL来说比较小,这也使其可以称得上是理想的嵌入式数据库,可用于与其它应用程序服务器 和应用程序捆绑。Firebird具有大部分成熟数据库所具有的功能,比如支持存储过程、SQL兼容等。
6)HBase
HBase是一个分布式,面向列存储的数据库引擎,也可以叫做Hadoop数据库,因为它是Hadoop的子项目,HBase的目标是托管数十亿行,数百万列的大表,它提供了一个REST风格的Web服务器网关 ,支持XML,Protobuf和二进制数据编码选项。
7)MariaDB
MariaDB是一个向后兼容的,旨在替换MySQL数据库的MySQL分支,它包括所有主要的开源存储引擎,另外也开发了属于自己的Maria存储引擎。MariaDB是由原来 MySQL 的作者 Michael Widenius 创办的公司所开发的免费开源数据库服务器。与 MySQL 相比较,MariaDB 更强的地方在于:
Maria 存储引擎
PBXT 存储引擎
XtraDB 存储引擎
FederatedX 存储引擎
更快的复制查询处理
线程池
更少的警告和bug
运行速度更快
更多的 Extensions (More index parts, new startup options etc)
更好的功能测试
数据表消除
慢查询日志的扩展统计
支持对 Unicode 的排序
8)Drizzle
Drizzle是从MySQL衍生出来的一个数据库,但它的目的不是要取代MySQL,它的宗旨是构建一个“更精练、更轻量、更快速”的MySQL版本,它的扩展性和易用性与MySQL相当,但为了提高性能和扩展性,它从原来的核心系统里移除了部分功能。 Drizzle是一种为云和网络程序进行了特别优化的数据库,它是为在现代多CPU /多核架构上实现大规模并发而设计的。
9)HyperSQL
HyperSQL是用Java编写的一款SQL关系数据库引擎,它的核心完全是多线程的,支持双向锁和 MVCC(多版本并发控制),几乎完整支持ANSI-92 SQL,支持常见数据类型,最新版本增加了对BLOB和CLOB数据的支持,最高支持达64T的数据量。同时,HyperSQL也是一个不错的嵌入式数据库。
10)MonetDB
MonetDB是一个高性能数据库引擎,主要用在数据挖掘,OLAP,GIS,XML Query,文本和多媒体检索等领域。MonetDB对DBMS的各个层都进行创新设计,如基于垂直分片的存储层,为现代CPU 优化的查询执行架构,自动和自助调整索引,运行时查询优化,以及模块化的软件架构。MonetDB/SQL是MonetDB提供的关系数据库解决方案,MonetDB/XQuery是XML数据库解决方案,MonetDB Server是MonetDB的多模型数据库服务器。
11)CloudStore
CloudStore(以前叫做Kosmos文件系统)是一个开源的高性能分布式文件系统,它是用C++编写的,CloudStore可以和Hadoop以及Hypertable集成,这样就允许应用程序构建在那些系统上,而底层数据存储无缝地使用 CloudStore。CloudStore支持Linux和Solaris,主要用来存储Web日志和Web爬行数据。
12)OpenQM
OpenQM是唯一一款同时有商业支持和免费的开源多值数据库,基于GPL协议发布,多值数据库对NoSQL运动起到了推动作用,它自身也因速度快,体积小,比关系数据库便宜而很快得到了认可。名称OpenQM中的Open表示开源版本,QM表示商业闭源QM数据库。商业版本支持Windows,Linux(RedHat,Fedora,Debian,Ubuntu),FreeBSD,Mac OS X和Windows Mobile,其列表价格还不到其它多值产品的1/5,商业版本还包括一个GUI管理界面和终端模拟器,开源版本仅包括核心多值数据库引擎,主要是为开发人员准备的。
ScarletDME也是一个开源多值数据库,它是OpenQM的社区分支版,最初由Ladybridge开发,这个项目创立于2008年11月28日,它既在独立开发自己的功能,也在为OpenQM贡献代码。这个项目最初的名字叫做Ladybridges GPL OpenQM,现在正式改为ScarletDME,其中的DME是Data Management Environment(数据管理环境)的首字母缩写。
13)LucidDB
LucidDB是唯一一款专注于数据仓库和商务智能的开源RDBMS,它使用了列存储架构,支持位图索引,哈希连接/聚合和页面级多版本,大部分数据库最初都注重事务处理能力,而分析功能都是后来才加上去的。相反,LucidDB中的所有组件从一开始就是为满足灵活的需求,高性能数据集成和大规模数据查询而设计的,此外,其架构设计彻底从用户出发,操作简单,完全无需DBA。
LucidDB对硬件要求也极低,即使不搭建集群环境,在单一的Linux或Windows服务器上也能获得极好的性能。最新版本还加入了对Mac OS X和Windows 64位的支持,官方网站上的文档和教程也非常丰富,非常值得你体验一下。
14)HyperGraphDB
它是一种通用的,可扩展的,可移植的,分布式,嵌入式和开源数据存储机制,它是一个图形数据库,专门为人工智能和语义Web项目而设计,它也可用于任意规模的嵌入式面向对象的数据库。正如其名,HyperGraphDB是用来存储超图的,但它也属于一般图形数据库家族,作为一个图形数据库,它不施加任何限制,相比其他图形数据库它的功能更丰富。
HyperGraphDB 非常稳定,已经应用在多个生产环境,包括一个搜索引擎和Seco scripting IDE。它支持*nix和Windows平台,需要Java 5+。
15)InfoGrid
InfoGrid是一个互联网图形数据库,它提供了许多额外的组件,使得在图像基础上开发RESTful Web应用程序变得更加容易。InfoGrid是开源的,包括一系列项目:
InfoGrid图形数据库项目 – InfoGrid的心脏GraphDatabase,可以独立使用,也可以附加到其它InfoGrid项目。
InfoGrid图形数据库网格项目 – 在GraphDatabase基础上增加了复制协议,因此多个分布式GraphDatabase就可以在一个非常大的图像管理环境中协作。
InfoGrid存储项目 –象SQL数据库和分布式NoSQL哈希表那样,为存储技术提供一个抽象的通用接口,这样InfoGrid GraphDatabase就可以使用任何存储技术持久化数据。
InfoGrid用户接口项目 – 将GraphDatabase中的内容以REST风格映射成浏览器可访问的URL。
InfoGrid轻量级身份识别项目 – 实现以用户为中心的身份识别技术,如LID和OpenID。
InfoGrid模型库项目 – 定义一个可复用对象模型库,作为InfoGrid应用程序的模式使用。
InfoGrid Probe项目 – 实现Probe框架,它允许开发人员将任何互联网上的数据源当作一个图像对象看待。
InfoGrid Utilities项目 – 收集InfoGrid使用的常见对象框架和实用代码。
16)Apache Derby
Apache Derby是Apache DB的子项目,它完全用Java编写,是一个开源关系数据库,它的体积非常小,基础引擎加上JDBC驱动只有2.6MB,它支持SQL标准,它提供了一个嵌入式JDBC驱动,因此可以嵌入到任何基于Java的应用程序中,Derby也支持常见的客户端/服务器模式,它也易于安装和使用。
17)hamsterdb
Hamsterdb是一个轻量级嵌入式NoSQL Key/Value存储引擎,它已经有5年历史,现在它的开发重点放在易用性,高性能,稳定性和可扩展性上。Hamsterdb支持事务(同一时间只能处理一个事务),支持内存 数据库,支持基于HTTP服务器的嵌入式远程数据库,支持日志/恢复,AES加密,基于zlib的压缩,支持C++,Python,.NET和Java编程语言。
18)H2 Database
H2 Database是一个开源的Java数据库,它的速度很快,包括JDBC API,支持嵌入式和服务器模式,内存 数据库,提供了一个基于浏览器的控制台程序,它的体积也非常小,只有一个大小约1MB的jar文件,它还支持ODBC驱动和全文搜索。
19)db4o
db4o是一个面向对象的开源数据库,允许Java和.NET开发人员用一行代码存储和检索任何应用程序对象,无需预定义或维护一个独立的,僵化的数据模型,因为模型现在是由db4o根据需要自动创建和更新的。db4o成功的秘密是因为它的易用性,它原生为 Java和.NET设计,存储数据对象的方法直接在应用程序中定义,因此db4o很容易集成到应用程序中,由于只需要一行代码,因此执行效率非常高。
20)Tokyo Cabinet
Tokyo Cabinet是一个Kay/Value型数据库,每个Key和Value的长度都可以不同,Kay和Value既可以是二进制数据,也可以是字符串,无数据表和数据类型的概念,记录是以哈希表、B+树和固定长度数组形式组织的。Tokyo Cabinet具有以下优点:
空间利用率高 – 数据文件尺寸更小;
执行效率高 – 更快的处理速度;
并发性能好 – 在多线程环境性能更好;
改善的可用性 – 简化的API;
改善的可靠性 – 即使在发生灾难的情况下,数据文件也不会损坏;
支持64位架构 – 支持海量的存储空间和巨型数据库文件。
Tokyo Cabinet是用C语言编写的,为C,Perl,Ruby,Java和Lua提供了API。
21)Voldemort项目
Voldemort是一个分布式Key/Value存储系统,它具有以下特点:
数据自动在多个服务器之间复制;
数据自动分区,因此每个服务器只包括整体数据的一个子集;
服务器故障处理是透明的;
支持插入式序列化,允许丰富的Key和Value类型,包括列表和元组,也可以集成常见的序列化框架,如Protocol Buffers,Thrift,Avro和Java Serialization
数据项支持版本化,即使在故障情况下,数据完整性也可以得到保障;
每个节点都是独立的,无需其他节点协调,因此也没有中央节点;
单节点性能优秀:根据机器配置、网络、磁盘系统和数据复制因素的不同,每秒可以执行10-20k操作;
支持地理分散式部署。
LinkedIn目前就使用 Voldemort解决了高可伸缩性存储问题。
2.4、主流数据库
1)PostgreSQL
PostgreSQL可以简称为“postgres”,是一款对象-关系型数据库管理系统,PostgreSQL采用的是比较经典的C/S(client/server)结构,也就是一个客户端对应一个服务器端守护进程的模式。PostgreSQL拥有非常完美的驱动,并支持标准的ANSI-SQL和扩展功能,在许多方面都要超过MySQL。
PostgreSQL是全功能的自由软件数据库,很长时间以来,PostgreSQL是唯一支持事务、子查询、多版本并行控制系统(MVCC)、数据完整性检查等特性的唯一一种自由软件的数据库管理系统。许多云服务提供商比如Heroku等,都用PostgreSQL作为他们的RDBMS存储。
缺点方面,PostgreSQL还欠缺一些比较高端的数据库管理系统需要的特性,比如数据库集群,更优良的管理工具和更加自动化的系统优化功能等提高数据库性能的机制等。
2)Hadoop (HBase)
Hadoop (HBase)是一个开源的、基于列存储模型的分布式数据库,它是Apache Hadoop项目的一部分,开发语言为Java。
HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。且具有高可靠性、高性能、可伸缩、并建立在关系模型基础上的分布式数据库。
HBase是Google Bigtable的开源实现,类似Google Bigtable利用GFS作为其文件存储系统,用以存储大规模结构化数据。HBase利用Hadoop HDFS作为其文件存储系统;Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中的海量数据;Google Bigtable利用 Chubby作为协同服务,HBase利用Zookeeper作为对应。
3)Apache Cassandra
Apache Cassandra是一套开源分布式NoSQL数据库系统,类似于Google的BigTable。它最初由Facebook开发,用于储存收件箱等简单格式数据,集Google BigTable的数据模型与Amazon Dynamo的完全分布式的架构于一身。在2008年,Facebook将其开源。
Cassandra的主要特点就是它不是一个数据库,而是由一堆数据库节点共同构成的一个分布式网络服务,对Cassandra 的一个写操作,会被复制到其它节点上去,对Cassandra的读操作,也会被路由到某个节点上面去读取。对于一个Cassandra群集来说,扩展性能是比较简单的事情,只管在群集里面添加节点就可以了。
4)Couchbase
Couchbase是一款基于JSON模型的文档数据库,它是CouchDB的一个fork,能够实现水平伸缩、并且对于数据的读写都能提供低延迟访问。Couchbase要比CouchDB功能更加全面,并且Couchbase产品包含了CouchDB的一个副本。Couchbase产品向CouchDB添加了缓存、集群等功能。此外,Couchbase还包含一些不错的集成功能,对于数据存储系统来说,Couchbase是一个不错的选择。
5)Neo4j
Neo4j是一款开源的高性能NoSQL图数据库,它使用图(graph)相关的概念来描述数据模型,把数据保存为图中的节点以及节点之间的关系。支持ACID事务(原子性、独立性、持久性和一致性)。
在现实中,很多数据都是用图来表达的,比如社交网络中人与人的关系、地图数据、或是基因信息等等。Neo4j中最基本的概念是节点(node)和关系(relationship)。节点表示实体,在两个节点之间,可以有不同的关系。
6)Redis
Redis是一个开源、支持网络、基于内存、键值对存储数据库。开发者无需存储数字和字符串即可dump整个哈希值、列表、集合以及其它复杂的结果存储,此外,Redis还提供复制/同步和持久化等功能。
Redis是一个高性能的键值对数据库。Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。