it-swarm.asia

كيفية الحصول على الأساسية للاستفادة من تكوين MySQL الرئيسي / الرقيق؟

قرأت هذا السؤال لا تعمل نسخة MySQL الرئيسية/الرقيق وإجابتها:

بالكاد يتم تنفيذ قواعد بيانات slave في Drupal core. إذا كنت تقوم بتطوير الوحدات النمطية الخاصة بك ، فإن المكالمات إلى db_query تحتاج إلى تحديد أنها تريد استخدام قاعدة بيانات تابعة باستخدام صفيف خيارات $. انظر DatabaseConnection: : defaultOptions لكيفية تعيين هذا الصفيف.

هل هناك طريق بدون قتل القطط اختراق القرص الأساسي للحصول على db_query() و db_select() لإنشاء المزيد من استعلامات SELECT الرقيق؟

بشكل افتراضي ، ستقوم هذه الوظائف بالاستعلام عن الرئيسي ما لم يُطلب منه تحديدًا الاستعلام عن التابع (انظر API). يجب أن تكتب db_query($query, $args, array('target' => 'slave')) من أجل الاستعلام عن العبد والنواة (وجميع الوحدات) غير مكتوبة لتحقيق ذلك.

فقط بحث (انظر الجزء التابع) ويبدو المجمّع يستفيد من ذلك.

تحرير: أكتوبر 25
لقد رأيت pressflow 7 متاحًا ولكن لست متأكدًا مما إذا كان ذلك يساعد كثيرًا في الوقت الحالي.
لم أجد شيئًا ذا صلة ، لذا دعنا نجرب مكافأة صغيرة للمساعدة في الحصول على إجابة.

تحرير: أكتوبر 31
أنا قلق بشكل رئيسي بشأن تعليقات Crell بخصوص هذا الموضوع: ماذا أفعل بالعبيد؟ .
بشكل أساسي ، هل هناك مشاكل إذا أرسلت SELECT استفسارات إلى العبد ، وما يحدث مع التأخير في النسخ المتماثل وحقيقة أنني قد أرغب في إجراء node_load() بعد الحفظ مباشرة عقدة جديدة.

20
tostinni

إليك كيفية تنفيذ ذلك حاليًا.

تحتاج أولاً إلى إعداد فصل 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 إلى ملف معلومات الوحدة الخاصة بك.

17
ericduran

AutoSlave إعادة توجيه الوحدة النمطية SELECT استعلامات لقواعد بيانات النسخ المتماثل للقراءة فقط ، و يأخذ في الاعتبار تأخر النسخ المتماثل.

وفقًا لمستندات الوحدة النمطية ، فإنه يستخدم فقط النسخ المتماثل للقراءة فقط عندما تكون جميع الشروط التالية صحيحة:

  1. الاستعلام هو استعلام تحديد
  2. لم تتم كتابة الجداول في استعلام التحديد أثناء الطلب وضمن تأخر النسخ المتماثل المفترض
  3. لم تبدأ المعاملة
  4. لم يتم تحديد الجداول في استعلام التحديد في خيار "الجداول" في إعدادات برنامج التشغيل
  5. لم يتم تشغيل القفل (دعم db-lock الأساسي وقفل memcache-lock)
5
smokris

مما سمعته في الآونة الأخيرة Drupal BADcamp Pressflow هو الطريق للذهاب إذا كنت تريد تكوينات رئيسية/تابعة. ستقتصر على Mysql مثل DB. أيضًا ، تحقق من "- مجموعة عالية الأداء "قيد التنفيذ.

1
uwe

على الرغم من كل الأعمال المذهلة التي تم إجراؤها على طبقة تجريد قاعدة البيانات في Drupal 7 ، لا يزال هذا الأمر صعبًا بشكل مدهش مع Drupal الأساسية خارج الصندوق. كما ذكر الآخرون ، AutoSlave هو خيار ، على الرغم من أنه لم أجربه بسبب رفضي العنيد للاعتقاد بأنه سيكون من الصعب القيام بذلك.

الحل الأبسط الذي وجدته هو التالي. لتوجيه الكل SELECTs إلى خادم تابع ، يمكنك إنشاء ملف بعنوان 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. ستقوم هذه الطريقة باختطاف جميع SELECTs وتوجيهها إلى الرقيق ، مما سيؤدي بلا شك إلى حدوث مشكلات إذا كان لديك أي تأخير في النسخ المتماثل. اقرأ هذه الجملة مرة أخرى.
  2. عندما تقوم بترقية Drupal core ، فمن المحتمل أن يتم حذف هذا الملف.
  3. إذا كان Drupal core قد بدأ في الشحن باستخدام includes/database/mysql/select.inc الخاص به ، فسيتم استبدال ملفك أثناء الترقية ، وسيتعين عليك البدء في صيانة نسختك المصححة من select.inc التي يتم شحنها مع Drupal الأساسية.

إذا لم يكن لديك أي خوادم تابعة محددة في settings.php ، فإن الرمز أعلاه لن يسبب مشكلة. ستظل تتحلل بأمان باستخدام خادم الرئيسي .

1
q0rban