采用一个产品/解决方案
如今市场上的选择非常多样化,可根据“非关系型数据库”侧重的面不同而进行差异化的处理。与此同时,企业应用场景可能需要不同类型的特点。然而以不同的解决方案来处理不同的应用/使用场景从规模经济的角度出发对于企业是不适宜的。因此最好是根据目标应用的需要最终落实到某一个具体的产品/解决方案上。需要注意的是大多数的解决方案在特性上都会有一些折中,有些特性可能在其它的产品中可以获得,有些可能只是在发展路线图当中暂时设定了一个位置。因为大部分的产品会在不久的将来不断趋于成熟,因此可以通过不同配置来提供不同的解决方案。所以只要现有的解决方案能适合目前大部分的需要,不妨作为一个起点将其采纳。
选择产品/解决方案的经验法则
- 支持所需要的逻辑数据模型应当被给予更高的权重。这将从实质上决定该解决方案在当前或未来能否灵活地适应不同的业务需求。
- 调查该产品所支持的物理数据模型的合适与否,据此对这一解决方案所需要的水平伸缩性、可靠性、一致性和分区性作出合理的评估。这同样能表明备份和恢复机制的可能性。
- 接口支持需要与企业标准的运行环境对齐。由于这些产品支持多样的接口,所以这一点可以得到很好的处理。
- 只要产品支持水平伸缩性,对于持久化模型的选择就不再重要了。
这里有一份一系列“非关系型数据库”的对照表。对于现在正认真考虑采用的企业来说,这是一个不错的起点。为了更贴近企业本身的情况,从25+的集合中挑选出的子集所用到的的关键选择标准是:
- 最重要的一点首先是企业应用程序必须支持有一定复杂程度的数据结构。否则的话,应用程序管理复杂性的责任将变得非常大。我认为比较合理的应当是介于纯粹的键值对与关系型模式中间的一种方案。出于这方面的考虑像Vlodemort,Tokyo Cabinet等产品就排除在了我的列表之外。
- 第二点是以低成本的分片/分区为大容量数据提供水平支持。缺乏这样的支持就使得解决方案与任何关系型数据库无异了。因此像Neo4J(尽管他有丰富的基于图的模型),Redis,CouchDB等此时此刻就被过滤出我的列表之外了。
- 最后一条评判标准,在企业级推广之前我会考虑一定程度的商业支持。否则的话,一旦出现生产环境的问题,我该去找谁呢?出于这一点,我不得不将现在的一些明星产品排除在外,比如Cassandra(尽管有很大的可能不久的将来Rackspace或者Cloudera就会对其提供支持,因为它已经被用于一些生产环境里边了,比如Twitter,Digg,Facebook)。
有了这些过滤标准,我可以精简这一列表,符合目前企业可用的产品有 MongoDB (下一版本就会提供shards支持), Riak,Hypertable和HBase。下面这个表格中总结了这四个产品的主要特性。一个企业可以基于自己具体的实际情况从中作出选择,找到最适合自己需要的特性。
特性 |
MongoDB |
Riak |
HyperTable |
HBase |
逻辑数据模型 |
富文档,并提供对内嵌文档的支持 |
富文档 |
列家族(Column Family) |
列家族(Column Family) |
CAP支持 |
CA |
AP |
CA |
CA |
动态添加删除节点 |
支持(很快在下一发布中就会加入) |
支持 |
支持 |
支持 |
多DC支持 |
支持 |
不支持 |
支持 |
支持 |
接口 |
多种特定语言API(Java,Python,Perl,C#等) |
HTTP之上的JSON |
REST,Thrift,Java |
C++,Thrift |
持久化模型 |
磁盘 |
磁盘 |
内存加磁盘(可调的) |
内存加磁盘(可调的) |
相对性能 |
更优(C++编写) |
最优(Erlang编写) |
更优(C++编写) |
优(Java编写) |
商业支持 |
10gen.com |
Basho Technologies |
Hypertable Inc |
Cloudera |
|