【问题标题】:Connecting to ProxySQL via socket - "No such file or directory"通过套接字连接到 ProxySQL - “没有这样的文件或目录”
【发布时间】:2019-10-07 17:40:43
【问题描述】:

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

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

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

基本上,我正在复制以下描述的内容: 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

socket 文件 (/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 会导致套接字文件被创建为私有(例如,对其他应用程序不可用)

【问题讨论】:

  • 看看这里,serverfault.com/questions/614781/…。我相信问题来自/tmp 目录中的文件。您可以尝试该建议或将 .sock 文件移至其他位置。
  • 谢谢@EternalHour,我之前已经试过了,不幸的是没有改变。但是为了确保我再次尝试了,不幸的是没有改变,问题仍然是一样的。
  • 从 proxysql 1.x 迁移到 2.x 后,我不得不将我所有的应用程序指向 /var/lib/proxysql/proxysql.sock.. 我意识到你说套接字在 /tmp 但我想我会提到无论如何,以防它引导您朝着正确的方向前进。
  • 谢谢,不幸的是这并没有真正帮助。我可以在 /tmp/proxysql.sock 中看到 .sock 文件,实际上我可以将它重新定位到其他地方,问题是只要我将 PHP 的 mysqlnd 指向它,它就会说“没有这样的文件或目录”,而如果我将它指向 MySQL 的 mysql.sock 文件,那么它就可以工作。

标签: proxysql


【解决方案1】:

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

【讨论】:

  • 谢谢,不幸的是这没有回答。 “/tmp/proxysql.sock”已经是ProxySql的socket文件的路径。我已经使用“localhost”来触发套接字的使用。问题是 mysqlnd 说“没有这样的文件或目录”。 proxysql 套接字文件在那里,当从 mysql CLI 使用时它是可操作的。
【解决方案2】:

对不起大家,问题简单得令人尴尬-完全是我的错。

当我在 ProxySQL Admin 中更改套接字文件的位置时,我正在使用以下内容

update global_variables set variable_value='0.0.0.0:6033;/tmp/proxysql.sock ' where variable_name='mysql-interfaces'; 将 MYSQL 变量保存到磁盘;

是的,这是“/tmp/proxysql.sock”末尾的一个空格。 当我将它更改到不同的位置时,我只重写了前半部分(文件夹),而不是文件名,所以我只是不断复制空间,因此总是找不到文件或目录......

问题解决了!

对不起

【讨论】:

    猜你喜欢
    • 2017-03-19
    • 1970-01-01
    • 2021-12-27
    • 2020-09-12
    • 2011-02-16
    • 2015-02-02
    • 2018-09-30
    • 2013-05-12
    • 2011-04-27
    相关资源
    最近更新 更多