Я прочитал этот вопрос MySQL master / slave replication, и его ответ:
Использование ведомых баз данных практически не реализовано в ядре Drupal. Если вы разрабатываете свои собственные модули, то вызовы db_query должны указать, что они хотят использовать подчиненную базу данных с помощью массива $ options. Посмотрите DatabaseConnection :: defaultOptions для того, как установить этот массив.
Есть ли способ без убийства котят взломать ядро, чтобы получить db_query()
и db_select()
сделать больше подчиненных запросов SELECT?
По умолчанию эти функции будут запрашивать мастер, если специально не указано, что нужно запросить подчиненное устройство (см. Их API). Вы должны написать db_query($query, $args, array('target' => 'slave'))
, чтобы запросить подчиненное устройство, а ядро (и все модули) не написаны для достижения этого.
Только поиск (см. Ведомая часть) и агрегатор, кажется, используют это.
Редактирование: 25 октября.
Я видел, что pressflow 7 вышел, но я не уверен, что это сильно помогает сейчас.
Я не нашел что-то подходящее, поэтому давайте попробуем немного щедрости, чтобы помочь получить ответ.
Изменить: 31 октября
Я в основном беспокоюсь о комментариях Крелла по этой теме: Что делать с рабами? ,
Главным образом, есть ли проблемы, если я отправляю SELECT
запросы подчиненному, что происходит с задержками в репликации и тем фактом, что я могу захотеть сделать это node_load()
сразу после сохранения нового узла.
источник
SELECT
запросы? Как вы справляетесь с задержками в репликации и тем фактом, что загрузка узла сразу после сохранения может вызвать проблемы?Модуль AutoSlave перенаправляет
SELECT
запросы в реплицируемые базы данных, доступные только для чтения, и учитывает задержку репликации.Согласно документам модуля, он использует репликант только для чтения, когда выполняются все следующие условия:
источник
Из того, что я слышал в недавнем Drupal BADcamp Pressflow, есть путь, если вам нужны конфигурации master / slave. Вы будете ограничены Mysql в качестве базы данных. Также ознакомьтесь с « группой высокой производительности » на сайте
источник
Несмотря на всю удивительную работу, проделанную на уровне абстракции базы данных в Drupal 7, это все равно удивительно сложно сделать с ядром Drupal из коробки. Как уже упоминали другие, AutoSlave - это вариант, хотя я и не пытался из-за моего упрямого отказа полагать, что это должно быть так трудно сделать.
Более простое решение, которое я нашел, заключается в следующем. Чтобы направить все
SELECT
файлы на подчиненный сервер, вы создаете файл с именемselect.inc
внутри основногоincludes/database/mysql
каталога со следующим содержимым:Есть несколько рисков с этим методом:
SELECT
s и направит их к ведомому, что, несомненно, вызовет проблемы, если у вас будет задержка в репликации. Прочтите это предложение еще раз.includes/database/mysql/select.inc
, ваш файл будет перезаписан во время обновления, и вам придется начать поддерживать свою собственную исправленную версию select.inc, которая поставляется с ядром Drupal.Если в файле settings.php не указаны подчиненные серверы, приведенный выше код не вызовет проблем. Это все еще будет постепенно снижаться до использования главного сервера.
источник
target => 'slave'
задана опция, он все равно будет работать на соединении по умолчанию. Это боль, легче установить цель соединения наquery_alter
уровне.