sql >> Base de Datos >  >> RDS >> Mysql

Esclavo de lectura, configuración maestra de lectura y escritura

Tengo un ejemplo de cómo hacer esto en mi blog en http://techspot.zzzeek.org/2012/01/11/django-style-database-routers-in-sqlalchemy/ . Básicamente, puede mejorar la sesión para que elija entre maestro o esclavo consulta por consulta. Un error potencial con ese enfoque es que si tiene una transacción que llama a seis consultas, podría terminar usando ambos esclavos en una solicitud... pero aquí solo estamos tratando de imitar la característica de Django :)

Un enfoque un poco menos mágico que también establece el ámbito de uso de manera más explícita que he usado es un decorador en vista invocables (como sea que se llamen en Flask), como este:

@with_slave
def my_view(...):
   # ...

with_slave haría algo como esto, asumiendo que tiene una sesión y algunos motores configurados:

master = create_engine("some DB")
slave = create_engine("some other DB")
Session = scoped_session(sessionmaker(bind=master))

def with_slave(fn):
    def go(*arg, **kw):
        s = Session(bind=slave)
        return fn(*arg, **kw)
    return go

La idea es que llamar a Session(bind=slave) invoca el registro para obtener el objeto de sesión real para el hilo actual, creándolo si no existe; sin embargo, dado que estamos pasando un argumento, scoped_session afirmará que la sesión que estamos creando aquí es definitivamente nueva.

Lo apunta al "esclavo" para todos los SQL posteriores. Luego, cuando finalice la solicitud, se asegurará de que su aplicación Flask esté llamando a Session.remove() para borrar el registro de ese hilo. La próxima vez que se use el registro en el mismo subproceso, será una nueva sesión vinculada al "maestro".

O una variante, desea usar el "esclavo" solo para esa llamada, esto es "más seguro" ya que restaura cualquier enlace existente a la Sesión:

def with_slave(fn):
    def go(*arg, **kw):
        s = Session()
        oldbind = s.bind
        s.bind = slave
        try:
            return fn(*arg, **kw)
        finally:
            s.bind = oldbind
    return go

Para cada uno de estos decoradores, puede revertir las cosas, hacer que la sesión se vincule a un "esclavo" donde el decorador lo coloca en "maestro" para las operaciones de escritura. Si quisiera un esclavo aleatorio en ese caso, si Flask tuviera algún tipo de evento de "inicio de solicitud", podría configurarlo en ese punto.