2 NoSQL潮流
比如,列存储Hypertable遵循Google的Bigtable方法,同意本地搜索引擎Zvent储存每天十亿数据单元[Jud09]。再举一个样例,Google每天可以处理20PB存储在Bigtable的数据。通过它的MapReduce方法[Com09b]。
尤其是对Web 2.0公司,可扩展性方面的考虑对他们的业务至关重要,就像Last.fm的Johan Oskarsson指出:“Web 2.0公司能够抓住机会,他们须要可扩展性。当你将这两者组合,会使NoSQL很引人注目。
”(Johan Oskarsson。Last.fm的meetup组织者和web开发。參见[Com09a])。
博主Nati Shalom允许:“成本压力也迫使很多组织寻找更具成本效益的替代品,研究表明。基于商用硬件的分布式存储能够比很多现有的高端数据库更可靠”(參见[ Sha09a ]和进一步阅读[ Sha09c ])。
他总结道:“全部的这些导致了一个高效成本的'扩展第一数据库’的需求”。
这对具有低复杂度的数据结构的应用特别重要。因其非常难从关系数据库的特性中受益。
Dare Obasanjo声称“全部你真的须要[作为一个Web开发者]是支持某种程度的查询功能并具有良好的持久性语义的键-值或元组存储。”([Oba09a])。博主和数据库分析师Curt Monash也在这方面表示:“SQL是过程式代码的一个尴尬的选择,差点儿全部的代码是过程式的。
对用户希望做重的、反复操作的数据而言,映射数据到SQL的成本是值得的。
但当你的数据库结构是很很的简单,SQL可能不是故意的。
”SpringSourceproject师Jon Travis允许:“关系型数据库给你太多。他们强迫你扭曲你的对象数据以适合RDBMS。”(在[Com09a]引用)。
”
仅仅要你的业务和表现层能够有力地处理不一致数据,这并不真的非常重要。
非常明显这不是理想的,而且最好没有不论什么数据损失、不一致或服务中断,可是接受数据丢失或不一致(甚至仅仅是临时的)作为一种可能性,打破了迄今为止关系数据库世界最大的’障碍’,能够产生巨大的灵活性。
Shalom报道了2009夏天eBay的一次架构峰会。与会者一致允许。尽管通常情况下,抽象被引入以试图隐藏应用程序(如通过代理层将请求路由到特定的server)中分散和分区问题,“这个抽象无法将应用与分区和分散的现实隔离。故障幅度在一个网络内全然不同于一台机器内的故障。
应用程序须要注意到延迟、分布式故障等,使得它有足够的信息来做出详细的上下文相关的决定。系统是分布式的事实渗透到这样的抽象中。”([ Sha09b ])。因此他建议设计数据模型以适应分区环境,即使最初仅仅有一个集中式数据库server。这样的方法提供的优势是避免极晚且昂贵的应用代码更改。
然而,更专业的解决方式会实用武之地,由于一个“一刀切”的思想以前是而且如今还是对于数据库的错误认识。
- Java和.NET世界中的实体关系映射。如Java持久化API(JPA,EJB3规范的一部分,[DKE06],[BO06])。实现如Hibernate([JBo10a])。或带SQLMetal代码生成器的LINQ Framework([BH05])。和从.NET version4 開始的ADO.NET Entity Framework([Mic10])。
- 相同的,流行的Ruby on Rails框架([HR10])和其它隐藏关系型数据库使用的尝试(如实现RoR中的动态记录模式)
- NoSQL数据存储以及一些云计算供应商提供的数据库全然省略了关系数据库。
这种云数据存储的一个样例是Amazon的SimpleDB。一个无模式,基于Erlang的终于一致性的数据存储,其特点是作为一个实体的属性值(EAV)。
它能够存储大量items的集合,当中items是装载由键值对组成的属性集的hashtable([ Nor09 ])。
- 数据仓库型特定数据库,为批量数据处理和Map/Reduce作业设计的
- 简单,可扩展和高速的键值对存储
- 包括比键值对存储更丰富特性的数据库。填补了传统RDBMS的空白,并提供良好的性能和扩展性(如文档数据库)
此外,随着NoSQL数据存储的发展Hoff得出结论:“看远一点,非常明显MySQL + memcached的时代正在过去。它将坚持一段时间。
旧技术非常少全然消失。
”([ Hof10c ])。
作为样例。他列举了大站点和玩家走向非关系数据存储包含LinkedIn、Amazon、Digg和Twitter。Hoff提到下面使用NoSQL解决方式的原因,已在本文前面解释:
- 关系数据库在读时计算,这对大型网络应用(如Digg)被觉得是错误的。
NoSQL数据库因此不提供或避免复杂的读操作。
- 应用程序的线性特性须要常常等待从数据存储的I/O,这对可扩展性和低响应时间不利。
- 大数据量和高的生长因子促进Twitter開始使用Cassandra,它被设计为可操作大尺度数据。
- 此外,像Twitter这种公司执行和维护系统的运营成本不断上升。
这种规模的网络应用因而“须要一个能够以更自己主动化的方式来发展并高度可用的系统”(在[ hof10c ]引用)。
Amazon的James Hamilton允许这一声明。对很多大型站点的可扩展性,从零開始是至关重要的。甚至比与传统RDBMS相比缺少部分特性的劣势更重要:
全部这些服务的共同主题是。扩展比特性更重要。他们没有可能执行在一个单独的RDBMS上。”(參见[ Ham09 ]引用[ Sha09a ])
在上世纪60和70年代的数据库被设计为单一的大型高端机器。
与此相反,今天。很多大型(网络)公司使用可能会故障的商用硬件。因此应用程序被设计来处理这种故障,被觉得是“操作的标准模式”。就像Amazon指出的(參见[ DHJ+07。205页])。此外。关系数据库适合的数据是刚性结构的关系。并同意用一个复杂语言表示的动态查询。Lehnhardt和Lang指出,今天。特别是在网络领域。数据既不是严格的结构,也不须要动态查询,大多数应用程序已经使用准备语句或存储过程。因此。数据库内提前定义查询和动态赋值给变量是足够的([ PLL09 ])。
他们质疑这样的保持应用程序感知不到不论什么分布式的后果的方法,如在著名的八个分布式计算的谬误中描写叙述的([ Gos07 ] ):
- 获得较关系数据库小的的开销和内存占用
- 通过Web技术和RPC调用訪问
- 数据查询的可选形式
数据库管理系统供应商(和研究界)应该開始用一张白纸为明天的要求设计系统。而不是继续为昨天的需求推动代码行和架构设计”。但Stonebraker等人怎样得出这个结论?他们在关系型数据库管理系统中发现什么固有的缺陷?他们为“全然重写”提供什么建议?
他们指出,“流行的RDBMS所有能追朔到20世纪70年代的System R”:IBM的DB2是一个System R的直系后代,微软的SQL Server从Sybase System 5进化而来(还有一个System R的直系后代)。Oracle在其第一个版本号中实现了System R的用户界面。因而,System R的架构已经被70年代的硬件特性影响了。那以后。处理器速度、内存和磁盘的大小有显著添加,这些因素今天已经不像过去那样限制程序。然而。硬盘和内存间的带宽并不像CPU速度、内存和磁盘大小那样添加得快。
Stonebraker等批评,硬件领域的发展没有影响RDBMS的架构。尤其是下面的System R的架构特点仍然在今天的RDBMS中能够找到:
- 面向磁盘的存储和索引结构
- 多线程来隐藏时延
- 基于锁的并发控制机制
- 基于日志的恢复
这些新兴市场的样例包含“数据仓库、文本管理和流处理”。“它们的需求与商业数据处理有非常大的不同”。在先前的文章([ Sc05 ])他们已经说明了RDBMS“会在一些应用领域被专业的架构超过一个数量级或很多其它,包含:
- 文本(专业引擎如Google,Yahoo等)
- 数据仓库(列存储如Vertica,Monet等)
- 流处理(流处理引擎如StreamBase和Coral8)
- 科学和智能数据库(数组存储引擎如MATLAB和ASAP)”
特别是他们的考虑反映过去几十年的硬件发展,以及它怎样能或应该改变RDBMS的架构以便从更快和更大的硬件中获得优点。也给他们坚持的“全然重写”以注解。
Stonebraker等人因此觉得OLTP市场在今天或在不久的将来是内存数据库市场。
他们因此批评,“眼下RDBMS供应商用面向磁盘的解决方式处理主内存问题。总之。摩尔定律的30年已使OLTP应用程序的面向磁盘的体系结构变得过时”。
尽管有些关系数据库在内存中执行(比如TimesTen。SolidDB)。但这些系统也从System R继承了“包袱”——Stonebraker等人对基于磁盘的恢复日志或动态锁定的称呼,这对这些系统的性能有负面影响。
为了避免在这样一个单线程系统中长期执行的事务,要求应用程序将此类事务分解为较小的事务。或——在分析的目的下——在为该任务优化过的数据仓库中执行这类事务。
他们指出,这些要求显著影响了DBMS的架构,如在不影响执行事务的条件下数据传输的能力,这可能不能非常easy地加入到现有的RDBMS中。但能够在新系统的设计中考虑(像比較新的数据库如Vertica)。
重新,他们概述了这一问题的历史发展,从线下保存当灾难发生时再恢复的日志磁带,到将日志磁带挂在远程硬件上并提供灾备服务。到今天非常普遍的热备份或多网站解决方式。Stonebraker等人把高可用性和内置的灾难恢复作为一个重要的功能。像他们提到的其他设计问题一样,在这些系统的架构和设计层面考虑。他们特别须要OLTP领域的DBMS具有:
今天恰恰相反。人员成本是一个IT公司的主要支出。他们特别批评说“RDBMS有大量复杂的
为代替提供这类仅仅是为了调整而寻找更好配置的特性,Stonebraker等人须要一个数据库。没有这种调整仅仅有“自我的一切”(自我恢复,自我维护,自我调节等)。
- 重做日志持久化必须避免,由于它们是“差点儿保证是一个显著的性能瓶颈”。
在HA/故障恢复系统上面它们能够全然省略。
- client与数据库之间通过JDBC/ODBC接口的通信是他们提到的下一个引起性能衰退的问题。代替这种接口,他们“提倡在数据库系统中‘在进程内’执行应用程序逻辑,通过存储过程的形式”。以避免“传统的数据库客户机/server模式所隐含的进程间开销”。
- 他们建议进一步消除撤销日志。“无论实际情况,由于它也将是一个重要的瓶颈”。
- 解决的下一个性能瓶颈是同意并发訪问的动态锁。动态锁定的成本也应降低或消除。
- 多线程的数据结构导致事务加锁。
假设事务的执行时间非常短,一个单线程执行模型能够消除这种闭锁与多线程数据结构的开销,仅仅会“在性能上有小损失”。
- 最后,两阶段提交(2PC)事务应尽可能避免。由于该协议造成的网络传输回合将导致性能下降,由于它们“通常以毫秒级的时间先后发生”。
因此,大纲是一个1-n关系的树”。
有此属性的大纲。特别easy在一个网格上的节点之间分布。“这样全部树中的等值连接跨度仅仅有一个单一的网站”。这样的模式的根表通常由它的主键分区并移动到网格的其它节点,使每个节点上有根表的分区以及其它表中该根表分区的主键值所相应的数据。
如受约束树应用满足这样的属性。
Stonebraker等人说,非常多OLTP事务具有这种属性。因此利用它在他们的H-Store原型中替代撤消日志。
- H-Store执行在网格上
- 表的每一行在内存中连续存放
- 使用B树索引
- 网站被划分成逻辑网站,每一个相应一个CPU核
- 逻辑网站是全然独立的,具有自己的索引、元组存储和他们所在机器的主内存的分区
- 单线程工作。事务不可中断
- 仅同意执行以存储过程实现的提前定义事务
- 省去了重做日志并试图尽可能避免写撤消日志。假设撤消日志无法避免它在事务提交时被丢弃
- 假设可能,查询执行计划利用上述讨论的单网站和一次性属性
- 尝试实现无调整和高可用性需求,以及通过“指定水平分区、复制位置、索引字段的全自己主动物理数据库设计器”实现事务的单网站变换
- 由于H-Store保存每一个表的多个副本。须要事务地进行更新。读命令能够去表的不论什么副本,而更新是针对全部副本
- H-Store利用上述事务和大纲特性进行优化,比如在两阶段事务中省略撤消日志
因此,在一个单一的成对HA的网站上。ACID特性能够没有不论什么开销地实现”。通过进一步应用技巧。他们实现“使用[模式分区和复制的]基本策略并用上面描写叙述的技巧增强,全部事物类成为一次性的和强两阶段的。仅仅要我们加一个短延时,ACID特性能够在无不论什么并发控制开销的情况下实现。
”
他们还分析了在商业DBMS的性能开销,发现主要是由日志和并发控制引起的。
一个SQL的泛化称为StreamSQL。同意使用SQL的FROM语法混合流和关系型数据。引发了一些热情,并被建议当作此领域的标准。Stonebraker等人还提到在流处理中常常须要流数据是扁平的(如一些新闻机构提供的数据流),但也有层次化结构数据的须要。因此。他们“期待流处理厂商更积极地进军层次数据模型”,“他们一定会偏离Ted Codd原则”。
一些建议包含XML大纲(由于其复杂性争论激烈)和RDF
“[这]导致了高开销的接口”。Stonebraker等人因此建议“在编程语言中嵌入数据库的功能”。
这种语言嵌入样例包含。上世纪70年代的Pascal R和Rigel,或今天微软在.NET平台的LINQ方法。关于语言整合这种能力。他们喜欢他们所谓的“小语种”如Python,Perl。Ruby和PHP,他们“开放源代码。能够通过社区改进”,此外“比眼下通用的语言(被看作编程语言世界中的一刀切的方案)更easy改动”。他们的H-Store原型中的存储过程计划从C++迁移到Ruby。
特别执行大型和高频站点的大网络公司或企业已经从关系数据库(通常有一个缓冲层典型地如memcached,參见[ Hof10c ],[ Hof10b ])切换到非关系数据存储。样例包含最初由Facebook开发的Cassandra([ Apa10d ])且今天还被Twitter和Digg使用([ Pop10a ]、[ Eur09 ])。LinkedIn开发和使用的Project Voldemort,存储云服务如NoSQL存储Amazon SimpleDB([ Ama10b ]),以及Ubuntu One,一种基于CouchDB的云存储和同步服务([ Can10c ]、[ Hof10c ])。这些NoSQL数据存储的用户,天然地对他们使用的非关系型解决方式的进一步发展很感兴趣。然而,最流行的NoSQL数据存储所採用的思想是Google的Bigtable([ CDG+06 ])或Amazon的Dynamo([ DHJ+07 ])。Bigtable启示的NoSQL存储通常被称为列存储(比如HyperTable,HBase),而Dynamo主要影响键/值存储(如Cassandra[ Apa10d ]。Redis[ S+10 ],Project Voldemort[ K+10a ])。其它项目追求不同的尝试,如图形数据库形成一类自己的数据存储;和文件存储。这能够被看作是具有附加功能的键/值存储(至少同意键/值对具有不同的、一般是分层的命名空间。提供了“文档”的抽象);后者中至少一个(CouchDB)是现有文档存储如上世纪90年代的Lotus Notes的又一次实现,因此没有结合当前的网络技术进行设计(这被CouchDB开发人员们批评,他们又从零開始实现他们的文档存储,參见[ Apa10c ]、[ PLL09 ])。综上所述,能够得出的结论是NoSQL潮流的先驱主要是大型网络公司或执行大型站点的公司,如Facebook,Google和Amazon([ Oba09a ]),和在这一领域的其它人通过他们的想法和改动以满足自己的需求。
然而,特别是出问题后没有人可责怪的情况会吓到商务人士。
即使在Adobe。开发人员使用Terracotta集群替代关系数据库,也仅仅有在让他们的经理看到了系统启动和执行时才干说服他们(參见[ Com09a ])。
炒作是过度承诺的自然伴生,大多数技术高速构建以达到炒作的顶点。之后,差点儿总是对没有得到充分开发的想法的过激反应,这不可避免地导致崩溃。接下去是一个时期的冷嘲热讽。很多新技术的发展到这一点,然后消失。幸存下来的那些是由于有人发现了一个基本思想的好应用(=真实的用户利益)。
”([ For10 ]引用[ Bez93 ])
博主Dennis Forbes说在非关系型数据存储的发明者和开发人员之间看不见不论什么过度热情(“他们大部分是聪明的。务实的开发人员”),但使用这些技术开发人员却希望“这个潮流解决他们的弱点”。
他——一个为金融、保险、电信、电力等行业做传统的关系数据库开发——却说“无疑是非常多奇异的工作发生的NoSQL阵营中,非常关注可伸缩性”。
还有一方面。在他博客的评论中批评说:“争论的是。聚会的本身。被正在或希望建立非常大的网络公司的人劫持了(都希望成为下一个Facebook)。该领域的价值观和推断投射到整个数据库产业——其包含一系列使社交媒体的边缘样例也相形见绌的解决方式——这真是讽刺”([ For10 ])。(注:不懂,好像是在骂人)
NoSQL的拥护者觉得CouchDB是“Notes的成功”。由于Notes的分布特征并没有利用当前的网络技术,软件本身也不是一个精干的数据存储而是因业务相关的特性而臃肿([ PLL09 ])。
博主Nati Shalom评论例如以下:“我觉得我们所示是很多其它的一种现实,现有的SQL数据库方案可能不会非常快消失,但同一时候他们不能解决世界上全部的问题。
有趣的是,NoSQL这个词已经变为Not Only SQL,以代表这一思路”([ Sha09a ])。一些博主强调这个词语不精确。如Dare Obasanjo说,“还没有什么产品是‘NoSQL’数据库的确切技术定义,当其实它不是一个关系数据库”([ Oba09a ])。其它人。如Michael Stonebraker声称。根本和SQL没半毛钱关系,应该叫“NoACID”之类,这是由Dennis Forbes提出的并在他的建议里引用了Stonebraker([ For10 ])。另一些人如Adam Keys批评术语“NoSQL”仅仅定义了它不代表什么趋势([ Key09 ]):“这个名字的问题是,它仅仅定义了它不是什么。这使得它是对抗性的,它所包括或排除的东西不令人吃惊。我们看到的是,它终结了有价值的数据应该保存在某种关系数据库的如果。终结了SQL和ACID是解决我们问题的唯一工具的如果。终结了主/从模式的活力;终结了在我们的应用程序代码里编织关系模式”。他建议把这样的潮流和数据存储归入“后关系型”而不是“NoSQL”:“我们看到关于应怎样存储关键数据的思维爆炸;我们审视数据来看是否值得持久化;我们尝试新的语义结构、一致性和并发性。如同后现代主义是反思过去的艺术和建筑的方式,后关系型是软件开发商又一次考虑自己方式的一个机会。正如后现代主义并非否能定整个艺术史,后关系型不会终结关系数据库的有用性。”([ Key09 ])。然而。像他博客的读者评论的,这个词并不比“NoSQL”更好,由于它仍仅仅是定义这个潮流和这种数据库不反映(或更好的:他们所省略)的东西。而不是它们主张什么。
这导致了下面选择:要么在应用程序中对多个网站上的数据碎片/分区导致“管理分布式数据的严重问题”。或从MySQL走向商业RDBMS可引起大的许可费;或甚至全然放弃RDBMS。
为了降低通信开销的还有一个选择是使用一个嵌入式DBMS。指的是应用程序和DBMS在同一地址空间中执行;由于强耦合。安全性和訪问控制问题对“安全是一个大问题的主流OLTP”没有可行的替代。Stonebrakers觉得。
因为日志文件被保存到磁盘以确保持久性,日志是昂贵的且会减少事务性能。
这些数据结构都是由多个线程訪问短期锁(称为闩锁)通经常使用于提供并行的但慎重的訪问。
- 在多个网站之间数据分布且无共享的方法在关系型以及非关系型数据存储中都提供了。
“显然,一个精心设计的多网站系统。不管是否基于SQL或其它,都比单网站系统更具可扩展性”,据Stonebraker说。
- 很多NoSQL数据库是基于磁盘的。实现一个缓冲池和多线程。当提供这些特性和性能时,四个性能开销来源中的两个仍然存在(锁定。缓存管理)。不能被消除。
- 非常多智能事务的NoSQL数据存储仅仅提供带BASE属性(见第3章)的单记录事务。与关系型DBMS相反,ACID属性为性能而牺牲。
在他的观点中,加速DBMS的实际任务集中于消除加锁、闩锁、日志和缓冲区管理。以及支持存储过程从高级语言(如SQL)编译为低级语言。这种系统的样子在论文“架构时代的终结:是全然重写的时候了”([SMA+07])中被阐述并已经在上文讨论了。
Schmidt指出,对一些报表任务来说MapReduce方法([ DG04 ])是合适的,但不是对每个即席查询。此外,他看到的是文化而不是技术问题。客户已经被培训和“上瘾”使用即席查询。因而不喜欢这些手段的缺失。针对详尽报表的需求。Schmidt建议使用镜像了线上库的关系型数据库,而线上库可能由于性能和可扩展性要求而使用NoSQL存储。
BJ Clark继续说:“扩展不是:性能。在现实中,扩展和变快没有什么关系。它仅仅与大小有关。如今。扩展和性能典型地如此联系到一起,假设什么是高效的,它实际上可能不须要扩展。”([ Cla09 ])。
分片是最明显的扩展方式,但分片多个能訪问随意列的表会非常快使人崩溃。”博主Dennis Forbes允许他。“有一些老派的关系数据库确实有扩展性问题”([ For10 ]),但使用如Adam Wiggins的技术还是有可能让它们扩展的([ Wig09 ])。
但Forbes也主张关系数据库通过数据分区和将每台机器增加失败恢复集群实现的水平缩放。以达到冗余和可用性。考虑到约束非常少且钱通常不是问题的大公司的部署情况。他以自己的经验说,“这样的扩展存在于差点儿全部的银行、交易系统、能源平台、零售系统等等。要声称SQL系统不能扩展,是对这样明显的证据的蔑视,无视全部的理由”([ For10 ])。Forbes主张使用自己的server。由于他看到一些云计算环境的人为限制,如单一实例的Amazon EC2的IO限制和相对高费用;他觉得“这些金融和人为限制解释了对同意你螺旋上升的技术的强烈兴趣”([ For10 ])。
- 键/值对存储Tokyo Tyant/Cabinet和Redis不提供自己主动水平伸缩的特性。假设加入机器——类似memcached——必须让应用知道。然后在数据库server群中对数据库条目(重)哈希,以利用额外的资源。还有一方面他指出,Tokyo Tyant/Cabinet和Redis的表现非常好,横向扩展的须要不会非常早出现。
- 分布式键/值存储Project Voldemort自己主动地利用新加入集群的server并提供故障容错。鉴于它专注于分片和故障容错且有一个可插拔的存储架构,Tokyo Tyant/Cabinet或Redis能够作为Voldemort的存储后端。假设这些系统须要扩展的话,这也是一个可能的迁移路径。
- 文档数据库MongoDB表现出良好的性能特点。但在评价时没有自己主动缩放能力,由于它没有提供自己主动分片(在2010年8月的1.6版中已经改变,參见[ Mon10 ]和[ MHC+10b ])。
- 对于列数据库Cassandra,Clark觉得它是“绝相应该,且可能在Facebook,是通过简单地加入还有一台机器来扩展的(节点间互相挂钩使用Gossip协议),但OSS版本号不支持一些关键的东西,像一起释放一台机器“。
这一结论反映了Cassandra评价时的发展状况。
- Amazon的键/值对存储S3扩展良好。但据Clark说,它不如其它候选者那样高性能。
- MySQL,相比較而言,并不提供自己主动横向扩展如自己主动分片,但Clark指出。对于大多数应用(甚至是Web应用如Friendfeed,參见[ Tay09 ])MySQL足够快。而且是“熟悉的、无处不在的”。
与Tokyo Tyant/Cabinet和Redis相比,Clark觉得“它能够做Tokyo Tyant和Redis能够做的一切。且真的是没有那么慢。其实,对于某些数据集。我见过MySQL比Tokyo Tyant运行地快得多”和“对MySQL分片与Tokyo Tyant和Redis一样easy甚至更easy,非常难说他们能够在更多问题上赢得胜利。”
此外必须提到的是,评估发生在2009的夏天(博客是8月发表),因此,结果反映了被评价系统在那个时候的发展状态。
因此。甚至能够觉得“扩展MySQL(通过MySQL Proxy来分片)和为这些NoSQL数据库做分片相同easy。”因此他没有宣布RDBMS早早死亡。提醒道MySQL仍然是在大站点如Facebook,Wikipedia和FriendFeed中使用。他建议新的应用程序使用最适合工作的工具,反映了非关系型数据库——就像关系型的一样——没有“一刀切”的解决方式:
假设我须要ACID特性,我不会使用NoSQL。假设我须要一吨值对,我会使用Redis。假设我须要事务,我会使用Postgres。假设我有一吨单一类型的文件,我可能会使用Mongo。假设我须要每天写10亿个对象,我可能会使用Voldemort。假设我须要全文搜索。我可能会使用Solr。
假设我须要易变数据的全文搜索,我可能会使用Sphinx。”
此外,NoSQL数据库有时被看作MySQL加memcached方案的继任者(比如[ Hof10c ]),后者将负载从数据库带走以降低和延缓分布式的需求。关于这些典型争论博主Dennis Forbes提醒。不easy区分一般的RDBMS和MySQL,其他数据库可能更easy或更好地扩展:“MySQL不是RDBMS世界的先锋。它在高负载站点下的问题和关注非常少与其他数据库系统相关”([ For10 ])。
他指出“对特定情况下的每个解决方式都能够提出好的讨论,但上述那些仅仅是讨论某一特定类型的存储引擎。”Scofield因此批评,将讨论范围缩小到仅仅有一类NoSQL数据库,会使得传统主义者非常easy地否定整个潮流或全套不同的NoSQL方法。
” 考虑到Friendfeed使用MySQL的频繁争论([ Tay09 ])。Scofield指出,虽然微调一个关系型数据库是可能的。但这对全部类型的数据没有意义。“不同的应用适合不同的事情。关系数据库对关系数据是伟大的,但对非关系数据为什么要使用他们?”他问道。
已经透露的是这些数据库中的一些借鉴了Amazon的Dynamo([DHJ+07 ])或Google的Bigtable([ CDG+06 ])或两者的思想。
其它一些移植了针对现代网络技术开发的现有数据库的思想如CouchDB。另一些人追求全然不同的方案如Neo4j或HypergraphDB。
词汇 | 符合的数据库 |
Key-Value-Cache
|
Memcached
Repcached
Coherence
Infinispan
EXtreme Scale
Jboss Cache
Velocity
Terracoqa
|
Key-Value-Store
|
keyspace
Flare
Schema Free
RAMCloud
|
Eventually-Consistent Key-Value-
Store
|
Dynamo
Voldemort
Dynomite
SubRecord
Mo8onDb
Dovetaildb
|
Ordered-Key-Value-Store
|
Tokyo Tyrant
Lightcloud
NMDB
Luxio
MemcacheDB
Actord
|
Data-Structures Server
|
Redis
|
Tuple Store
|
Gigaspaces
Coord
Apache River
|
Object Database
|
ZopeDB
DB4O
Shoal
|
Document Store
|
CouchDB
Mongo
Jackrabbit
XML Databases
ThruDB
CloudKit
Perservere
Riak Basho
Scalaris
|
Wide Columnar Store
|
Bigtable
Hbase
Cassandra
Hypertable
KAI
OpenNeptune
Qbase
KDI
|
表2.2总结了他的数据仓库分类,另外包含一些仅仅在云计算环境中可用的数据存储。
归类 |
符合的数据库
|
Distributed Hash Table, Key-Value Data Stores
|
memcached
MemcacheDB
Project Voldemort
Scalaris
Tokyo Cabinet
|
Entity-Attribute-Value Datastores
|
Amazon SimpleDB
Google AppEngine datastore
Microsoft SQL Data Services
Google Bigtable
Hadoop
HyperTable
HBase
|
Amazon Platform
|
Amazon SimpleDB
|
Document Stores, Column Stores
|
Sybase IQ
Vertica Analytic Database
Apache CouchDB
|
归类 | 符合的数据库 |
Key-value Stores
|
Redis
Scalaris
Tokyo Tyrant
Voldemort
Riak
|
Document Stores
|
SimpleDB
CouchDB
MongoDB
Terrastore
|
Extensible Record Stores
|
Bigtable
HBase
HyperTable
Cassandra
|
这一分类法实际上是一个简短的NoSQL数据库非功能类型(“称为ities”)的比較,外加功能覆盖率的评分。
Popescu总结了Scofield的思想。如表2.4。
|
性能
|
扩展性
|
灵活性
|
复杂性
|
功能性
|
Key-Value Stores
|
high
|
high
|
high
|
none
|
variable (none)
|
Column stores
|
high
|
high
|
moderate
|
low
|
minimal
|
Document stores
|
high
|
variable (high)
|
high
|
low
|
variable (low)
|
Graph databases
|
variable
|
variable
|
high
|
high
|
graph theory
|
Relational databases
|
variable
|
variable
|
low
|
moderate
|
relational algebra
|
因此,他仅仅研究
真正分布式和提供自己主动数据分区的数据库的写操作扩展。当数据大小超过单一机器的能力时,
假设不愿意手动分区的话后者系统似乎是他唯一的选择(这不是一个好主意,依据[ Oba09b ])。对于相关的提供自己主动分片的分布式系统,Ellis看到两个重要特点:- 支持多数据中心
- 加入机器到现有群集的可能性,对使用该群集的应用程序透明
数据存储
|
在线加入机器
|
多数据中心支持
|
Cassandra
|
X
|
X
|
HBase
|
X
|
|
Riak
|
X
|
|
Scalaris
|
X
|
|
Voldemort
|
|
Some code required
|
表2.6显示了他的调查结果,指出了各种数据模型和查询APIs的巨大区别。
数据存储
|
数据模型
|
查询API
|
Cassandra
|
Columnfamily
|
Thrift
|
CouchDB
|
Document
|
map/reduce views
|
HBase
|
Columnfamily
|
Thrift, REST
|
MongoDB
|
Document
|
Cursor
|
Neo4j
|
Graph
|
Graph
|
Redis
|
Collection
|
Collection
|
Riak
|
Document
|
Nested hashes
|
Scalaris
|
Key/value
|
get/put
|
Tokyo Cabinet
|
Key/value
|
get/put
|
Voldemort
|
Key/value
|
get/put
|
- Columnfamily模型,由Cassandra和HBase实现,是由Google的Bigtable论文第二节的相关段落得到启示([ CDG+06,2页])。Cassandra与HBase相反省略了历史版本号,引入了超列的进一步概念。在Cassandra和HBase里列是稀疏的,这意味着他们可能有不同数量的单元。且列不必预先定义。
- 键/值模型是最easy实现的,但可能是低效的,假设一个人仅仅对请求或更新与某个键相关的部分值感兴趣。此外。在键/值存储上非常难构建复杂的数据结构(正如Ellis在还有一篇博客中描写叙述的。參见[ Ell09b ])。
- Ellis将文档数据库看做是键/值存储的下一步,由于它们同意嵌套的值。他们同意比键/值存储更效率地查询数据结构,由于当他们请求一个键时不须要返回整个BLOB值。
- 图数据库Neo4j具有独特的数据模型。因对象及其关系被作为一个图的节点和边来建模和持久化。适合此模型的查询可能比其他数据存储上同样的查询快三个数量级(由Emil Eifrem。Neo4j背后公司的首席运行官,參见[ Eif09 ])。
- Scalaris在所评价的键/值存储中是独一无二的,由于它同意多个键上的分布式事务。
数据存储
|
持久化设计
|
Cassandra
|
Memtable / SSTable
|
CouchDB
|
Append-only B-tree
|
HBase
|
Memtable / SSTable on HDFS
|
MongoDB
|
B-tree
|
Neo4j
|
On-disk linked lists
|
Redis
|
In-memory with background snapshots
|
Riak
|
?
|
Scalaris
|
In-memory only
|
Tokyo Cabinet
|
Hash or B-tree
|
Voldemort
|
Pluggable (primarily BDB MySQL)
|
Scalaris通过复制解决问题——但它不支持多个数据中心——掉电的威胁依旧存在。
这一持久化策略具有与内存数据库相媲美的性能特点(由于——与基于磁盘的策略相比——由于追加日志和将整个内存表写回磁盘减小了寻道时间),且避免了纯内存数据库的耐久性问题。
不足之处是,他们缺乏特定的特性且把责任还给程序猿。样例包含:Project Voldemort,Ringo。Amazon SimpleDB,Kai,Dynamite,Yahoo PNUTS,ThruDB。Hypertable,CouchDB。Cassandra,MemcacheDB。
样例包括:文件系统,Cassandra,BerkelyDB。Amazon SimpleDB。
此外。重要的是要注意。一些
数据库能够在不同的类中找到(Cassandra。SimpleDB),因此这样的分类不提供一个确定的差别使每一个数据库仅仅归入一个类(这——在作者看来——在NoSQL数据库领域即使不是不可能至少也非常困难)。这些产品以他们的数据结构来分类。追随上面所提到的Yen,North和Cattell的分类法(參见2.3.1),这也被本文的其它多数资料来源共享。在这篇文章中使用的分类是:键/值存储、文档数据库和面向列的数据库。