为大容量网站使用NoSQL和Relational数据存储

时间:2011-06-23 02:27:19

标签: mysql mongodb relational acid nosql

我们正在建设一个大型电子通信网站,为超过100,000名用户提供服务,但我们预计用户数量将在第一年迅速增长。通常,该网站的功能与ebay非常相似,用户可以在其中创建,更新和删除列表。用户还可以搜索列表并购买感兴趣的项目。基本上,系统具有事务性和非事务性要求:

**Transactional**
Create a listing (multi-record update)
Remove a listing
Update a listing
Purchase a listing (multi-record update)

**Non-Transactional**
Search listings
View a listing

我们希望利用可扩展的基于文档的NoSQL数据存储(如Couch或MongoDB)的强大功能,但同时我们需要一个关系存储来支持我们的ACID事务要求。因此,我们提出了一种使用这两种技术的混合解决方案。

由于该网站是“主要阅读”,并且为了满足可扩展性需求,我们设置了一个MongoDB数据存储。为了满足事务需求,我们设置了一个MySQL Cluster。作为中间件组件,我们使用JBoss App服务器集群。

当“搜索”请求进入时,JBoss会将请求定向到Mongo来处理搜索,这样可以在不增加MySQL负担的情况下产生非常快速的结果。当创建,更新,删除或购买列表时,JBoss会针对MySQL提供事务。为了使MongoDB和MySQL保持同步,JBoss针对MySQL处理的所有事务请求将包括业务逻辑中的最后一步,它通过列表id更新MongoDB中的相应文档;我们计划使用MongoDB Java API来促进这种更新文档的集成。

因此,实质上,由于该网站主要是读取的,因此该架构允许我们横向扩展MongoDB以容纳更多用户。使用MySQL允许我们利用关系数据库的ACID属性,同时通过JBoss中间件保持MongoDB存储更新。

这种架构有什么问题吗?没有平台可以同时提供一致性,可用性和分区容忍度 - NoSQL系统通常会放弃一致性 - 但至少使用这种混合方法我们可以以系统中额外的复杂性为代价来实现这三者,而我们这是好的,因为我们的所有要求都得到了满足。

2 个答案:

答案 0 :(得分:3)

这种方法没有错。

Infact目前我也正致力于利用SQL和Linux的应用程序(电子商务)。 NonSQL。我们是一个rails应用程序,90%的数据存储在mongo中,只有事务和数据存储。库存项目存储在mysql中。所有事务都在Mysql中处理,其他一切都转到mongo。

答案 1 :(得分:1)

如果您已经构建了它,那么除了有点过于企业化之外,架构没有太多错误。尽管如此,在这样的系统上从头开始,我可能会遗漏SQL和中间件。

NoSQL数据存储的一致性损失并不像您建议的那样完整。除了它们中的许多确实支持事务并且可以设置为在特定查询上立即一致之外,我怀疑您的一些要求只是关系设计事物的人工制品。您的担忧似乎是需要更新多个记录的操作 - 列表是否真的是多个记录,或者只是设置这种方式,因为SQL记录必须具有扁平结构?

此外,如果在MySQL之外处理搜索和查看,您无论如何都有效地建立了最终的一致性系统。