【问题标题】:How can I use MongoDB as a cache for Postgresql?如何使用 MongoDB 作为 Postgresql 的缓存?
【发布时间】:2019-06-20 09:27:58
【问题描述】:

我有一个不能丢失数据的应用程序,所以我选择 Postgresql 数据库(ACID)

然而,MongoDB 的速度和查询优势非常吸引人,但根据我目前所读到的内容,MongoDB 可以报告可能尚未写入磁盘的成功写入,因此我不能将其作为我的关键任务db(我还需要交易)

我见过有人同时使用 mysql 和 MongoDB,一个用于事务,另一个用于查询。请注意,我不是在谈论将一些数据保存在一个数据库中,而将其余数据保存在另一个数据库中。我想使用 Postgresql 作为数据输入的网关,使用 MongoDB 进行读取。

是否有任何资源以这种方式为 Postgresql + MongoDB 的使用提供架构/指南?我记得在 Postgresql 会议议程中看到过这个主题,但我找不到链接。

【问题讨论】:

  • 为什么不使用像memcache这样的专用缓存机制?
  • 主要是因为MongoDB的查询支持。

标签: postgresql caching mongodb


【解决方案1】:

我认为将 MongoDB 用作缓存不会获得太多速度。它的优势在于复制和水平可扩展性。在一台计算机上,你会让 Mongo 和 Postgres 竞争内存、IO 带宽和处理器时间。

由于您无法承担松散交易的代价,因此仅使用 Postgres 会更好。它具有高效的缓存、复杂的查询计划器、准备好的查询和广泛的索引支持,这使得只读查询将非常快 - 真的可以与单台计算机上的 MongoDB 相媲美。

Postgres 现在甚至可以使用异步复制或从 9.1 版开始使用同步复制进行水平扩展。

【讨论】:

    【解决方案2】:

    实现此目的的一种方法是设置主从复制,将 PostgreSQL 数据库作为主数据库,将 MongoDB 数据库作为从属数据库。然后,您将从 MongoDB 读取所有数据,并将所有数据写入 PostgreSQL。

    这篇文章使用名为 Bucardo 的工具讨论了这样的设置: http://blog.endpoint.com/2011/06/mongodb-replication-from-postgres-using.html

    您也可以使用 Tungsten Replicator 来完成此操作,尽管它似乎是为与 MySQL 一起使用而设计的: http://code.google.com/p/tungsten-replicator/wiki/TRCHeterogeneousReplication

    【讨论】:

    • 谢谢,虽然大家似乎普遍认为这不是一个好主意,但您的回复是关于我的问题。所有其他反馈都绝对有用,我可能会放弃这一点,但我想在放弃之前更好地了解设置。
    【解决方案3】:

    我记得在 Postgresql 会议议程中看到过这个主题,但我找不到 链接。

    也许,你在说这个:https://www.postgresqlconference.org/content/hybrid-applications-using-mongodb-and-postgres

    【讨论】:

    • 是的,这就是我所说的。问题是我似乎找不到讨论这些标题的资源!
    • 似乎它们没有在任何地方发布=/
    • postgres 邮件列表 (pgsql-general@postgresql.org) 非常活跃,我相信那里的人会知道..
    【解决方案4】:

    根据事务对您的重要性,一种选择是使用 MongoDb 驱动程序的安全模式并删除 Postgresql。

    http://www.mongodb.org/display/DOCS/getLastError+Command

    【讨论】:

    • 我不是在寻找一种方法来确保 MongoDB 在安全模式下工作。那将是一个不同的问题。交易非常重要。
    【解决方案5】:

    你怎么能期望 Postgres 的事务一致性但信任 MongoDB 进行读取?在这种情况下,您将如何支持回滚?您如何检测它们何时不同步?

    我认为您最好使用 memcache 并实现更高级别的对象缓存。或者,您可以考虑使用复制从属设备进行读取。如果您的性能需求超出了专用读取从属设备所能提供的能力,请考虑对您的从属系统上的表进行非规范化处理。

    确保确实需要这些。对于具有 PK 查找的瘦表,大多数现代数据库引擎(如 Postgres 或 InnoDB)通常都会跟上 NoSQL 解决方案的步伐。不要落入 ROFLSCALE 陷阱 http://www.youtube.com/watch?v=b2F-DItXtZs

    【讨论】:

      【解决方案6】:

      我认为你可以运行一个 mongo 副本集。假设 3 Slave and 1 Master.. 然后在你的应用程序中,你应该在 Postgresql 上运行所有写事务,然后在 Mongo ReplicaSet 上运行。之后你可以在 Mongo Replica 上查询读操作放.. 但是同步会是个问题,你应该努力解决它..

      【讨论】:

        【解决方案7】:

        您可能会在 herehere 中找到一些更安全和快速的 mongo 替代品。

        但我建议简化您的解决方案,而不是进行复杂的设计。

        Visual Guide to NoSQL Systems

        幸运

        【讨论】:

          【解决方案8】:

          在 mongodb 中,我们可以指定 writeConcern 属性来指定它应该写入日志/实例,然后发送确认/确认,我认为即使 mongodb 也有事务的概念。不知道为什么我们需要 postgres 支持它。

          【讨论】:

            猜你喜欢
            • 2012-12-23
            • 1970-01-01
            • 2011-05-27
            • 2014-05-13
            • 2018-05-19
            • 2020-04-22
            • 2014-08-06
            • 2018-12-24
            • 2014-08-16
            相关资源
            最近更新 更多