it-swarm-vi.com

Làm thế nào để có được lõi để tận dụng cấu hình chủ / nô lệ của MySQL?

Tôi đọc câu hỏi này bản sao chủ/nô lệ của MySQL không hoạt động và câu trả lời của nó:

Việc sử dụng cơ sở dữ liệu nô lệ hầu như không được triển khai trong Drupal. Nếu bạn đang phát triển các mô-đun của riêng mình thì hãy gọi tới db_query cần xác định rằng họ muốn sử dụng cơ sở dữ liệu nô lệ bằng mảng tùy chọn $. Xem DatabaseConnection: : defaultOptions để biết cách đặt mảng này.

Có cách nào không giết mèo con hack lõi để lấy db_query()db_select() để tạo thêm truy vấn CHỌN nô lệ?

Theo mặc định, các hàm này sẽ truy vấn chủ trừ khi được yêu cầu truy vấn nô lệ cụ thể (xem API của chúng). Bạn phải viết db_query($query, $args, array('target' => 'slave')) để truy vấn nô lệ và lõi (và tất cả các mô-đun) không được viết để đạt được điều này.

Chỉ tìm kiếm (xem phần nô lệ) và tập hợp dường như tận dụng điều này.

Chỉnh sửa: Tháng 10, 25
[.__.] Tôi thấy báo chí 7 đã hết nhưng tôi không chắc liệu nó có giúp ích gì nhiều không.
[.__.] Tôi chưa tìm thấy thứ gì có liên quan vì vậy chúng ta hãy thử một chút tiền thưởng để giúp câu trả lời này.

Chỉnh sửa: Tháng 10, 31
[.__.] Tôi chủ yếu lo lắng về Nhận xét của Crell liên quan đến chủ đề này: Phải làm gì với nô lệ? .
[.__.] Chủ yếu, có vấn đề gì không nếu tôi gửi SELECT truy vấn cho nô lệ, điều gì xảy ra với sự chậm trễ trong bản sao và thực tế là tôi có thể muốn thực hiện node_load() ngay sau đó lưu một nút mới.

20
tostinni

Đây là cách tôi hiện đang thực hiện điều này.

Trước tiên, bạn cần thiết lập một lớp SelectQueryExtender như thế này:

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

Khi bạn đã có, tất cả những gì bạn phải làm là nhận tất cả các truy vấn khác để mở rộng bộ mở rộng. :) nếu điều đó hợp lý. Đây là đoạn trích.

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

Và bây giờ, tất cả các lựa chọn của bạn đánh vào nô lệ ;-) Đây là cách duy nhất tôi có thể thực hiện được. Dù sao nó hoạt động tuyệt vời.

Ngoài ra, nếu bạn có cái này trên một mô-đun tùy chỉnh, bạn có thể thiết lập SlaveTarget thành nó trên tệp SlaveTarget.inc và thêm một tệp [] = SlaveTarget.inc vào tệp thông tin mô-đun của bạn.

17
ericduran

Mô-đun AutoSlave chuyển hướng SELECT truy vấn cơ sở dữ liệu sao chép chỉ đọc, nó đưa vào độ trễ nhân rộng tài khoản.

Theo các tài liệu mô-đun, nó chỉ sử dụng trình sao chép chỉ đọc khi tất cả các điều kiện sau là đúng:

  1. Truy vấn là một truy vấn chọn
  2. Các bảng trong truy vấn chọn không được ghi vào trong yêu cầu và trong độ trễ sao chép giả định
  3. Một giao dịch chưa được bắt đầu
  4. Các bảng trong truy vấn chọn không được chỉ định trong tùy chọn 'bảng' trong cài đặt trình điều khiển
  5. Khóa chưa được khởi động (hỗ trợ khóa db và khóa memcache)
5
smokris

từ những gì tôi nghe được gần đây Drupal BADcamp Pressflow là cách để đi nếu bạn muốn cấu hình chủ/nô lệ. Bạn sẽ bị giới hạn ở Mysql dưới dạng DB. nhóm hiệu suất cao "khi làm.

1
uwe

Mặc dù tất cả các công việc tuyệt vời được thực hiện trên lớp trừu tượng cơ sở dữ liệu trong Drupal 7, nhưng điều này vẫn rất khó thực hiện với Drupal lõi ngoài hộp. những người khác đã đề cập, AutoSlave là một tùy chọn, mặc dù không phải tôi đã cố gắng vì sự từ chối cứng đầu của tôi để tin rằng điều đó thật khó để làm điều này.

Một giải pháp đơn giản hơn tôi đã tìm thấy là sau đây. Để định tuyến tất cả SELECTs đến máy chủ nô lệ, bạn tạo một tệp có tiêu đề select.inc Bên trong lõi includes/database/mysql Thư mục có nội dung sau:

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

Có một số rủi ro với phương pháp này:

  1. Phương thức này sẽ Hijack tất cả SELECTs và hướng chúng đến nô lệ, điều này chắc chắn sẽ gây ra vấn đề nếu bạn có bất kỳ độ trễ nào trong quá trình sao chép. Đọc câu đó một lần nữa.
  2. Khi bạn nâng cấp Drupal, có thể tệp này sẽ bị xóa.
  3. Nếu Drupal đã từng bắt đầu giao hàng với includes/database/mysql/select.inc Của riêng bạn, tệp của bạn sẽ bị ghi đè trong quá trình nâng cấp và bạn sẽ phải bắt đầu duy trì phiên bản đã chọn của mình. inc mà tàu có Drupal lõi.

Nếu bạn không có bất kỳ máy chủ nô lệ nào được chỉ định trong settings.php, đoạn mã trên sẽ không gây ra sự cố. Nó vẫn sẽ giảm xuống một cách duyên dáng khi sử dụng máy chủ master .

1
q0rban