it-swarm-id.com

Bagaimana cara mendapatkan core untuk meningkatkan konfigurasi master / slave MySQL?

Saya membaca pertanyaan ini MySQL master/replikasi slave tidak berfungsi dan jawabannya:

Menggunakan database slave hampir tidak diimplementasikan dalam Drupal core. Jika Anda mengembangkan modul Anda sendiri maka panggilan ke db_query perlu menentukan bahwa mereka ingin menggunakan database slave menggunakan array $ options. Lihat DatabaseConnection: : defaultOptions untuk cara mengatur array ini.

Apakah ada jalan keluar membunuh anak kucing meretas inti untuk mendapatkan db_query() dan db_select() untuk membuat lebih banyak query SELECT slave?

Secara default, fungsi-fungsi ini akan meminta master kecuali jika secara khusus diberitahu untuk meminta budak (lihat API mereka). Anda harus menulis db_query($query, $args, array('target' => 'slave')) untuk meminta budak dan inti (dan semua modul) tidak ditulis untuk mencapai ini.

Hanya pencarian (lihat bagian slave) dan agregator tampaknya memanfaatkan ini.

Edit: Okt, 25
Saya melihat pressflow 7 keluar tetapi saya tidak yakin apakah itu banyak membantu saat ini.
Saya belum menemukan sesuatu yang relevan jadi mari kita coba sedikit karunia untuk membantu ini mendapatkan jawaban.

Edit: Okt, 31
Saya terutama khawatir tentang komentar Crell mengenai topik ini: Apa yang harus dilakukan dengan budak? .
Terutama, apakah ada masalah jika saya mengirim SELECT permintaan ke budak, apa yang terjadi dengan keterlambatan dalam replikasi dan fakta bahwa saya mungkin ingin melakukan node_load() setelah menyimpan simpul baru.

20
tostinni

Begini cara saya mengimplementasikan ini.

Pertama, Anda perlu mengatur kelas SelectQueryExtender seperti ini:

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

Setelah Anda memilikinya, maka yang harus Anda lakukan adalah mendapatkan semua pertanyaan lain untuk memperpanjang extender. :) jika itu masuk akal. Ini cuplikannya.

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

Dan sekarang semua SelectQuery Anda mengenai budak ;-) Ini adalah satu-satunya cara saya dapat mencapai ini. Bagaimanapun itu bekerja dengan baik.

Juga jika Anda memiliki ini pada modul khusus, Anda dapat mengatur SlaveTarget agar berada di file SlaveTarget.inc dan menambahkan file [] = SlaveTarget.inc ke file info modul Anda.

17
ericduran

The AutoSlave modul redirects SELECT kueri ke basis data replikasi hanya baca, dan ia memperhitungkan lag replikasi akun.

Menurut dokumen modul, itu hanya menggunakan replant baca-saja ketika semua kondisi berikut ini benar:

  1. Kueri adalah kueri pemilihan
  2. Tabel dalam kueri pemilihan belum ditulis selama permintaan dan dalam jeda replikasi yang diasumsikan
  3. Transaksi belum dimulai
  4. Tabel dalam kueri pemilihan tidak ditentukan dalam opsi 'tabel' dalam pengaturan driver
  5. Kunci belum dimulai (core db-lock dan memcache-lock didukung)
5
smokris

dari apa yang saya dengar di Drupal BADcamp Pressflow baru-baru ini adalah cara untuk pergi jika Anda ingin konfigurasi master/slave. Anda akan terbatas pada Mysql sebagai DB. Juga, checkout the "- grup berkinerja tinggi "saat dilakukan.

1
uwe

Terlepas dari semua pekerjaan luar biasa yang dilakukan pada lapisan abstraksi basis data di Drupal 7, ini masih sangat sulit dilakukan dengan Drupal inti di luar kotak). yang lain telah menyebutkan, AutoSlave adalah sebuah opsi, meskipun bukan yang saya coba karena penolakan keras kepala saya untuk percaya bahwa itu harus sulit untuk melakukan ini.

Solusi sederhana yang saya temukan adalah sebagai berikut. Untuk merutekan semua SELECTs ke server slave, Anda membuat file berjudul select.inc Di dalam inti includes/database/mysql Dengan konten berikut:

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

Ada beberapa risiko dengan metode ini:

  1. Metode ini akan membajak semua SELECTs dan mengarahkannya ke slave, yang tidak diragukan lagi akan menyebabkan masalah jika Anda memiliki keterlambatan dalam replikasi. Baca kalimat itu lagi.
  2. Ketika Anda memutakhirkan Drupal inti, ada kemungkinan bahwa file ini akan dihapus.
  3. Jika Drupal inti pernah memulai pengiriman dengan includes/database/mysql/select.inc Sendiri, file Anda akan ditimpa selama pemutakhiran, dan Anda harus mulai memelihara versi tambalan yang Anda pilih sendiri. inc yang dikirimkan dengan Drupal inti.

Jika Anda tidak memiliki server slave yang ditentukan di settings.php, kode di atas tidak akan menyebabkan masalah. Itu masih akan menurun dengan anggun untuk menggunakan server master .

1
q0rban