5

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 33063306表示されないのに対し、手動でクエリを実行するとに表示されるためです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  

非ループバックIP10.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
)
4

1 に答える 1

6

接続を確立しようとするときは、サーバーを定義する PECL/mysqlnd_ms ドキュメント セクションを必ず参照してください。セクション名 (例では "myapp") をホストとして、使用する PHP MySQL API の接続関数に渡す必要があります。このようなもの:

$pdo = new PDO('mysql:host=myapp;dbname=database', 'username', 'password');

または、あなたの場合、次のようなものです:

$mysql = new PDO("mysql:host=myapp;dbname=$dbname", $user, $pass);

使用禁止:

$mysql = new PDO("mysql:unix_socket=$socket;dbname=$dbname", $user, $pass);

これは、ソケット $socket でリッスンしているまさにそのサーバーに接続します。

于 2012-11-20T19:36:13.303 に答える