2

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

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

因此,从该代码中,我认为它使用写入数据库进行 get_or_create 所需的读取和写入操作,而不是使用从属读取和主控按预期“创建”,有人遇到过这个问题吗?除了重写 get_or_create 函数之外,还有其他方法可以解决它吗?

4

1 回答 1

5

get_or_create在主从之间拆分是非常糟糕的主意。这将导致竞争条件。您将获得重复项或数据库抛出重复键错误。

问题是复制延迟。使用标准的 MySQL 主从设置,复制是异步的。这意味着最终的一致性,slave 将拥有 master 所做的一切,但有一个滞后。这种滞后通常非常低,但它始终存在。

于 2012-04-19T20:33:18.030 回答