Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Django Multiple Databases Fallback ke Master jika Slave down

Anda berada di jalur yang benar dengan menggunakan router. Saya berasumsi fakta bahwa dua definisi db Anda identik hanyalah salah ketik.

(FYI, saya akan merujuk ke hierarki basis data menggunakan master yang lebih sensitif->pengikut )

Dalam fungsi db_for_read() Anda, Anda dapat memeriksa konektivitas ke pengikut Anda. Ini mungkin menimbulkan sedikit lebih banyak overhead, tetapi itu adalah biaya kegagalan otomatis untuk database. Contoh definisi basis data adalah:

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',
    },
}  

Anda dapat menguji koneksi dengan percobaan cepat/kecuali seperti ini contoh . Router yang menggunakan ini yang melakukan apa yang Anda butuhkan akan terlihat seperti:

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'

Ini masih akan syncdb di master seperti yang Anda inginkan. Juga, Anda dapat membuat logika untuk keduanya db_for_read() dan db_for_write() lebih rumit (seperti memilih db pengikut hanya untuk model tertentu yang ditanyakan untuk laporan Anda.

Saya tidak tahu apa overhead test_connection() ini akan menyebabkan setiap pembacaan, karena itu akan tergantung pada server MySQL dan batas waktu. Mungkin arsitektur yang lebih baik adalah men-cache laporan ini menggunakan memcached, atau hanya menyelesaikan masalah dengan slave yang pernah turun dan memperbarui definisi database Anda di pengaturan terlebih dahulu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menghubungkan ke database MySQL

  2. Apakah ada SQLite yang setara dengan DESCRIBE [tabel] MySQL?

  3. Rails, MySQL dan Snow Leopard

  4. CONV() fungsi dalam kepingan salju

  5. parse.com alternatif sumber terbuka untuk backend