sql >> Databáze >  >> RDS >> Mysql

Django Multiple Databases Fallback to Master, pokud Slave nefunguje

S používáním routeru jste na správné cestě. Předpokládám, že skutečnost, že vaše dvě definice db jsou totožné, je jen překlep.

(Pro informaci, budu odkazovat na hierarchii databáze pomocí citlivější master->follower )

Ve funkcích db_for_read() můžete zkontrolovat připojení k vašemu sledujícímu. To může způsobit trochu vyšší režii, ale to jsou náklady na automatické převzetí databáze při selhání. Příklad definice databáze by byl:

DATABASES = {
'follower': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'follower',
        'USER': 'root',
        'HOST': '54.34.65.24',
        'PORT': '3306',
    },
'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'application',
        'USER': 'root',
        'HOST': '54.34.65.23',
        'PORT': '3306',
    },
}  

Připojení můžete otestovat rychlým pokusem/s výjimkou toto příklad . Router využívající toto, který dělá to, co potřebujete, by vypadal takto:

from django.conf import settings
import socket


def test_connection_to_db(database_name):
    try:
        db_definition = getattr(settings, 'DATABASES')[database_name]
        s = socket.create_connection((db_definition['HOST'], db_definition['PORT']), 5)
        s.close()
        return True
    except (AttributeError, socket.timeout) as e:
        return False


class FailoverRouter(object):
    """A router that defaults reads to the follower but provides a failover back to the default"""

    def db_for_read(self, model, **hints):
        if test_connection_to_db('follower'):
            return 'follower'
        return 'default'

    def db_for_write(self, model, **hints):
        "Point all writes to the default db"
        return 'default'

    def allow_syncdb(self, db, model):
        "Make sure only the default db allows syncdb"
        return db == 'default'

To bude stále synchronizovat databázi v master, jak chcete. Také byste mohli vytvořit logiku pro obě db_for_read() a db_for_write() složitější (například výběr databáze sledujících pouze pro určité modely, které jsou dotazovány pro vaše přehledy.

Nevím, jaká je režie tohoto test_connection() způsobí pro každé čtení, protože to bude záviset na serveru MySQL a časovém limitu. Možná je lepší architektura ukládat tyto zprávy do mezipaměti pomocí memcached, nebo prostě vyřešit problémy s tím, že slave někdy selhává, a nejprve aktualizovat definice databáze v nastavení.




  1. ERROR 1130 (HY000):Host '' se nemůže připojit k tomuto serveru MySQL

  2. Instalace R12.2.6 EBS krok za krokem na Virtual Box

  3. Jak spárovat záznamy, které jsou spojeny s konkrétní sadou jiných záznamů?

  4. Jak mohu ukládat a získávat obrázky z databáze MySQL pomocí PHP?