好久没有写过什么文章了,最近正好对 key-value 数据库做了一些调查,有一些初步的想法,就放这吧。
关于考察这些 key-value 数据库项目的一些指标或特性,我考虑以下一些属性:1. 是否有真实的应用(重量级玩家支持) 2. 扩展性/分布性 3. 客户端协议/语言封装 4. 参考实现 5. 实现语言 6. 其他特性 7. 性能(性能没时间一一测试,可以接下来进一步研究)。
可以被称之为 key-value 数据库的产品远不止我下边列的这些,但其他一些没有什么特别的背景和成功案例。对于这些产品我发现基本上分为三种类型,1. 存储引擎 2. 基于存储引擎的分布式框架 3. 更复杂的分布式DBMS。
可以说从功能上说每一个层次都比上一个层次的功能和复杂度更高。
- MemcacheDB:基于Memcached源代码,添加了bdb作为持久存储,其他和Memecached没太大区别。
- Tokyo Cabinet/Tyrant:TC/TT 本身只是一个存储引擎; 加上LightCloud后构成一个相对比较完整的分布式方案。不但可以支持字符串属性,还可以支持表和字段模式。
- Redis:只提供存储引擎,存储时先放在内存中,然后再根据相关指令进行持久存储。可以存储列表和集合,可以对这两种数据结构直接进行原子操作push/pop,add/remove,按范围选择列表重元素等。可以用客户端的分布式算法进行patition。
这三种基本上只提供了存储引擎,在使用上和memcache并无太大区别,需要在客户端实现一些分布策略和管理,其中 TC/TT 被提及的是比较多的,因为来自于成功案例,并且被评测效率速度也比较好。
- LightCloud:
- Flare:基于Memcached协议;可配置存储引擎目前支持TC;自动数据分区(到master);提供proxy,访问那个结点对客户端透明;支持动态重建和分区(无须影响服务);节点监测自动错误隔离;可以使用超过256字节的key,超过1M的值;
这两种,都是基于基于 TC 引擎的分布式框架,可以在服务器端完成一些自动复制/数据分区/容错等功能,给客户端提供相对透明的API,不用太在意那些分布策略。
- Cassandra:对客户端透明的容错,内置数据分区/复制策略和负载均衡。还提供了面向字段的数据结构。提供分布式,高科用性以及集群环境。”eventually consistent” model 。master-master模式。
- Voldemort:自动复制,数据分区,容错;可扩展的序列化支持;支持master-master模式;内置cache支持;存储引擎可替换(bdb/mysql/memory/filesystem);支持服务器路由和客户端路由
- HyperTable:基本是 Google BigTable 的一个实现,当前版本还比较初级只支持基本的查询操作,单条查询响应时间并不理想(数据量大可能有点优势?),可扩展性比较好,只要在集群中增加服务器就 可以扩展;数据根据主键自动分布由不同的RangeServer管理;数据最终可以存储在任何FS上,比如本地文件西东或者分布式文件系统如 HDFS/KFS等,最终数据存放在分布式文件系统中有单一服务器出问题,不会影响整体的数据
- HBase:基本特性跟HyperTable类似,都是基于BitTable模型,不过作为Hadoop的子项目,文件系统就支持HDFS,和Hadoop的集成自然比较好。
- MongDB:基于集合的存储机制,采用Json格式存储数据;有动态查询语言;支持全文索引;支持复制和failover,以及自动patition;支持二进制大数据存储(photo/video);目标是集成关系数据库和kv数据的优点为一身的DBMS
- CouchDB:支持自动复制master-master模式,有自动双向解决冲突的机制;采用RESTful Jason格式的API;有基于web的管理工具;支持查询和索引,并且可以提供基于javascript的面向表的查询引擎;有第三方的工具lounge(meebo.com) 可以做patition,内建的patition开发中;
这一些是相对更复杂,目标更大的产品,都以某些论文(特别是Amazon的Dynamo,以及Google的BigTable)为基础或者深受其影响的实现产品。提供更完备的分布式KV数据管理系统,功能上有更复杂更有效的自动复制/容错/分区,有基于表/字段结构的数据结构,支持动态查询语言,全文检索,以及监控等高级功能,更像是完备的分布式DBMS。
下边的表格列出上边提到的一些特性:
| 项目名称 |
重量级玩家 |
扩展性/分布式 |
客户端协议/语言封装 |
参考实现 |
实现语言 |
| MemcacheDB |
Sina |
Replication |
Memcached |
Memcached |
C |
| Tokyo Cabinet/Tyrant/LightCloud |
Mixi.jp / Plurk.com |
Replication, partition(LightCloud) |
Cabinet(C/Perl/Java/Ruby/Lua) / Memcached |
Dynamo |
C |
| Redis |
None |
Replication, partition |
PHP / Ruby / Python / Java / Erlang |
None |
C |
| Flare |
None |
Replication,partation |
Memcached |
Memcached |
C |
| Cassandra |
Facebook / Digg / Rackspace |
Replication,partition |
Thrift |
Dynamo/BigTable |
Java |
| Voldemort |
LinkedIn |
Replication,partition |
Protocol Buffers / Thrift / Java Serialization / Json |
None |
Java |
| HyperTable |
Baidu / ZEvents |
Replication,partition |
Thrift / C++ |
BigTable |
C++ |
| HBase |
Yhaoo / Powerset / Ning |
Replication,partition |
Java |
BigTable |
Java / HTTP / Thrift |
| MongoDB |
SourceForge / Disqus |
Replication,partition |
PHP / Python / Java / Ruby / C++ / Perl |
None |
C++ |
| CouchDB |
BBC / Meebo / UbuntuOne |
Replication,partition |
HTTP |
None |
Erlang |