gpt4 book ai didi

php - 问题让读/写拆分与 PHP mysqlnd_ms 一起使用

转载 作者:可可西里 更新时间:2023-11-01 07:04:35 25 4
gpt4 key购买 nike

我正在尝试设置 PHP mysqlnd_ms 扩展,但遇到了一些问题。到目前为止,这是我所做的:

- compiled PHP from source while enabling mysqlnd

-已安装 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 包含以下内容 ( which is given as example in the official doc )

{
"myapp": {
"master": {
"master_0": {
"host": "127.0.0.1",
"port": "3306"
}
},
"slave": {
"slave_0": {
"host": "localhost",
"socket": "\/var\/run\/mysqld\/mysqld.sock"
}
}
}
}

According to the documentation :

The plugin executes read-only statements on the configured MySQL slaves, and all other queries on the MySQL master. Statements are considered read-only if they either start with SELECT, the SQL hint /ms=slave/, or if a slave had been chosen for running the previous query and the query starts with the SQL hint /ms=last_used/. In all other cases, the query will be sent to the MySQL replication master server

所以在这一点上,我希望我的 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 任何端口 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 本地 IP)通过网络“强制”连接,但没有任何区别。

$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
)

最佳答案

请确保在尝试建立连接时引用定义服务器的 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 的服务器。

关于php - 问题让读/写拆分与 PHP mysqlnd_ms 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13443098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com