【ZZ】NoSQL-大数据、大并发下的key-value数据库[整理]

随着NoSQL的理念越来越火,我总结一下在大数据、大并发下数据快速响应的知识,今天先开个篇,希望自己能够慢慢形成系列。
这方面做的比较早的是Memcached.Anatoly Vorobey和Brad Fitzpatrick为了提升LiveJournal.com访问速度,开发了Memcached。随着他的开源,越来越多的公司开始采用他来部署实时数据应用。

2007年后,互联网的数据越来越庞大,传统的数据库模式已经无法满足大量数据的实时访问问题,而随着内存的价格越来越便宜,人们开始倾向于用内存来存储一些访问度比较高的数据。以取得更大的访问速度。

Memcached的出现,也使得key-value数据库的发展快速起来。

下面的各种key-value数据库,本文不做时间上的比较。

1 Google的LevelDB

Google宣布将LevelDB开源,并且遵守New BSD许可证。LevelDB是一个嵌入式的key-value数据库。它的键和关联值可以是任意的字节数组,并且按照键值排序,排序机制是可以被重载的。数据存储机制非常简单,仅仅支持Put,Get和Delete命令,然后还有前向和后向迭代遍历。

数据会自动使用Snappy压缩,这是一个压缩库,Google将其用于BigTable,MapReduce和RPC中,并且在四月份宣布开源。LevelDB也有一些局限:不支持SQL查询和索引,支持多线程单进程访问,并且可以用于嵌入式设备,这将使某些项目收益,但是也会给其他的项目来带麻烦。

LevelDB优化了批量写操作。它将多个修改请求有序缓存在内存中,在累计到配置文件预设置的阈值之后再写入到磁盘中。对于顺序和随机写操作,以及顺序读操作来说,它的性能非常优秀,根据Google的性能基准测试,它能在某些测试项目中得分领先SQLite两个数量级。SQLite在随机读操作中比LevelDB稍好,而在写入较大数据的时候速度两倍快于LevelDB。LevelDB同样也表现得比Kyoto Cabinet优秀,Kyoto Cabinet也是一个key-value数据库,不过Google并没有像SQLite那样在所有测试项目中均进行比较。同样,Riak进行了一些测试对比LevelDB和InnoDB,在一些测试项目中,Google的LevelDB要比InnoDB要优秀或者能达到相同性能。

LevelDB是使用C++编写,一些外部的依赖库已经成功地移植到Windows、Mac OS X、Android和各种Unix上。在实际的应用中,Chrome的一些实验性版本中已经使用了LevelDB,将其作为IndexDB API的实现。而Riak则将其用于节点级的存储。不仅如此,一家开发3D地图软件的公司UpNext也使用了这套系统。

2 Mongo

MongoDB是一种文件导向数据库,由C++撰写而成,以此来解决应用程序开发社区中的大量现实问题。2007年10月,MongoDB由10gen团队所发展。2009年2月首度推出。
它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:
*面向集合存储,易存储对象类型的数据。
*模式自由。
*支持动态查询。
*支持完全索引,包含内部对象。
*支持查询。
*支持复制和故障恢复。
*使用高效的二进制数据存储,包括大型对象(如视频等)。
*自动处理碎片,以支持云计算层次的扩展性。
*支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
*文件存储格式为BSON(一种JSON的扩展)。
*可通过网络访问。

Mongo是一个高性能,开源,模式自由(schema-free)的文档型数据库,它在许多场景下可用于替代传统的关系型数据库或键/值(key-value)存储方式。Mongo使用C++开发,具有以下特性:
面向集合的存储:适合存储对象及JSON形式的数据。
动态查询:Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
完整的索引支持:包括文档内嵌对象及数组。Mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。
查询监视:Mongo包含一个监视工具用于分析数据库操作的性能。
复制及自动故障转移:Mongo数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转移。
高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)。
自动分片以支持云级别的伸缩性(处于早期alpha阶段):自动分片功能支持水平的数据库集群,可动态添加额外的机器。

模式自由(schema-free),意味着对于存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。
存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各中复杂的文件类型。我们称这种存储形式为BSON(Binary Serialized dOcument Format)。
MongoDB服务端可运行在Linux、Windows或OS X平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB。

3 Redis

Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key-value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。
性能测试结果:
SET操作每秒钟 110000 次,GET操作每秒钟 81000 次,服务器配置如下:
Linux 2.6, Xeon X3320 2.5Ghz.
stackoverflow 网站使用 Redis 做为缓存服务器。

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

4 LightCloud

LightCloud是最近看到的一个比较轻巧的分布式key-value数据库,尽管这类软件已经让人觉得审美疲劳,但我仍然觉得它的设计思路值 得一提。
特色
除开其项目主页上列出来的特点不提,我觉得还能数得上的特色有:
理论上可以用任意key-value数据库做为底层存储,现在支持以tokyo tyrant或者redis作为底层的存储,如果使用redis可以获得更好的 性能(大概提升30%~50%)
没有定制服务器端,基本上靠客户端语言来实现键值查找。优点是部署起来比较简单,缺点也是显而易见的,效率会有损失。
可以很方便的移植到其它语言上,我已经在github上找到一个ruby版本,甚至还有个php版本的实现。
可以方便的增加节点。
结构简单,方便hack

5 Tokyo Cabinet

特性
1、故障转移:Tokyo Tyrant支持双机互为主辅模式,主辅库均可读写,服务器端保持同步;也可以实现类似MySQL主辅库同步的方式实现读写分离,主服务器写,多个从服务器读。
2、兼容Memcache客户端,直接用php的 new memcache()就完全可以操作。如果需要memcache客户端的故障转移,使用$memcache->addServer()连接而不是$memcache->Connect()
3、数据存储占用小,同步日志文件体积小,同步日志约为数据本身的1.3倍
4、性能表现稳定出色:
TCHBD速度最快,但与memcache类似需要完全内存映射。
TCBDB。B+Tree索引,缓存800万条记录缓存,5G数据量,在只开128M内存,并且已经有1000的并发连接数的情况下:首次查询0.1秒级别完成,二次查询0.00x秒,约为TCHBD的85%
TCTDB表结构的数据读写性能约为TCHDB的45%

6 Flare

Tokyo Cabinet (TC) 是日本第一大SNS网站mixi开发的,而Flare是日本第二大SNS网 站green.jp开发的。Flare简单的说就是给TC添加了scale功能。他替换掉了TT部分,自己另外给TC写了网络服务器,Flare的主要特 点就是支持scale能力,他在网络服务端之前添加了一个node server,来管理后端的多个服务器节点,因此可以动态添加数据库服务节点,删除服务器节点,也支持failover。如果你的使用场景必须要让TC可 以scale,那么可以考虑flare。

flare唯一的缺点就是他只支持memcached协议,因此当你使用flare的时候,就不能使用TC的table数据结构了,只能使用TC的key-value数据结构存储。

7 Memcached

Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能。关于这个东西,相信很多人都用过,本文意在通过对memcached的实现及代码分析,获得对这个出色的开源软件更深入的了解,并可以根据我们的需要对其进行更进一步的优化。末了将通过对BSM_Memcache扩展的分析,加深对memcached的使用方式理解。

针对Memcached出现了类似phpmyadmin的管理系统MemAdmin

8 CouchDB

CouchDB是什么
CouchDB一种半结构化面向文档的分布式,高容错的数据库系统,其提供RESTFul HTTP/JSON接口。其拥有MVCC特性,用户可以通过自定义Map/Reduce函数生成对应的View。
在CouchDB中,数据是以JSON字符的方式存储在文件中。
特性
RESTFul API:HTTP GET/PUT/POST/DELETE + JSON
基于文档存储,数据之间没有关系范式要求
每个数据库对应单个个文件(以JSON保存),Hot backup
MVCC(Multi-Version-Concurrency-Control),读写均不锁定数据库
用户自定义View
内建备份机制
支持附件
使用Erlang开发(更多的特性)
应用场景 在我们的生活中,有很多document,比如信件,账单,笔记等,他们只是简单的信息,没有关系的需求,我们可能仅仅需要存储这些数据。 这样的情况下,CouchDB应该是很好的选择。当然其他使用关系型数据库的环境,也可以使用CouchDB来解决。
根据CouchDB的特性,在某些偶 尔连接网络的应用中,我们可以用CouchDB暂存数据,随后进行同步。也可以在Cloud环境中,作为分布式的数据存储。CouchDB提供给予 HTTP的API,这样所有的常见语言都可以使用CouchDB。

使用CouchDB,意味着我们不需要在像使用RMDBS一样,在设计应用前首先设计负责数据Table。我们的开发更加快速,灵活。

9 Voldemort

Voldemort is a distributed key-value storage system

Data is automatically replicated over multiple servers.
Data is automatically partitioned so each server contains only a subset of the total data
Server failure is handled transparently
Pluggable serialization is supported to allow rich keys and values including lists and tuples with named fields, as well as to integrate with common serialization frameworks like Protocol Buffers, Thrift, Avro and Java Serialization
Data items are versioned to maximize data integrity in failure scenarios without compromising availability of the system
Each node is independent of other nodes with no central point of failure or coordination
Good single node performance: you can expect 10-20k operations per second depending on the machines, the network, the disk system, and the data replication factor
Support for pluggable data placement strategies to support things like distribution across data centers that are geographically far apart.

Voldemort是一个分布式键-值(Key-value)存储系统,是Amazon’s Dynamo的一个开源克隆。
1.支持自动复制数据到多个服务器上。
2.支持数据自动分割所以每个服务器只包含总数据的一个子集。
3.提供服务器故障透明处理功能。
4.支持可拨插的序化支持,以实现复杂的键-值存储,它能够很好的5.集成常用的序化框架如:Protocol Buffers、Thrift、Avro和Java Serialization。
6.数据项都被标识版本能够在发生故障时尽量保持数据的完整性而不会影响系统的可用性。
7.每个节点相互独立,互不影响。
8.支持可插拔的数据放置策略。

10 Cassandra

Apache Cassandra是一套开源分布式Key-Value存储系统。它最初由Facebook开发,用于储存特别大的数据。Facebook目前在使用此系统。
主要特性:
分布式
基于column的结构化
高伸展性
Cassandra的主要特点就是它不是一个数据库,而是由一堆数据库节点共同构成的一个分布式网络服务,对Cassandra 的一个写操作,会被复制到其他节点上去,对Cassandra的读操作,也会被路由到某个节点上面去读取。对于一个Cassandra群集来说,扩展性能 是比较简单的事情,只管在群集里面添加节点就可以了。

Cassandra是一个混合型的非关系的数据库,类似于Google的BigTable。其主要功能比 Dynomite(分布式的Key-Value存 储系统)更丰富,但支持度却不如文档存储MongoDB(介于关系数据库和非关系数据库之间的开源产品,是非关系数据库当中功能最丰富,最像关系数据库 的。支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。)Cassandra最初由Facebook开发,后转变成了开源项目。它是一个网络社交云计算方面理想的数据库。以Amazon专有的完全分布式的Dynamo为基础,结合了Google BigTable基于列族(Column Family)的数据模型。P2P去中心化的存储。很多方面都可以称之为Dynamo 2.0。

和其他数据库比较,有几个突出特点:

模式灵活 :使用Cassandra,像文档存储,你不必提前解决记录中的字段。你可以在系统运行时随意的添加或移除字段。这是一个惊人的效率提升,特别是在大型部 署上。
真正的可扩展性 :Cassandra是纯粹意义上的水平扩展。为给集群添加更多容量,可以指向另一台电脑。你不必重启任何进程,改变应用查询,或手动迁移任何数据。
多数据中心识别 :你可以调整你的节点布局来避免某一个数据中心起火,一个备用的数据中心将至少有每条记录的完全复制。

一些使Cassandra提高竞争力的其他功能:

范围查询 :如果你不喜欢全部的键值查询,则可以设置键的范围来查询。
列表数据结构 :在混合模式可以将超级列添加到5维。对于每个用户的索引,这是非常方便的。
分布式写操作 :有可以在任何地方任何时间集中读或写任何数据。并且不会有任何单点失败。

原文链接:
http://www.jouhu.com/blog/?p=2045

猜你喜欢

转载自godlovesdog.iteye.com/blog/1724770
今日推荐