Mysql
 sql >> база данни >  >> RDS >> Mysql

Django Multiple Databases Fallback към Master, ако Slave не работи

Вие сте на прав път с използването на рутер. Предполагам, че фактът, че вашите две дефиниции на 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 или просто да се отстранят проблемите с подчинения, който някога се срива, и първо да се актуализират дефинициите на вашата база данни в настройките.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Елиминирайте подзаявката за средна числова стойност

  2. Как да конвертирам MySQL кода в PDO израз?

  3. Sequelize bulkCreate() връща стойност NULL за първичен ключ

  4. Филтриране на търсене с PHP/MySQL

  5. Как мога да избера * от таблица в MySQL, но да пропусна определени колони?