web-dev-qa-db-ja.com

drupalサイト間でノードを分散する

異なるサイト間でノードを共有できるスケーラブルなdrupalシステムを作成する方法を調査しています。将来の成長をサポートするために、より多くのサーバーを「プラグイン」する必要がある可能性があります/ネットワークへのサイト。

これは、マスターレコード、ユーザー、およびアクセス許可を格納するための中央サイトで最もよく達成され、スレーブサイトは必要に応じてこれらのコピーを保持すると考えていました。すべてのサイトがすべてのノードを必要とするわけではなく、リンクされているノードのみが必要です。

あるいは、中央サイトは、どのサイトにマスターレコードがあるかを保存できます。それは成長を容易にするかもしれません。ノードIDを考えると、最終的なソリューションは、これらの数が数百万に達する可能性があるという事実に対応する必要があります。

それはクレイジーなアイデアかもしれませんし、おそらくDrupalもこれに適したプラットフォームではありません。

何か案は?

更新:概念はシャーディングとマップリデュースの概念に似ています(私の基本的な理解です)が、私の最大の関心事はノードIDです。システムが調査しているユーザー/グループ/ノードの数に達した場合、nid intの制限に達し、その時点よりもかなり前にパフォーマンスの問題が発生する可能性があります。したがって、分散モデルが最善の方向であるように思われます。

3
lordg

通常、drupalを使用すると、それぞれがデータベースの独自のフラグメントを持つ複数のデータベースを持つことはなく、組み合わせるとサイト全体になります。

drupal 7を使用すると、drupal now データベースマスターとスレーブをサポート アプリケーション内から。これが意味することは、サイトの非機能要件(可用性、パフォーマンスなど)をサポートするために3つのデータベースサーバーが必要であるということです。次を追加できます。

<?php
$databases['default']['default'] = array(
  'driver' => 'mysql',
  'database' => 'drupaldb1',
  'username' => 'username',
  'password' => 'secret',
  'Host' => 'dbserver1',
);
$databases['default']['slave'][] = array(
  'driver' => 'mysql',
  'database' => 'drupaldb2',
  'username' => 'username',
  'password' => 'secret',
  'Host' => 'dbserver2',
);
$databases['default']['slave'][] = array(
  'driver' => 'mysql',
  'database' => 'drupaldb3',
  'username' => 'username',
  'password' => 'secret',
  'Host' => 'dbserver3',
);
?>

この定義は、単一の「デフォルト」サーバーと2つの「スレーブ」サーバーを提供します。 「スレーブ」キーは配列であることに注意してください。ターゲットが接続情報の配列として定義されている場合、定義されたサーバーの1つが、ページ要求ごとにそのターゲットに対してランダムに選択されます。つまり、1つのページ要求で、すべてのスレーブクエリがdbserver2に送信され、次のページ要求ですべてがdbserver3に送信される可能性があります。

上記はドキュメントから直接です;)

独自のカスタムdrupalスキーマまたは負荷分割アルゴリズムを作成する場合は、これはsupported構成であるため、上記のアプローチをお勧めします-あなた今それをサポートする必要があります。

drupal 6を使用すると、 pressflow を使用する必要があります。 Pressflowは、drupalコードベースからのパフォーマンスベースのフォークであり、drupalとの100%のAPI互換性を維持しようとします。 Lullabotは素晴らしい記事を書きました pressflow6を使用したデータベースレプリケーションについて。

Lullabotが彼らの つのスレーブクエリモジュールを表示 githubでもリリースしたことが判明しました、フォークしてください!

4
wiifm