Как получить основу для использования конфигурации master /slave MySQL?

Я прочитал этот вопрос Не работает работа с master /slave-сервером MySQL и его ответ:

  

Использование подчиненных баз данных практически не выполняется в ядре Drupal. Если ты   разрабатывая ваши собственные модули, а затем вызывает db_query, необходимо указать   что они хотят использовать рабочую базу данных, используя массив $ options. Видеть   DatabaseConnection :: defaultOptions для того, как установить этот массив.

Есть ли способ без убить котят взломать ядро, чтобы получить db_query() и db_select() , чтобы сделать более ведомые запросы SELECT?

По умолчанию эти функции будут запрашивать мастер, если специально не запросить подчиненный (см. их API). Вы должны написать db_query($query, $args, array('target' => 'slave')), чтобы запросить ведомое устройство, а ядро ​​(и все модули) не написано для достижения этого.

Только поиск (см. подчиненную часть), и агрегатор, похоже, использует это.

Изменить: Окт, 25
Я видел, что пресс-поток 7 вышел, но я не уверен, что он сейчас помогает. Я не нашел что-то важное, поэтому давайте попробуем немного щедрости, чтобы помочь вам получить ответ.

Изменить: Октябрь, 31
Меня в основном беспокоит комментарии Crell по этой теме: Что делать с ведомыми? .
В основном, есть ли проблемы, если я отправляю запросы SELECT на ведомое устройство, что происходит с задержками в репликации и тот факт, что я могу сделать node_load() сразу после сохранение нового узла.

21 голос | спросил tostinni 7 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 07 Sep 2011 21:06:18 +0400 2011, 21:06:18

4 ответа


16

Вот как я в настоящее время реализую это.

Сначала вам нужно настроить класс 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 в ваш файл информации модуля.

ответил ericduran 30 +04002011-10-30T13:18:43+04:00312011bEurope/MoscowSun, 30 Oct 2011 13:18:43 +0400 2011, 13:18:43
5

Модуль AutoSlave перенаправляет запросы SELECT в базы данных репликации только для чтения, и учитывается отставание репликации.

В соответствии с документами модуля он использует репликант только для чтения, когда выполняются все следующие условия:

  
  1. Запрос - это запрос select
  2.   
  3. Таблицы в запросе выбора не были записаны во время запроса и в пределах предполагаемой задержки репликации
  4.   
  5. Не была начата транзакция.
  6.   
  7. Таблицы в запросе выбора не указаны в параметрах «таблицы» в настройках драйвера.
  8.   
  9. Блокировка не запущена (поддерживаются блокировка ядра db и блокировка memcache)
  10.   
ответил smokris 13 ThuEurope/Moscow2012-12-13T20:43:00+04:00Europe/Moscow12bEurope/MoscowThu, 13 Dec 2012 20:43:00 +0400 2012, 20:43:00
1

из того, что я слышал в недавнем Drupal BADcamp Pressflow, - это путь, если вы хотите конфигурации master /slave. Вы будете ограничены Mysql как БД. Кроме того, проверьте группу высокой производительности на d.o.

ответил MotoTribe 27 +04002011-10-27T07:14:37+04:00312011bEurope/MoscowThu, 27 Oct 2011 07:14:37 +0400 2011, 07:14:37
1

Несмотря на всю удивительную работу, выполненную на уровне абстракции базы данных в Drupal 7, это все еще удивительно сложно сделать с ядром Drupal из коробки. Как уже упоминалось, AutoSlave вариант, хотя не один я попытался из-за моего упорного отказа считают, что это должно быть так сложно сделать.

Более простое решение, которое я нашел, следующее. Чтобы перенаправить все 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 возможно, что этот файл будет удален.
  3. Если бы ядро ​​Drupal когда-либо начинало отправлять сообщения со своим собственным кодом includes/database/mysql/select.inc, ваш файл будет перезаписан во время обновления, и вам придется начать поддерживать свою собственную исправленную версию select.inc, который поставляется с ядром Drupal.

Если у вас нет подчиненных серверов, указанных в settings.php, приведенный выше код не вызовет проблемы. Он по-прежнему будет грамотно деградировать с использованием сервера master .

ответил q0rban 27 PM000000110000003131 2013, 23:59:31

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132