一般的な好奇心に関する質問があります。
1 つのマスター サーバー (書き込み用) と 5 つのスレーブ サーバー (読み取り用) があるとします。
Web アプリケーション内で、マスターとスレーブの両方への接続を開始しますか? 書き込みの送信のみにマスター接続を使用し、データの読み取りのみにスレーブ接続を使用しますか?
一般的な好奇心に関する質問があります。
1 つのマスター サーバー (書き込み用) と 5 つのスレーブ サーバー (読み取り用) があるとします。
Web アプリケーション内で、マスターとスレーブの両方への接続を開始しますか? 書き込みの送信のみにマスター接続を使用し、データの読み取りのみにスレーブ接続を使用しますか?
いずれの場合も、通常はgetConnection()関数を介して、必要に応じてマスター接続とスレーブ接続を処理する必要があります。私の職場でのセットアップでは、2つのクラスター、2つのマスター、1つに4つのスレーブ、もう1つに8つのスレーブがあり、関数は基本的に次のようになります。
<?php
class Custom_Db_Handler
{
const READ = "read";
const WRITE = "write";
private static $_instance;
private $_connections = array();
private $_config;
private function __construct() {
$this->_config = Storage::get("config mysql");
}
public function get() {
if(is_null(self::$_instance)) {
self::$_instance = new self;
}
return self::$_instance;
}
public function getConnection($db, $type = "read") {
if(array_key_exists($type, $this->_connections)) {
return $this->_connections[$type][$db];
}
if($type != self::READ || $type != self::WRITE) {
return false;
}
$this->_connections[$type][$db] = mysql_connect($this->_config[$type]['host'], $this->_config[$type]['user'], $this->_config[$type]['pass']);
mysql_select_db($db, $this->_connections[$type][$db]);
return $this->_connections;
}
}
使用法は次のようになります:
$query = "SELECT * FROM table";
$res = mysql_query($query, Custom_Db_Handler::get()->getConnection("my_db", Custom_Db_Handler::READ));
これは非常に基本的な例ですが、マスター/スレーブ接続を管理する方法についてのアイデアが得られたと思います。
PHP 5.3 と mysqlnd ドライバーを使用する場合は、ドライバー レベルで読み取り/書き込み分割を処理する mysqlnd_ms プラグインを追加できるため、コードを変更する必要はありません (mysql、mysqli、PDO 接続ライブラリで動作します)。
詳細については、http: //pecl.php.net/package/mysqlnd_ms http://www.slideshare.net/nixnutz/mysqlnd-quick-overview2011を参照してください。