Azure表格与Azure上的MongoDB的比较

67

我希望在Windows Azure上使用NoSQL数据库,并且数据量非常大。Azure Table存储或使用Worker角色运行的MongoDB数据库哪种可以提供更好的性能和可扩展性?有没有人使用过Worker角色在Azure上使用MongoDB?请分享您对在Azure上使用MongoDB与Azure Table存储相比的想法。

7个回答

73

Table Storage是Windows Azure的一项核心存储功能,可扩展(每个帐户可达500TB),持久(在数据中心三重复制,可选择到另一个数据中心地理复制)且无模式(每行可以包含任何属性)。通过分区键+行键定位行,提供非常快速的查找。所有Table Storage访问都通过良好定义的REST API进行,可通过任何语言使用(已经为.NET、PHP、Java、Python和Ruby创建了基于REST API的SDK)。

MongoDB是面向文档的数据库。要在Azure上运行它,您需要将MongoDB安装到Web/Worker角色或虚拟机上,将其指向云驱动器(从而提供驱动器号)或附加磁盘(适用于Windows/Linux虚拟机),可选地打开日志记录(我建议这样做),并可选地为您的使用定义外部端点(或通过虚拟网络访问它)。顺便说一下,云驱动器/附加磁盘实际上存储在Azure Blob中,因此您具有与Azure Tables相同的耐久性和地理复制。

比较这两者时,请记住,Table Storage是“存储即服务”:您只需访问众所周知的REST终结点即可完成。对于MongoDB,您需要负责维护数据库(例如,每当MongoDB Inc(前10gen)推出新版本的MongoDB时,您需要相应地更新服务器)。

关于jtoberon指向的MongoDB Inc的Alpha版本:如果您仔细查看一下,您会看到一些关键点:

  • 设置是一个独立的mongodb实例,没有复制集或分片。关于复制集,由于Blob存储的工作方式,即使使用独立版本,您仍然可以获得多个好处。
  • 要提供高可用性,您可以使用多个实例运行。在这种情况下,只有一个实例提供数据库服务,另一个是“暖备”,可以在其他实例失败(进行维护重启、硬件故障等)时立即启动mongod进程。

虽然10gen的Windows Azure包装器仍被视为“α级”,但mongod.exe不是。您可以像启动其他Windows exe一样启动mongod exe。这只是管理启动代码,这就是Alpa实现正在展示的内容。

编辑2011-12-8:这已不再处于α状态。您可以在此处下载最新的MongoDB + Windows Azure项目here,其中提供了复制集支持。

关于性能,我认为您需要进行一些基准测试。话虽如此,请考虑以下内容:

  • 当从Web角色访问Table Storage或MongoDB时,仍会访问Windows Azure存储系统。
  • MongoDB使用大量内存用于自己的缓存。由于这个原因,许多高规模的MongoDB系统部署到较大的实例大小。对于Table Storage访问,您不必考虑相同的内存大小问题。

编辑2015年4月7日如果您想使用文档数据库即服务,Azure现在提供DocumentDB。


我个人没有尝试过,但是 MongoDB 看起来可以通过 Azure store 作为 Add-On 进行安装。这也意味着部署和 Azure 表存储一样简单。 - John

35

我两个都用过。

Azure Tables:非常简单、快速,即使是简单的查询也很难编写。

Mongo:运行良好,具有多种查询功能,需要多个实例才能保证可靠性。

简而言之,如果你的查询非常简单(键值对),你必须进行成本比较(主要是存储的事务数量与在Azure上托管Mongo的成本)。我会选择使用表存储。

如果您需要更复杂的查询并且不想使用SQL Azure,则很可能Mongo是您的最佳选择。


在发布了类似WCF数据服务的端点之后,这是否仍然适用?我认为您可以在这些端点上执行LINQ。 - tec-goblin
你能解释一下(或者提供一个关于)你的评论“需要多个实例才能可靠”吗?为什么两个实例不可靠? - Mark
1
是的,在Azure Tables中查询仍然很困难,即使在新版本中也是如此。您可以使用LINQ,但不支持所有功能 - 例如,orderby,“contains”和count会导致错误。除了针对PK的查询之外的任何查询都会导致表扫描。 - Daniel
@Mark MongoDB需要至少3个实例来形成副本集(或两个实例和一个仲裁者)http://docs.mongodb.org/manual/core/replica-set-architectures/ - brimble2010

9

7
我的第一选择是AzureTables,因为它采用SAAS模型、成本低且SLA达到99.99%。
http://alexandrebrisebois.wordpress.com/2013/07/09/what-if-20000-windows-azure-storage-transactions-per-second-isnt-enough/ 一些限制...
http://msdn.microsoft.com/en-us/library/windowsazure/jj553018.aspx


http://www.windowsazure.com/en-us/pricing/calculator/?scenario=data-management

或AzureSQL适用于小型企业

DocumentDB http://azure.microsoft.com/en-us/documentation/services/documentdb/ http://azure.microsoft.com/en-us/documentation/articles/documentdb-limits/

第二选择是许多云提供商,包括亚马逊提供S3或Google表格https://developers.google.com/bigquery/pricing
第三个选择是管理SHOW全部自己完成,没有睡眠的MongoDB,好吧,我会再看一下前两个SAAS。
如果我在运行“CLOUD”,我的选择尽可能采用SAAS模型,“租用它”...
问题是我的应用程序需要AzureTables还是DocumentDB还是AzureSQL?
DocumentDB文档http://azure.microsoft.com/en-us/documentation/services/documentdb/ Azure定价如何工作http://azure.microsoft.com/en-us/pricing/details/documentdb/ 这很有趣http://www.documentdb.com/sql/demo

2

在2016年的Build大会上,宣布DocumentDB将支持所有MongoDB驱动程序。这解决了DocDB缺乏工具问题的一些难题,同时也让Mongo应用程序更易于迁移。


1
上面的答案都很好,但真正的答案取决于你的要求。您需要了解正在处理的数据大小,希望对数据执行哪些类型的操作,然后选择符合您需求的解决方案。

这更像是一条评论而不是一个答案。 - Josh Noe

0

"Azure Table Storage 不支持复杂数据类型" 这并不完全正确。随着 Azure Storage SDK 版本 8.0.0.0 的推出,SDK 中添加了 API 来将复杂对象写入表存储。请参见 https://msdn.microsoft.com/en-us/library/azure/mt775434.aspx 和 https://msdn.microsoft.com/en-us/library/azure/mt775432.aspx。我编写了这些 API :) 如果您有任何意见,请随时提出。" - Dogu Arslan
请问您能否分享一些使用Node.js的示例?此外,有一个属性大小限制,强制最大限制为64KB,那么我们能否存储非常大的对象呢?提前致谢。 - Saisurya Kattamuri
是的,我同意我们可以通过序列化和反序列化来实现,但是一个 No-SQL 数据库应该默认支持它们而不需要额外的努力,但我觉得 Azure 是一种表格类型存储(按列存储,最适合简单的键值数据)。 - Saisurya Kattamuri
谢谢Sai。这些新的API将把复杂对象转换为键值对字典,并将每个属性写成单独的列,而不是整个序列化字符串等。因此,您可以针对扁平化的对象运行查询或投影。如果您读取实体并将其传递给ConvertBack方法,则API将重新组合原始对象。我同意您的看法,这些方法的集成可能更加透明,并且我相信在未来版本中将在SDK中更透明地集成这些API。 - Dogu Arslan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接