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 マスター/スレーブ セットアップでは、レプリケーションは非同期です。これは結果整合性を意味し、スレーブはマスターが行うすべてのことを行いますが、遅延があります。通常、この遅延は非常に小さいですが、常に存在します。

于 2012-04-19T20:33:18.030 に答える