class MasterSlaveRouter(object):
"""A router that sets up a simple master/slave configuration"""
def db_for_read(self, model, **hints):
"Point all read operations to a random slave"
return random.choice(['slave1','slave2'])
def db_for_write(self, model, **hints):
"Point all write operations to the master"
return 'master'
def allow_relation(self, obj1, obj2, **hints):
"Allow any relation between two objects in the db pool"
db_list = ('master','slave1','slave2')
if obj1._state.db in db_list and obj2._state.db in db_list:
return True
return None
def allow_syncdb(self, db, model):
"Explicitly put all models on all databases."
return True
Из документов Django
Это может быть, если вы действительно хотите сделать это как упражнение, но я бы не советовал его, если он будет запущен в производство.
Вы просите свою базу данных выполнить репликацию для вас, что является правильным способом сделать это.
Затем в своем приложении вы в основном говорите, что хотите перейти в середину этой репликации и записать ее в ведомое устройство, а затем прочитать с мастера; другими словами, вы пытаетесь использовать репликацию так же, как и кластер. Это может привести только к плохим вещам в будущем; параллелизм для одного будет проблемой. Пул подключений - другой, а целостность данных - третий.
Другой подход к сокращению времени отклика - если у пользователя есть учетная запись, загрузите его информацию в быстрый бэкэнд кеша, такой как redis или couchdb, - в зависимости от ваших предпочтений ключ / значение по сравнению с хранилищами на основе документов.
Для гостевых пользователей, поскольку они не будут выполнять столько записей, сколько читает, это немного уменьшит нагрузку на вашу базу данных; не говоря уже о повышении производительности для зарегистрированных пользователей.