2017-12-31 343 views
0

読み取りレプリカからアプリケーションレイヤタスクの読み取りを強制していますか?djangoやフラスコを使ってPostgresの読み取り複製を強制する方法は?

つまり私は、Postgresデータベースを持っていると私は、リードレプリカを設定しています。アプリケーション側で

私は2つの接続「書き込み」データベースと「レプリカを読んで、」データベースのための1のための1つを持っています。私のコードで

私は私が読んレプリカへの接続を使用して「読み」のアクションを行います。しかし、私が挿入または更新する場合、私は "書き込み"データベースa.k.a. masterへの接続を使用します。

これは、自動的に管理されているdjangoやフラスコの方が良いですか?すなわち

私は、コード内で直接使用し、ちょうどジャンゴやフラスコが自分でそれを把握持っている接続を指定しないように好むだろう。

答えて

3

ジャンゴ

この目的のジャンゴのために、いわゆるデータベース・ルータをサポートしています。

class CustomRouter: 
    def db_for_read(self, model, **hints): 
     return 'replica' 

    def db_for_write(self, model, **hints): 
     return 'master' 

をそして、そのようにそれを使用するようにDjangoのORMを設定します。

まず、カスタムルーターを作成します。

DATABASES = { 
    'default': {}, 
    'primary': { 
     'NAME': 'master', 
     'ENGINE': 'django.db.backends.mysql', 
     'USER': 'mysql_user', 
     'PASSWORD': 'spam', 
    }, 
    'replica1': { 
     'NAME': 'replica', 
     'ENGINE': 'django.db.backends.mysql', 
     'USER': 'mysql_user', 
     'PASSWORD': 'eggs', 
    }, 

} 

DATABASE_ROUTERS = ['path.to.CustomRouter'] 

サンプルコードはthe docsから取られた(それは読む価値がある!)と、わずかに調整しました。

SQLAlchemyの(フラスコ)

私はSQLAlchemyのドキュメントを経て、SQLAlchemyのでdjangosデータベースルータのアプローチを実装する方法について説明しthis articleへのリンクを見つけました。

ここでカスタムセッションを使用してこれを正しく実装できます。

次のスニペットは、リンクされた物品から採取され、わずかに調整されます。

あなたのエンジンを作成します。

class RoutingSession(Session): 

    def get_bind(self, mapper=None, clause=None): 
     if self._flushing: 
      return engines['master'] 
     else: 
      return engines['replica'] 

をそして、このようなあなたのセッションを作成します:

engines = { 
    'master': create_engine('postgresql://user:***@localhost:5432/master', 
          logging_name='master'), 
    'replica': create_engine('postgresql://user:***@localhost:5432/replica', 
          logging_name='replica'), 
} 

は、カスタムセッションクラスを作成します

Session = scoped_session(sessionmaker(class_=RoutingSession, autocommit=True)) 

詳細と制限についての記事を読みます。

関連する問題