2017-12-31 165 views
0

Ist das Erzwingen eines Lesevorgangs aus einem Lese-Replikat eine Anwendungsschichtaufgabe?Wie erzwinge Lesevorgänge von Read Replica in Postgres mit Django und oder Kolben?

d. H. Ich habe eine Postgres-Datenbank und ich habe eine Read Replica eingerichtet.

Auf der Anwendungsseite habe ich zwei Verbindungen eine für die "Write" -Datenbank und eine für die "Read Replica" -Datenbank.

In meinem Code, wenn ich eine "Lese" -Aktion mache, verwende ich die Verbindung zum Read Replica. Aber wenn ich zum Einfügen oder Aktualisieren gehe, verwende ich die Verbindung zur "write" -Datenbank a.k.a. master.

Gibt es besser mit Django oder Kolben, dass dies automatisch verwaltet wird. d. h.

Ich würde es vorziehen, zu vermeiden, direkt im Code die Verbindung zu spezifizieren, um zu verwenden, und gerade django oder Flasche zu haben, um es heraus zu finden.

Antwort

3

Django

Zu diesem Zweck django unterstützt so Datenbank-Router genannt.

zuerst Ihre benutzerdefinierten Router erstellen:

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

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

Und django ORM konfigurieren es so zu verwenden.

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'] 

Der Beispielcode wurde von the docs genommen (es ist lesenswert!) Und leicht angepasst.

SQLAlchemy (Kolben)

Ich ging durch die SQLAlchemy docs und fand einen Link zu this article, die beschreibt, wie Djangos Datenbank-Router Ansatz mit SQLAlchemy implementieren.

Sie können hier eine benutzerdefinierte Sitzung verwenden, um dies ordnungsgemäß zu implementieren.

Die folgenden Snippets werden aus dem verknüpften Artikel ausgewählt und leicht angepasst.

Ihre Motoren erstellen:

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

eine benutzerdefinierte Session-Klasse erstellen:

class RoutingSession(Session): 

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

Und Ihre Sitzung wie folgt erstellen:

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

den Artikel für Details und Einschränkungen lesen.

Verwandte Themen