首页 > 解决方案 > 通过套接字连接到 ProxySQL - “没有这样的文件或目录”

问题描述

我正在尝试使用本地套接字通过 mysqlnd 从 PHP 连接到 ProxySQL,但我得到了

“没有这样的文件或目录”

,因为套接字将不存在。相同的代码可以毫无问题地连接到mysql套接字。

基本上我正在复制以下描述的内容: https ://www.percona.com/blog/2017/09/19/proxysql-improves-mysql-ssl-connections/

<?php
$i = 10000;
$user = 'percona';
$pass = 'percona';
while($i>=0) {
 $mysqli = mysqli_init();

 // ProxySQL
 $link = mysqli_real_connect($mysqli, "localhost",      $user, $pass, "", 6033, "/tmp/proxysql.sock")
 or die(mysqli_connect_error());
 $info = mysqli_get_host_info($mysqli);
 $i--;
 mysqli_close($mysqli);
 unset($mysqli);
}
?>

这抛出:

mysqli_real_connect(): (HY000/2002): No such file or directory

套接字文件 (/tmp/proxysql.sock) 实际上在那里:

$ ls -all /tmp
total 12
drwxrwxrwt. 11 root     root      4096 Oct  7 17:33 .
dr-xr-xr-x. 28 root     root      4096 Sep 20 17:42 ..
drwxrwxrwt.  2 root     root         6 Aug  8 02:40 .font-unix
drwxrwxrwt.  2 root     root         6 Aug  8 02:40 .ICE-unix
srwxrwxrwx   1 proxysql proxysql     0 Oct  7 17:11 proxysql.sock

我可以使用 mysql 客户端通过它进行连接:

$ mysql -u myuser -p --socket /tmp/proxysql.sock --prompt='ProxySQLClient> '

如果在上面的 PHP 代码中我用 MySQL 套接字替换了套接字文件,那么就可以了。只有 proxysql.sock 不能与 mysqlnd 一起使用。

我正在使用:mysqlnd 版本mysqlnd 5.0.12-dev - 20150407
ProxySQL 版本2.0.6

知道为什么 mysqlnd 不接受 proxysql.sock 吗?

更新:按照下面@EternalHour 的建议,我也尝试将proxysql.sock 文件移出/tmp,但不幸的是这并没有什么不同。我仍然收到同样的错误。

编辑(2019-10-08):事实证明这个问题与 PHP 无关,因为 netcat 也会抛出同样的问题,无论是 /tmp 还是 /var/sockets/ 中的套接字文件:

$ nc -U /tmp/proxysql.sock
Ncat: No such file or directory.

在 ProxySQL 集群的 3 个节点中,运行在相同操作系统、相同内核版本上的节点中,1 个存在此问题,另外 2 个允许连接到 /tmp/proxsql.sock 中的套接字文件,虽然也在那边,有时重新启动 ProxySQL 结果在被创建为私有的套接字文件中(例如,对其他应用程序不可用)

标签: proxysql

解决方案


许多 MySQL 客户端对这个词有特殊处理localhostlocalhost并不意味着“使用解析器localhost通过 TCP 解析和连接”,而是“在默认路径上使用 unix 域套接字”来使用 TCP127.0.0.1代替。如果 proxySQL 还提供了 unix 域套接字,请提供该路径。


推荐阅读