我有一个django应用程序,它使用replications服务器,配置为将主服务器用作只读,而将从服务器用作只读。但当我开始监视我的数据库负载时,我发现主服务器有大量的读取流量,经过一些调查,我发现:
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_或_create所需的读写操作,而不是像预期的那样使用slave来读取和master来“创建”,有人遇到过这个问题吗?除了重新编写get_或_create函数之外,还有其他方法可以修复它吗?
最佳答案
在主服务器和从服务器之间拆分get_or_create
是一个非常糟糕的主意。这将导致种族状况。您将得到重复项或数据库抛出重复键错误。
问题是复制延迟。使用标准的MySQL主从设置,复制是异步的。这意味着eventual consistency,从机将拥有主机所做的一切,但存在滞后。这种滞后通常很低,但总是存在的。
关于mysql - 具有主/从写/读配置的Django get_or_create,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10235986/