Вие сте на прав път с използването на рутер. Предполагам, че фактът, че вашите две дефиниции на db са идентични, е просто печатна грешка.
(FYI, ще се позова на йерархията на базата данни, използвайки по-чувствителният господар->последовател )
Във вашите функции db_for_read() можете да проверите за свързаност с вашия последовател. Това може да доведе до малко повече разходи, но това е цената за автоматично преодоляване на срив за база данни. Примерна дефиниция на база данни би била:
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',
},
}
Можете да тествате връзката с бърз опит/с изключение на това пример . Рутер, използващ това, който прави това, от което се нуждаете, би изглеждал така:
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'
Това все още ще синхронизира db в master, както искате. Също така можете да направите логиката и за двете db_for_read()
и db_for_write()
по-сложно (като изберете последователя db само за определени модели, които са заявени за вашите отчети.
Не знам какви допълнителни разходи е този test_connection()
ще причини за всяко четене, тъй като това ще зависи от MySQL сървъра и времето за изчакване. Може би по-добра архитектура е да се кешират тези отчети с помощта на memcached или просто да се отстранят проблемите с подчинения, който някога се срива, и първо да се актуализират дефинициите на вашата база данни в настройките.