我正在尝试设置PHP
mysqlnd_ms
扩展程序,但遇到了一些问题。到目前为止,这是我所做的:
- 已安装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
split 是否有效:
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
)