【问题标题】:How can I seperate reads and writes with a multi-db setup with django & postgresql?如何通过 django 和 postgresql 的多数据库设置来分离读取和写入?
【发布时间】:2013-05-24 14:58:11
【问题描述】:

正如你们中的一些人所知,Django 支持多数据库。这可以通过编写一个 dbrouter 将写入发送到主数据库并将所有读取发送到从属数据库来实现,但正如 Django Docs For Master/Slave Configuration 中所述

所描述的主/从配置也存在缺陷——它没有提供任何解决复制延迟的解决方案(即,由于写入传播到从属所需的时间而引入的查询不一致)。它也没有考虑事务与数据库利用策略的交互。

由于写入传播到从属服务器需要时间,我该如何解决复制滞后和查询不一致的问题?有什么我可以为此实现的代码吗?

【问题讨论】:

  • 您是否希望在某些数据库上禁用写入功能?
  • @karthikr 嘿,我只是想让所有的写入都交给主机,而所有的读取都交给从机。通过这样做,我减轻了负载,因为我有两个相同的数据库共享工作,而不是让一个数据库执行所有读取和写入操作,从而使一切都可以顺利高效地运行:)
  • 抱歉。我误解了你的问题。
  • @karthikr 不用担心 :)

标签: django postgresql database-replication master-slave django-orm


【解决方案1】:

如果您正在写入 MASTER 并立即从 SLAVE 读取,您将始终面临不一致的风险。您可以降低风险,但永远无法避免。

尽一切可能对复制延迟进行分析、调整和最小化会有所帮助。将读取查询延迟到最后可能会有所帮助。但是,如果您打算从不从 MASTER 阅读,则无法完全避免。

如果您在典型用法下对复制滞后进行计时,您可以配置类似django-multidb-router 的内容,以便在写入后的指定时间段内从 MASTER 读取。仍然不是 100% 安全,但您可以将其配置为 99.9% 以确保您的设置安全。

【讨论】:

  • 谢谢 perrygeo,这正是我想要的,至少这样,如果用户决定快速检查最近发布的项目,我有一个保障。非常感谢您的帮助!
【解决方案2】:

请注意,在 MySQL 5.6 中,他们引入了“半同步”模式 (http://dev.mysql.com/doc/refman/5.6/en/replication-semisync.html),当在简单的主从(并且只有一个从)设置中使用时,它保证了同步从属。这避免了这个非常具体的问题,但是您在一致性方面获得的东西会在一些额外的事务时间中丢失。

【讨论】:

    猜你喜欢
    • 2011-06-18
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    相关资源
    最近更新 更多