MySQL मास्टर / दास विन्यास का लाभ उठाने के लिए कोर कैसे प्राप्त करें?


21

मैंने यह प्रश्न पढ़ा MySQL मास्टर / दास प्रतिकृति काम नहीं कर रही है और इसका उत्तर:

दास डेटाबेस का उपयोग ड्रुपल कोर में मुश्किल से लागू किया जाता है। यदि आप अपने स्वयं के मॉड्यूल विकसित कर रहे हैं तो db_query को कॉल करने की आवश्यकता है यह निर्दिष्ट करने के लिए कि वे $ विकल्प सरणी का उपयोग करके दास डेटाबेस का उपयोग करना चाहते हैं। इस सरणी को कैसे सेट करें, इसके लिए DatabaseConnection :: defaultOptions देखें।

क्या बिल्ली के बच्चे को मारने के बिना कोई रास्ता नहीं है ताकि प्राप्त करने के लिए db_query()और db_select()अधिक गुलाम का चयन करें?

डिफ़ॉल्ट रूप से, ये फ़ंक्शन मास्टर को क्वेरी करेंगे जब तक कि विशेष रूप से दास को क्वेरी करने के लिए नहीं कहा जाता है (उनके एपीआई देखें)। आपको db_query($query, $args, array('target' => 'slave'))दास और कोर को क्वेरी करने के लिए लिखना होगा (और सभी मॉड्यूल) इसे प्राप्त करने के लिए नहीं लिखे गए हैं।

केवल खोज (दास भाग देखें) और एग्रीगेटर इसका लाभ उठाते हैं।

संपादित करें: अक्टूबर, 25
मैंने देखा कि प्रेसफ्लो 7 बाहर है, लेकिन मुझे यकीन नहीं है कि यह अभी बहुत मदद करता है।
मुझे कुछ प्रासंगिक नहीं मिला है, तो आइए इस उत्तर को प्राप्त करने में मदद करने के लिए थोड़ा सा प्रयास करें।

संपादित करें: अक्टूबर, 31
मैं इस विषय के बारे में मुख्य रूप से क्रेल की टिप्पणियों से चिंतित हूं : दासों के साथ क्या करना है?
मुख्य रूप से, यदि मैं SELECTदास को प्रश्न भेजता हूं , तो प्रतिकृति में विलंब के साथ क्या होता है और node_load()नए नोड को सहेजने के बाद मैं क्या करना चाहता हूं, इस तथ्य से परेशानी होती है।

जवाबों:


17

यहां बताया गया है कि वर्तमान में मैं इसे कैसे लागू करता हूं।

सबसे पहले आपको इस तरह एक SelectQueryExtender वर्ग सेट करने की आवश्यकता है:

class SlaveTarget extends SelectQueryExtender {
  public function __construct(SelectQueryInterface $query, DatabaseConnection $connection) {
    if ($connection->getTarget() != 'slave') {
      $connection = Database::getConnection('slave', $connection->getKey());
    }
    parent::__construct($query, $connection);
    $this->addTag('SlaveTarget');
  }
}

एक बार जब आपके पास वह सब हो जाता है, तो आपको एक्सटेंडर का विस्तार करने के लिए अन्य सभी प्रश्नों को प्राप्त करना होगा। :) यदि इसका कोई औचित्य हो। यहाँ स्निपेट है।

/**
 * Implements hook_query_alter().
 */
function example_query_alter(QueryAlterableInterface $query) { 
  if (is_a($query, 'SelectQuery') && !$query->hasTag('SlaveTarget')) {
    $query->extend('SlaveTarget');
  }
}

और अब आपके सभी SelectQuery ने दास को मारा ;-) यह एकमात्र तरीका है जिससे मैं इसे पूरा करने में सक्षम हूं। वैसे भी यह बहुत अच्छा काम करता है।

यदि आपके पास यह कस्टम मॉड्यूल पर है, तो आप SlaveTarget सेट कर सकते हैं यह फ़ाइल SlaveTarget.inc पर है और अपनी मॉड्यूल जानकारी फ़ाइल में [] = SlaveTarget.inc जोड़ें।


हाय एरिक, आपके उत्तर के लिए धन्यवाद, जो मुख्य रूप से मुझे चिंतित करता है वह है यह धागा: दासों के साथ क्या करना है? और दास के संबंध में क्रेल की टिप्पणी । तो क्या आप किसी भी मामले में सुरक्षित हैं? क्या आप कुछ SELECTप्रश्नों को प्रतिबंधित करते हैं ? आप प्रतिकृति में देरी से कैसे निपटते हैं और इस तथ्य को सहेजने के बाद कि नोड लोड करना परेशानी का कारण हो सकता है?
tostinni

यह केवल चुनिंदा प्रश्नों पर दास को डेटाबेस बदल रहा है। यह केवल तब होता है जब क्वेरी को SelectQuery के साथ लिखा गया है db_query नहीं तो गुलाम को लक्षित करने और डालने या अपडेट करने के बारे में चिंता करने की कोई आवश्यकता नहीं है। हम बिना किसी समस्या के 3 विशाल उत्पादन वातावरण पर इसे चला रहे हैं। मैंने अपने लगभग तुरंत (मेरे मामले में) के रूप में mysql प्रतिकृति के बारे में ज्यादा चिंता नहीं की है, लेकिन मैं देख सकता हूं कि कुछ वातावरणों में यह एक छोटा मुद्दा कैसे हो सकता है।
15

आपके उत्तर के लिए धन्यवाद, यह एक महान समाधान है, मैं देखूंगा कि क्या यह हमारे पर्यावरण पर व्यवहार्य है।
tostinni

एरिक, क्या यह कोड एक कंट्रीब या सैंडबॉक्स मॉड्यूल के रूप में कहीं है?
पॉल-एम


5

AutoSlave मॉड्यूल रीडायरेक्ट SELECTप्रश्नों केवल पढ़ने के लिए रेप्लिकैंट डेटाबेस, और यह खाता प्रतिकृति अंतराल में ले जाता है।

मॉड्यूल डॉक्स के अनुसार, यह केवल रीड-ओनली प्रतिकारक का उपयोग करता है जब निम्नलिखित सभी स्थितियां सत्य होती हैं:

  1. क्वेरी एक चुनिंदा क्वेरी है
  2. अनुरोध के दौरान और अनुमानित प्रतिकृति अंतराल के भीतर चयन क्वेरी में तालिकाएँ नहीं लिखी गई हैं
  3. लेन-देन शुरू नहीं किया गया है
  4. ड्राइवर सेटिंग्स में 'क्वेरी' विकल्प में चुनिंदा क्वेरी के टेबल निर्दिष्ट नहीं हैं
  5. एक ताला शुरू नहीं किया गया है (कोर डीबी-लॉक और मेम्चे-लॉक समर्थित)

1

मैंने हाल ही में Drupal BADcamp Pressflow में जो सुना है वह जाने का तरीका है यदि आप मास्टर / दास विन्यास चाहते हैं। आप DB के रूप में मैसकल तक सीमित रहेंगे। इसके अलावा, " उच्च प्रदर्शन समूह " को चेकआउट करें


1
वर्तमान में प्रेसफ्लो 7 = डी 7, ऐसा कुछ भी नहीं है (अभी तक) जो प्रेसफ्लो करता है कि डी 7 नहीं :(
टोस्टिननी

1

Drupal 7 में डेटाबेस अमूर्त परत पर किए गए सभी अद्भुत कार्यों के बावजूद, यह अभी भी Drupal core को बॉक्स से बाहर करने के लिए आश्चर्यजनक रूप से कठिन है। जैसा कि दूसरों ने उल्लेख किया है, ऑटोस्लेव एक विकल्प है, हालांकि किसी ने भी मेरे जिद्दी इनकार के कारण यह मानने का प्रयास नहीं किया है कि ऐसा करना मुश्किल होना चाहिए।

एक सरल समाधान जो मैंने पाया है वह निम्नलिखित है। दास सर्वर में सभी SELECT s को रूट करने के लिए, आप निम्नलिखित सामग्री के साथ select.incकोर includes/database/mysqlडायरेक्टरी के अंदर एक फाइल बनाते हैं:

<?php

/**
 * @file
 * Select builder for MySQL database engine, routing all SELECTs to the slave.
 */

/**
 * @addtogroup database
 * @{
 */

class SelectQuery_mysql extends SelectQuery {
  public function __construct($table, $alias = NULL, DatabaseConnection $connection, $options = array()) {
    $key = $connection->getKey();
    $connection = Database::getConnection('slave', $key);
    $options['target'] = 'slave';
    parent::__construct($table, $alias, $connection, $options);
  }
}

/**
 * @} End of "addtogroup database".
 */

इस विधि के साथ कुछ जोखिम हैं:

  1. यह विधि सभी SELECT s का अपहरण कर लेगी और उन्हें दास को निर्देशित कर देगी, जो निस्संदेह मुद्दों का कारण बन जाएगा यदि आपके पास प्रतिकृति में कोई अंतराल है। उस वाक्य को फिर से पढ़ें।
  2. जब आप Drupal core को अपग्रेड करते हैं, तो संभव है कि यह फाइल डिलीट हो जाएगी।
  3. यदि ड्रुपल कोर कभी भी अपने आप से शिपिंग शुरू करने के लिए थे includes/database/mysql/select.inc, तो आपकी फ़ाइल अपग्रेड के दौरान अधिलेखित हो जाएगी, और आपको Drupal कोर वाले जहाजों के चयन के लिए अपने स्वयं के पैच किए गए संस्करण को बनाए रखना शुरू करना होगा।

यदि आपके पास सेटिंग्स में निर्दिष्ट कोई भी दास सर्वर नहीं है। तो, उपरोक्त कोड समस्या पैदा नहीं करेगा। यह मास्टर सर्वर का उपयोग करने के लिए अभी भी सुंदर ढंग से नीचा दिखाएगा ।


हां, यह तब भी दिखाई देता है जब कनेक्शन "दास" पर सेट किया जा सकता है, यदि क्वेरी में स्वयं target => 'slave'विकल्प सेट नहीं है , तो यह अभी भी डिफ़ॉल्ट कनेक्शन पर चलेगा। यह एक दर्द है जो कनेक्शन के लक्ष्य को query_alterस्तर पर अधिक आसानी से सेट करना आसान नहीं है।
डेविड थॉमस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.