Django get_or_create具有主/从写/读配置

时间:2012-04-19 20:11:45

标签: mysql django database-replication

我有一个django应用程序使用复制服务器并配置为使用master作为只写,slave作为只读。但是当我开始监视我的数据库负载时,我发现主人有很多读取流量,经过一些调查我发现了这个:

def get_or_create(self, **kwargs):
    # Update kwargs with the related object that this
    # ForeignRelatedObjectsDescriptor knows about.
    kwargs.update({rel_field.name: instance})
    db = router.db_for_write(rel_model, instance=instance)
    return super(RelatedManager, self.db_manager(db)).get_or_create(**kwargs)
get_or_create.alters_data = True

因此,从该代码开始,我将使用write数据库进行get_or_create所需的读取和写入操作,而不是使用slave来读取和master来按照预期“创建”,是否有人遇到此问题?除了重写get_or_create函数之外,还有什么方法可以修复它吗?

1 个答案:

答案 0 :(得分:5)

在主人和奴隶之间拆分get_or_create是个坏主意。这将导致竞争状况。您将获得重复项或数据库丢失重复键错误。

问题是复制延迟。使用标准的MySQL主从设置,复制是异步的。这意味着eventual consistency,奴隶将拥有主人所做的一切,但是存在滞后。这种滞后通常非常低,但它总是存在。