key-value分布式存储系统查询速度快、存放数据量大、支持高并发,非常适合通过主键进行查询,但不能进行复杂的条件查询。如果辅以Real-Time Search Engine(实时搜索引擎)进行复杂条件检索、全文检索,就可以替代并发性能较低的MySQL等关系型数据库,达到高并发、高性能,节省几十倍服务器数量的目的。以MemcacheDB、Tokyo Tyrant为代表的key-value分布式存储,在上万并发连接下,轻松地完成高速查询。而MySQL,在几百个并发连接下,就基本上崩溃了。
虽然key-value分布式存储具有极高的性能,但是只能做类似于MySQL的SELECT * FROM table WHERE id = 123;简单主键查询。
“搜索索引引擎+key-value分布式存储”能够实现高并发的复杂条件查询、全文检索与数据显示。但是,由于索引更新需要时间,目前还不能实现完全意义上的Real-Time Search(实时搜索),只能称之为Near Real-Time Search(准实时搜索)。“搜索索引引擎+key-value分布式存储”除了做全文检索外,还可以在允许的索引延迟范围内,取代MySQL进行复杂条件查询。
我的文章《亿级数据的高并发通用搜索引擎架构设计》的程序编码已经完成,第一轮测试昨天已经结束,能够在高并发情况下实现1分钟内索引更新,属于“Near Real-Time Search Engine(准实时搜索引擎)+key-value分布式存储”应用。其中,索引引擎采用Sphinx,存储采用key-value分布式数据库Tokyo Tyrant。
以下是常见的key-value分布式存储系统:
项目名称 | 语言 | 容错性 | 持久性存储介质 | 客户端协议 | 数据模型 | 文档 | 赞助商/社区 |
Project Voldemort | Java | 分区, 复制, read-repair | Pluggable: BerkleyDB, Mysql | Java API | Structured / blob / text | A | Linkedin, no |
Ringo | Erlang | 分区, 复制, immutable | Custom on-disk (append only log) | HTTP | blob | B | 诺基亚, no |
Scalaris | Erlang | 分区, 复制, paxos | In-memory only | Erlang, Java, HTTP | blob | B | OnScale, no |
Kai | Erlang | 分区, 复制? | On-disk Dets file | Memcached | blob | C | no |
Dynomite | Erlang | 分区, 复制 | Pluggable: couch, dets | Custom ascii, Thrift | blob | D+ | Powerset, no |
MemcacheDB | C | 复制 | BerkleyDB | Memcached | blob | B | 新浪网, some |
ThruDB | C++ | 复制 | Pluggable: BerkleyDB, Custom, Mysql, S3 | Thrift | Document oriented | C+ | Third rail, unsure |
CouchDB | Erlang | 复制, 分区? | Custom on-disk | HTTP, json | Document oriented (json) | A | Apache, yes |
Cassandra | Java | 复制, 分区 | Custom on-disk | Thrift | Bigtable meets Dynamo | F | Facebook, no |
HBase | Java | 复制, 分区 | Custom on-disk | Custom API, Thrift, Rest | Bigtable | A | Apache, yes |
Hypertable | C++ | 复制, 分区 | Custom on-disk (HDFS, KFS) | Thrift, other | Bigtable | A | Zvents, 百度, yes |
Tokyo Tyrant | C | 复制 | Tokyo Cabinet | Memcached, HTTP, other | blob | A | mixi.jp, no |
其中,以下几款值得关注:
1、 Hypertable:它是搜索引擎公司Zvents根据Google的9位研究人员在2006年发表的一篇论文《 Bigtable:结构化数据的分布存储系统》开发的一款开源分布式数据储存系统。Hypertable是按照1000节点比例设计,以 C++撰写,可架在 HDFS 和 KFS 上。尽管还在初期阶段,但已有不错的效能:写入 28M 列的资料,各节点写入速率可达7MB/s,读取速率可达 1M cells/s。Hypertable目前一直没有太多高负载和大存储的应用实例,但是最近,Hypertable项目得到了 百度的赞助支持,相信其会有更好的发展。
2、Tokyo Tyrant:它是日本最大的SNS社交网站mixi.jp开发的 Tokyo Cabinet key-value数据库网络接口。它拥有Memcached兼容协议,也可以通过HTTP协议进行数据交换。对任何原有Memcached客户端来讲,可以将Tokyo Tyrant看成是一个Memcached,但是,它的数据是可以持久存储的。Tokyo Tyrant 具有故障转移、日志文件体积小、大数据量下表现出色等优势,详见:http://blog.s135.com/post/362.htm
Tokyo Cabinet 2009年1月18日发布的新版本(Version 1.4.0)已经实现 Table Database,将key-value数据库又扩展了一步,有了MySQL等关系型数据库的表和字段的概念,相信不久的将来,Tokyo Tyrant 也将支持这一功能。值得期待。
3、CouchDB:它是Apache社区基于 Erlang/OTP 构建的高性能、分布式容错非关系型数据库系统(NRDBMS)。它充分利用 Erlang 本身所提供的高并发、分布式容错基础平台,并且参考 Lotus Notes 数据库实现,采用简单的文档数据类型(document-oriented)。在其内部,文档数据均以 JSON 格式存储。对外,则通过基于 HTTP 的 REST 协议实现接口,可以用十几种语言进行自由操作。
4、MemcacheDB:它是新浪互动社区事业部为在Memcached基础上,增加Berkeley DB存储层而开发一款支持高并发的分布式持久存储系统,对任何原有Memcached客户端来讲,它仍旧是个Memcached,但是,它的数据是可以持久存储的。