Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

Django एकाधिक डेटाबेस फॉलबैक मास्टर के लिए अगर गुलाम नीचे है

आप राउटर का उपयोग करने के साथ सही रास्ते पर हैं। मैं इस तथ्य को मान रहा हूं कि आपकी दो डीबी परिभाषाएं समान हैं, बस एक टाइपो है।

(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_for_read() both दोनों के लिए लॉजिक बना सकते हैं और db_for_write() अधिक जटिल (जैसे केवल कुछ मॉडलों के लिए अनुयायी डीबी चुनें जो आपकी रिपोर्ट के लिए पूछे गए हैं।

मुझे नहीं पता कि यह test_connection() के ऊपर क्या है? प्रत्येक पढ़ने के लिए कारण होगा, क्योंकि यह MySQL सर्वर और टाइमआउट पर निर्भर करेगा। शायद एक बेहतर आर्किटेक्चर मेमकैच का उपयोग करके इन रिपोर्टों को कैश करना है, या केवल दास के साथ मुद्दों को हल करना और पहले सेटिंग्स में अपनी डेटाबेस परिभाषाओं को अपडेट करना है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पायथन में एक MySQL डेटाबेस का मजाक उड़ाएं

  2. लूप सरणी के लिए, डुप्लीकेट कुंजी पर तालिका में सम्मिलित करें का उपयोग करते समय त्रुटि

  3. मुझे डेटाबेस कनेक्शन स्ट्रिंग कहां स्टोर करनी चाहिए?

  4. हाइबरनेट और एसक्यूएल में स्ट्रिंग क्वेरी में अंडरस्कोर से कैसे बचें?

  5. पीडीओ एकाधिक प्रश्न:प्रतिबद्ध और रोलबैक लेनदेन