• ベストアンサー
  • すぐに回答を!

PHPからMySQLへのクエリの振り分け方法

LAMP構成のWebアプリケーションでのDBサーバ増設について質問です。 今までDBサーバ(MySQL)1台で運用していたのですが、 1台増設してレプリケーションを行うことになりました。 DBサーバ1:マスター(新設) DBサーバ2:スレーブ そこで、PHPスクリプトを全面的に見直して、以下のように DBへのコネクション部分を変更する必要が出てきました。 ・コネクション中に一度でも更新系のクエリを発行する場合はマスターへ ・それ以外はスレーブへ これをインクルード先まで追って調査するのは現実的ではないため、 一括で振り分ける方法を探しています。 雑で申し訳ありませんが、環境は以下の通りです。 PHP 5.1.6 (cli) PEAR::DB(1.7.13) MySQL 4.1.22

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数530
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1

まったくの未検証ですが、 PEAR::DBのインスタンスを作成する場所で、代わりに、PEAR::DBのインスタンス(マスターとスレーブの二つ)に接続するハブクラスを作成したら最小限の改修でいくかもしれませんが、どうでしょう。 <?php class DBR{ public static function connect($dsn){ return new DBR_mysql($dsn); } } class DBR_mysql{ protected $DB = array(); public function __construct($dsn){ $this->DB['master'] = DB::connect($dsn['master']); $this->DB['slave'] = DB::connect($dsn['slave']); } public function __call($method, $params){ if($method == 'query'){ if(preg_match('/^\s*SELECT/i', $params[0])){ return call_user_func_array(array($this->DB['slave']), $params); } } return call_user_func_array(array($this->DB['master']), $params); } } ?> このようにすれば、PEAR::DBのインスタンス作成箇所を <?php $obj = DB::connect("DSN情報"); ?> と記述してあるものを <?php $obj = DBR::connect(array('master'=>"マスタのDSN", 'slave'=>"スレーブのDSN")); ?> と記述してやると、オーバーロードした__callメソッドにて、基本的に全てmasterに振って、queryメソッドで「SELECT」から始まるもののみ、スレーブに振り分ける、ということが出来ます。 PEAR::DBをちゃんと利用したことが無いので、queryメソッドだけを振り分ければそれでいけるのかは分かりませんが・・・

共感・感謝の気持ちを伝えよう!

質問者からのお礼

hogehoge78さま とても参考になりました。ほぼそのままの内容でいけそうです。 迅速なご回答を頂きましてありがとうございました!

関連するQ&A

  • MySQLパフォーマンスについて

    MySQLでレプリケーションを行っております。 例えば マスター1台で スレーブ10台のサーバへレプリケーションをおこなっているとした場合 1.マスターへの負荷はスレーブ1台の時よりかなり増大するものでしょうか?  それとも気にする程でもない程度でしょうか? 2.レプリケーション遅延はスレーブ1台の時より大きくなりますでしょうか? もちろんいろんな状況によって変化するとは思いますが 一般的に考えて、もしくは私見でもよいのでお教え頂けますでしょうか。 MySQLバージョン:5.5.15 1日のページビュー:500万PV 同時アクセス数:200 select と insert,update の比率は同じくらいです。

    • ベストアンサー
    • MySQL
  • レプリケーション

    MySQLでスレーブ・マスターの設定をしてレプリケーションができたと思いますが、サーバ等がダウンした際にスレーブ・マスターの関係を逆転させること(今までスレーブだったのをマスターにして、マスターをスレーブに)は出来ますか? 2台のWEBサーバにそれぞれDBが乗っかっていて、マスターサーバがダウンした際にはDBも切り替えを行いたいのですが・・・ よろしくお願いします。

    • ベストアンサー
    • MySQL
  • PHP MySQL

    PHPとMysqlの連携でライブラリ(Pear)を使わずにDBを使うことは出来ますでしょうか。

  • MySqlに接続できない

    環境:PHP5,MySql5,XP 下記の構文でDBへの接続エラーがでます。 php.iniでのインクルードpathの設定もあっています。 (DB.phpも上記インクルードpathにあります) 'pear list'コマンドでDBも確かにインストールされています。 これ以外でチェックするところがあれば、教えてください。 <?php // DBクラスモジュールをインクルード require_once("DB.php"); $dbtype = "mysql"; $sv = "localhost"; $dbname = "********"; $user = "root"; $pass = "******"; // データベースに接続する $dsn = "$dbtype://$user:$pass@$sv/$dbname"; $conn = DB::connect($dsn); if (DB::isError($conn)) { die("接続エラー"); } ?>

    • ベストアンサー
    • PHP
  • MySQLで複数のマスターの受けは可能でしょうか?

    最近MySQLをちょこちょこ触っているものですが、ふとした疑問にぶち当たりました。 もし、ご存じの方がいらっしゃいましたらご教授頂けないでしょうか? 質問 AというMySQLマスターServer BというMySQLスレーブServer があり、お互いにレプリケーションの関係を築いております。 ここに、突然 全く別のデータが入っている CというMySQLマスターServerの受け皿としてBをスレーブに出来ますでしょうか? つまり、B(MySQLスレーブServer)はAのスレーブでもあり、Cのスレーブでもある。 ということが出来るのでしょうか? (出来る、出来ないで結構です、やり方などのご教授はいりません。) MySQLにお詳しい方いらっしゃいましたらアドバイス頂けないでしょうか? よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • MySQLでのdeadlockをPHPで検出する方法

    MySQLで、deadlockが発生した場合、強制的なrollbackが、どちらかのトランザクションにかけられます。 これは、当然ですし、いいんですが。 問題は、PHPでどのようにこれを検知し、再実行をかけるには、どのようなコーディングをすればいいのかということです。 データベースの取り扱いには、PEARを使っていますので、できれば、PEAR DB で扱えると嬉しいのですが。 PEAR のソースで、deadlock を探したんですが、見つからないもので。 よろしくお願いします。

    • 締切済み
    • PHP
  • SFTPで/var/lib/mysql/にPUT

    MySQL5.5でレプリケーション(準同期)を構築しています。 http://it.sifr.me/mysql-semi-synchronous-replication/ 上記のサイトを参考に、マスターサーバー(192.168.100.101)からスレーブサーバー(192.168.100.105)にレプリケーションの予定です。 上記サイトをもとに構築していたのですが、レプリケーションの前の段階の 「SFTPで/var/lib/mysql/に接続、PUT」するという単純なことが出来ません。 下記のように192.168.100.101にあるSQLをスレーブサーバー192.168.100.105にSFTPで接続してPUTするという作業をしたころ Couldn't get handle: Permission denied になってしまっています。 [root@sv1 ~]# cd /var/lib/mysqll      //192.168.100.101のマスターサーバー上でcd [root@sv1 mysql]# sftp -oPort=22 replica@192.168.100.105 //スレーブに接続 Connecting to 192.168.100.105... replica@192.168.100.105's password: sftp> cd /var/lib/mysql      //192.168.100.105のスレーブサーバー上でcd sftp> put master-mysql-data.tar.gz   //192.168.100.105のスレーブサーバーにput Uploading master-mysql-data.tar.gz to /var/lib/mysql/master-mysql-data.tar.gz Couldn't get handle: Permission denied  //エラー sftp> 現在のユーザー設定は以下の通りです。 ユーザー名はいずれも replica で 192.168.100.101(マスター) ●linuxユーザー(ユーザー名 replica) ●mySQLユーザー(ユーザー名 replica)    ホスト192.168.100.105 スレーブレプリケーションの許可 192.168.100.105(スレーブ) ●linuxユーザー(ユーザー名 replica)(グループ mysql) ●mySQLユーザー(ユーザー名 replica)     ホスト192.168.100.101    スレーブレプリケーションの許可&クライアントレプリケーションの許可 と設定しています。 尚、PUT先の192.168.100.105 の/var/lib/mysql/の所有者はユーザー、グループともmysqlです。 mysqlユーザーで行えばput可能のでしょうが、どのサイトを見てもreplication専用ユーザーを作って対応することとなっており、安全上の面からも機能限定のユーザーでputしたく考えております。 対応方法についてご教授いただきたくお願いいたしします。

    • ベストアンサー
    • MySQL
  • DBサーバの構築でマスタをOracle、スレーブをMySQLにて構築す

    DBサーバの構築でマスタをOracle、スレーブをMySQLにて構築することはできるのでしょうか。

  • PHP : pdo_mysql.so

    大変お世話になっております。 今回、PHPでバッチを作成しました。 当然、pdo_mysql.so をドライバーとし、コネクションを生成しようとしておりますが、 「Error:could not find driver」 とエラーが出てしまいます。 そこで、php.ini に設定を行いました。 extension_dir に、実態の配置されているpath extension=pdo.so extension=pdo_mysql.so の設定を行っております。 phpinfo() には、pdo_mysql が表示されています。 また、同一サーバーにZendFramework を利用したアプリケーションが存在しておりますが、 そちらではDBへのアクセスが可能であります。 上記のような現象に思い当たる部分がある方は、 是非ご教示ください。 お手数おかけいたしますが、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Apache,MySQL,PHPのconfigureについて

    CentOS5で、LAMPサーバを作ろうとしているのですが、 デフォルトでインストールされているApache・MySQL・PHPが どの様にconfigureされていか、知る方法は有りませんでしょうか? 最悪、全部ソースからインストールする覚悟はしているのですが、 ちょっと楽をしたくて.....。