【问题标题】:Using NoSQL and Relational data stores for high volume web site为大容量网站使用 NoSQL 和关系数据存储
【发布时间】:2011-06-23 02:27:19
【问题描述】:

我们正在建设一个大型电子商务网站,为超过 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 集群。作为中间件组件,我们使用 JBoss App 服务器集群。

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

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

这个架构有什么问题吗?没有任何平台可以同时提供一致性、可用性和分区容错性——NoSQL 系统通常会放弃一致性——但至少通过这种混合方法,我们可以以增加系统复杂性为代价实现这三者,而且我们没关系,因为我们的所有要求都得到了满足。

【问题讨论】:

    标签: mysql mongodb relational acid nosql


    【解决方案1】:

    这种方法没有错。

    Infact 目前还在开发利用 SQL 和 NonSQL 的应用程序(电子商务)。我们是一个 Rails 应用程序,90% 的数据存储在 mongo 中,只有事务和库存项目存储在 mysql 中。所有事务都在 Mysql 中处理,其他一切都交给 mongo。

    【讨论】:

    • 很好,很高兴我们的方法得到确认。您正在使用 Rails 处理业务逻辑吗?
    【解决方案2】:

    如果您已经构建了它,那么除了有点过于企业化之外,该架构并没有太多问题。不过,在这样的系统上从头开始,我可能会省略 SQL 和中间件。

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

    此外,如果搜索和查看是在 MySQL 之外处理的,那么无论如何您已经有效地设置了最终一致性系统。

    【讨论】:

    • 我们可以接受由 Mongo 处理的搜索和视图,因为 MySQL 和 Mongo 之间的同步应该几乎是即时的;如果搜索结果“遗漏”了一些列表,这没什么大不了的,用户不会知道其中的区别。
    • 这与两个 mongo 节点或两个 SQL 节点之间的同步没有什么不同。如果您不将其放入 SQL 中,您预计会丢失哪些数据? “最终一致性”比您想象的要直接得多,尤其是如果您可以将重要的读取指向主节点。
    猜你喜欢
    • 2019-01-17
    • 2016-02-17
    • 2013-06-13
    • 1970-01-01
    • 2019-01-20
    • 2016-04-24
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多