sql >> Database >  >> RDS >> Mysql

Lees slave, lees-schrijf master setup

Ik heb een voorbeeld van hoe dit te doen op mijn blog op http://techspot.zzzeek.org/2012/01/11/django-style-database-routers-in-sqlalchemy/ . In principe kunt u de sessie verbeteren, zodat deze per vraag kan kiezen uit master of slave. Een mogelijke fout met die aanpak is dat als je één transactie hebt die zes vragen oproept, je uiteindelijk beide slaven in één verzoek kunt gebruiken.... maar daar proberen we gewoon de functie van Django te imiteren :)

Een iets minder magische benadering die ook de reikwijdte van het gebruik explicieter vastlegt die ik heb gebruikt, is een decorateur die callables bekijkt (hoe ze ook worden genoemd in Flask), zoals deze:

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

with_slave zou zoiets als dit doen, ervan uitgaande dat je een Sessie hebt en een aantal motoren ingesteld:

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

Het idee is dat het aanroepen van Session(bind=slave) roept het register aan om bij het eigenlijke Session-object voor de huidige thread te komen, en maakt het als het niet bestaat - maar aangezien we een argument doorgeven, zal scoped_session beweren dat de sessie die we hier maken absoluut gloednieuw is.

Je wijst het naar de "slave" voor alle volgende SQL. Als het verzoek voorbij is, zorgt u ervoor dat uw Flask-app Session.remove() aanroept om het register voor die thread te wissen. Wanneer het register de volgende keer in dezelfde thread wordt gebruikt, zal het een nieuwe Sessie zijn die terug is gebonden aan de "master".

Of een variant, u wilt de "slave" alleen voor die oproep gebruiken, dit is "veiliger" omdat het elke bestaande binding terug naar de sessie herstelt:

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

Voor elk van deze decorateurs kun je dingen omkeren, de sessie laten binden aan een "slave" waar de decorateur het op "master" zet voor schrijfbewerkingen. Als je in dat geval een willekeurige slaaf wilde, als Flask een soort "verzoek begin"-evenement had, zou je het op dat moment kunnen instellen.



  1. Rails 4 LIKE-query - ActiveRecord voegt aanhalingstekens toe

  2. MySql Algemene fout:2053

  3. Verminder database-oproepen om de websiteprestaties te verbeteren

  4. T-SQL Tuesday #67:Nieuwe back-up en herstel van uitgebreide gebeurtenissen