如何使用django和multi-db设置分离读写操作; PostgreSQL的?

时间:2013-05-24 14:58:12

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

正如你们中的一些人所知,Django拥有多数据库支持。这可以通过编写dbrouter来向master数据库发送写入以及向slave发送所有读取来实现,但如Django Docs For Master/Slave Configuration

所述。
  

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

如何解决由于写入传播到从属设备所需的时间而导致的复制滞后和查询不一致的问题?我可以为此实现任何类型的代码吗?

2 个答案:

答案 0 :(得分:4)

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

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

如果您在典型使用情况下计算复制延迟,则可以将django-multidb-router之类的内容配置为在写入后的指定时间段内从MASTER读取。仍然不是100%安全,但您可以将其配置为99.9%安全的设置。

答案 1 :(得分:1)

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