web-gelistirme-sc.com

MySQL master / slave yapılandırmasından yararlanmak için nasıl çekirdek alınır?

Bu soruyu okudum MySQL master/slave çoğaltma çalışmıyor ve cevabı:

Slave veritabanlarını kullanmak Drupal core'da zar zor uygulanmaktadır. Kendi modüllerinizi geliştiriyorsanız, db_query çağrıları, slave veritabanını $ options dizisini kullanarak kullanmak istediklerini belirtmelidir. : defaultOptions Bu dizinin nasıl ayarlanacağı.

Olmadan bir yol var mı yavru kedileri öldürmek daha köle SELECT sorguları yapmak için db_query() ve db_select() almak için çekirdek kesmek?

Varsayılan olarak, özellikle slave'i sorgulamasını söylemedikçe ana işlevleri sorgulayacaktır (API'larına bakın). Slave'i sorgulamak için db_query($query, $args, array('target' => 'slave')) yazmanız gerekir ve çekirdek (ve tüm modüller) bunu başarmak için yazılmaz.

Yalnızca arama (köle kısmına bakın) ve toplayıcı bunu kullanıyor gibi görünüyor.

Düzenleme: 25 Ekim
Pressflow 7'nin bittiğini gördüm ama şu anda çok yardımcı olup olmadığından emin değilim.
İlgili bir şey bulamadım, bunun cevabını bulmasına yardımcı olmak için biraz ödül verelim.

Düzenleme: 31 Ekim
Bu konuyla ilgili olarak Crell'in yorumları konusunda endişeliyim: Kölelerle ne yapmalı? .
Temel olarak, köleye SELECT sorgu gönderirsem, çoğaltmadaki gecikmelerde ve hemen sonra bir node_load() yapmak isteyebileceğimde sıkıntılar var mı? yeni bir düğüm kaydediliyor.

20
tostinni

Şu anda bunu nasıl uygulayacağım.

İlk önce böyle bir SelectQueryExtender sınıfı ayarlamanız gerekir:

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');
  }
}

Bunu yaptıktan sonra, yapmanız gereken tek şey genişleticiyi genişletmek için diğer tüm sorguları almaktır. :) Mantıklı geliyorsa. İşte snippet.

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

Ve şimdi tüm SelectQuery'niz slave'e vurdu ;-) Bunu başarabilmemin tek yolu bu. Her neyse harika çalışıyor.

Ayrıca bu özel bir modül varsa SlaveTarget SlaveTarget.inc dosyada olacak şekilde ayarlayabilirsiniz ve modül bilgi dosyasına bir dosya [] = SlaveTarget.inc ekleyebilirsiniz.

17
ericduran

AutoSlave modülü SELECT sorgusunu salt okunur çoğaltma veritabanlarına yönlendirir, ve çoğaltma gecikmesini dikkate alır.

Modül belgelerine göre, yalnızca aşağıdaki koşulların tümü doğru olduğunda salt okunur çoğaltıcıyı kullanır:

  1. Sorgu bir seçme sorgusudur
  2. Seçme sorgusundaki tablolar istek sırasında ve varsayılan çoğaltma gecikmesi içinde yazılmadı
  3. Bir işlem başlatılmadı
  4. Seçme sorgusundaki tablolar, sürücü ayarlarındaki 'tablolar' seçeneğinde belirtilmez
  5. Bir kilit başlatılmadı (çekirdek db kilidi ve memcache kilidi desteklenir)
5
smokris

en son duyduklarımdan Drupal BADcamp Pressflow master/slave yapılandırmaları istiyorsanız gitmek için bir yoldur. DB olarak Mysql ile sınırlı olacak. Ayrıca, " yüksek performans grub "devam ediyor.

1
uwe

Drupal 7] 'de veritabanı soyutlama katmanında yapılan tüm şaşırtıcı çalışmalara rağmen, bunun hala Drupal çekirdek kutusundan çıkarılması şaşırtıcıdır. diğerleri bahsetti, AutoSlave bir seçenek, ancak inatçı reddetme nedeniyle bunu yapmanın zor olması gerektiğine inanmaya çalıştığım biri değil.

Bulduğum daha basit bir çözüm şudur. Tümünü tüm SELECTs bağımlı sunucuya yönlendirmek için select.inc çekirdeğin içinde includes/database/mysql dizin ve aşağıdaki içerikler:

<?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".
 */

Bu yöntemle ilgili bazı riskler vardır:

  1. Bu yöntem tümünü tüm SELECTs'yi ele geçirir ve bunları köle'ye yönlendirir, bu da çoğaltmada herhangi bir gecikmeniz varsa şüphesiz sorunlara neden olur. Bu cümleyi tekrar okuyun.
  2. Drupal çekirdek sürümünü yükselttiğinizde, bu dosyanın silinmesi mümkündür.
  3. Drupal çekirdek kendi _ ile gönderilmeye başlamış olsaydı includes/database/mysql/select.inc, dosyanızın yükseltme sırasında üzerine yazılır ve Drupal çekirdek ile birlikte gelen select.inc'in kendi yamalı sürümünü korumaya başlamanız gerekir.

Settings.php dosyasında belirtilmiş bağımlı sunucularınız yoksa, yukarıdaki kod soruna neden olmaz. Yine de ana sunucu sunucusunu kullanarak zarafetle azalacaktır.

1
q0rban