11

現在mysql_query関数を使用してレプリケートされたデータベース(4つのスレーブ、1つのマスター)にアクセスする古いphpWebアプリを再開発するように依頼されました。

この再開発の一部により、データベースの一部がmysql-clusterに移動されます。最近はPDOを使ってデータベースにアクセスしていて、PDOがクラスターでうまく機能するかどうかを調べようとしていますが、Web上で役立つ情報をあまり見つけることができません。

誰かがこれを経験したことがありますか?私はこれまでクラスターを使ったことがありません...

4

3 に答える 3

3

クラスターをハードウェアまたはソフトウェアのロードバランサー(HAProxyなど)の背後に隠すことを検討しましたか?このように、クライアントコードはクラスターをまったく処理する必要がなく、クラスターを1つの仮想サーバーとして認識します。

それでも、書き込むアプリケーションと読み取るアプリケーションを区別する必要があります。私たちのシステムでは、スレーブサーバーをロードバランサーの背後に配置し、読み取り専用アプリケーションはこのクラスターを使用し、書き込みアプリケーションはマスターサーバーに直接アクセスします。これを自動的に実現しようとはしていません。データベースを更新する必要があるアプリケーションは、単に別のサーバーのホスト名とユーザー名を使用します。

于 2012-09-03T14:51:02.073 に答える
3

私はこれをいくつかの異なる方法で行い、成功のレベルを変えました。簡単に言うと、PDO接続は正常に機能するはずです。私が見ているように、オプションは次のとおりです。

レプリケーションを使用している場合は、さまざまなサーバーへの接続を処理するクラスを作成するか、プロキシを使用します。プロキシは、ハードウェアまたはソフトウェアの場合があります。MySQLプロキシ(http://docs.oracle.com/cd/E17952_01/refman-5.5-en/mysql-proxy.html)は、私が使用していたソフトウェアロードバランサーであり、ほとんどの場合、このトリックを実行しました。リーダーとライターの間でトラフィックを自動的にルーティングし、フェイルオーバーをチャンピオンのように処理します。時々、それを捨てて物事を微調整しなければならないクエリを書くでしょうが、それは何年も前のことです。今はもっと良い形になっているかもしれません。

もう1つのオプションは、標準のロードバランサーを使用して、2つの接続を作成することです。1つはライター用、もう1つはリーダー用です。アプリは、実行しようとしている機能に基づいて、使用する接続を決定できます。

最後に、MySQLから利用可能なmaxdbクラスターの使用を検討できます。この設定では、MySQLサーバーはすべてリーダーとライターです。必要な接続は1つだけですが、すべてのトラフィックをルーティングするにはロードバランサーが必要です。インデックスが同期しなくなると、最大dbクラスターがトリッキーになる可能性があるため、このオプションを使用する場合は、軽く踏み込んでください。

明確化:接続について言及するとき、私が意味するのは、MySQLに接続するためのアドレスとポートです。同じポートで実行されている同時接続と混同しないでください。

幸運を!

于 2012-09-05T14:37:27.603 に答える
-1

接続関数とクエリ関数を含むDBのラッパークラスを記述します...

クエリ関数は、最初の単語を調べて、それがSELECTであるかどうかを検出し、スレーブDB接続を使用する必要があります。それ以外の場合(INSERT、UPDATE、RENAME、CREATEなど)はMASTERサーバーに移動する必要があります。

connect()関数は、スレーブの配列を調べて、使用するスレーブをランダムに選択します。

更新を行う必要がある場合にのみマスタースレーブに接続する必要があります(ほとんどのWebページはDBを更新するべきではなく、データを読み取るだけです...更新しないときにMASTERdbに接続する時間を無駄にしないようにしてくださいこれを使って)

クラスで静的変数を使用してDB接続を保持することもできます。これにより、DBクラスのインスタンス間で接続が共有されます(つまり、'$ db = new DB( )')

データベース関数をこのようなクラスに抽象化すると、デバッグや機能の追加も簡単になります

于 2012-08-28T18:30:40.457 に答える