PHP
mysqlnd_ms
拡張機能をセットアップしようとしていますが、いくつか問題があります。これまでのところ、これが私が行ったことです。
-有効にしながらソースからコンパイルされたPHPmysqlnd
-インストール済みmysqlnd_ms
(実行すると、プラグイン pecl info mysqlnd_ms
に関する情報が表示されます):mysqlnd_ms
$ sudo pecl install mysqlnd_ms
-変更PHP.ini
(および後で再起動):
mysqlnd_ms.enable=1
mysqlnd_ms.disable_rw_split=0 ; for good measure
mysqlnd_ms.config_file=mysqlnd_ms_config.ini
-mysqlnd_ms_config.ini
以下のコンテンツで作成されました(公式ドキュメントに例として示されています)
{
"myapp": {
"master": {
"master_0": {
"host": "127.0.0.1",
"port": "3306"
}
},
"slave": {
"slave_0": {
"host": "localhost",
"socket": "\/var\/run\/mysqld\/mysqld.sock"
}
}
}
}
プラグインは、構成されたMySQLスレーブで読み取り専用ステートメントを実行し、MySQLマスターで他のすべてのクエリを実行します。ステートメントがSELECT、SQLヒント/ ms = slave /で始まる場合、または前のクエリを実行するためにスレーブが選択され、クエリがSQLヒント/ ms = last_used /で始まる場合、ステートメントは読み取り専用と見なされます。他のすべての場合、クエリはMySQLレプリケーションマスターサーバーに送信されます
したがって、この時点で、SELECT
ステートメントがに送信され、slave
他のステートメント(などUPDATE
)がに送信されることを期待していmaster
ます。
セットアップをテストするための小さなスクリプトを作成しました。
$socket = '/var/run/mysqld/mysqld.sock';
$dbname = 'mysqlnsmstest';
$user = 'root';
$pass = 'root';
$mysql = new PDO("mysql:unix_socket=$socket;dbname=$dbname", $user, $pass);
$result = $mysql->query('SELECT * FROM mytable');
foreach($result as $row) {
print_r($row);
}
$count = $mysql->exec("UPDATE mytable SET field='test' WHERE id=2");
echo "Nb rows affected: $count\n";
クエリは適切に実行されますが、すべてに送信されますslave
(これを知っているのは、トラフィックをスニッフィングすると何$ tcpdump -ni any port 3306
も3306
表示されないのに対し、手動でクエリを実行するとに表示されるためですtcpdump
)。
/*ms=slave*/
やなどのコメントを使用し/*ms=master*/
ても違いはありません。を混乱させる可能性のある他のgeneral_log
コメントがないことを示していますmysqlns_ms
:
121118 19:14:40 36 Connect root@localhost on mysqlnsmstest
36 Query /*ms=slave*/SELECT * FROM mytable
36 Query /*ms=master*/UPDATE mytable SET field='test' WHERE id=2
36 Quit
非ループバックIP
(10.0.0.56
ローカル接続など)を使用してネットワーク経由の接続を「強制」しようとしましたが、違いはありません。
$pdo->getAttribute(PDO::ATTR_CLIENT_VERSION)
"mysqlnd 5.0.10 - 20111026 - $Id: b0b3b15c693b7f6aeb3aa66b646fee339f175e39
どのショーmysqlnd
が使用されているかを教えてくれます。
読み取り/書き込み分割が機能するために何が欠けていますか(提案を歓迎します)?
更新:分割が機能している
かどうかを確認するために、tcpdumpよりも優れた方法を見つけました:read/write
print_r(mysqlnd_ms_get_last_used_connection($pdo));
Array
(
[scheme] => unix:///var/run/mysqld/mysqld.sock
[host_info] => Localhost via UNIX socket
[host] =>
[port] => 3306
[socket_or_pipe] => /var/run/mysqld/mysqld.sock
[thread_id] => 48
[last_message] => Rows matched: 1 Changed: 0 Warnings: 0
[errno] => 0
[error] =>
[sqlstate] => 00000
)