2012-04-19 49 views
2

我有一個Django應用程序與複製服務器一起工作,並配置爲使用主服務器作爲只寫且從服務器爲只讀服務器。但是,當我開始監測我的數據庫負載,我發現,主是有很多讀的流量,經過一番調查,我發現這個:Django get_or_create具有主/從寫入/讀取配置

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函數?

回答

5

拆分get_or_create主從之間是非常糟糕的主意。這將導致競爭狀況。您將得到重複或數據庫引發重複鍵錯誤。

問題是複製延遲。使用標準的MySQL主從設置,複製是異步的。這意味着eventual consistency,奴隸將擁有一切主人做,但有一個滯後。這種滯後通常很低,但總是存在。

+0

想知道解決這個問題的最佳方法是使用單主設置。是否有某種解決方法,或者在這種設置中如何處理複製?也就是說,有什麼更好的方法來實現它? https://github.com/jbalogh/django-multidb-router看起來像它可能會解決這個問題,但它會強制讀取該單個http請求的寫入表 – 2013-03-14 07:30:09