Подключение к ProxySQL через сокет - «Нет такого файла или каталога» - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь подключиться к ProxySQL из PHP с помощью mysqlnd, используя локальный сокет, но получаю

"Нет такого файла или каталога"

, так каксокета не будет. Тот же код может без проблем подключиться к сокету 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 version mysqlnd 5.0.12-dev - 20150407
ProxySQL version 2.0.6

Есть идеи, почему proxysql.sock не принимается mysqlnd?

ОБНОВЛЕНИЕ: Следуя предложенному ниже @ EternalHour, я также попытался переместить файл proxysql.sock из/ TMP, но, к сожалению, это не имеет значения. Я все еще получаю ту же ошибку.

EDIT (2019-10-08): Оказывается, эта проблема не имеет ничего общего с PHP, так как netcat также выдает ту же проблему, независимо от того, находятся ли файлы сокетов в /tmp или in / var / sockets /:

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

Из 3 узлов кластера ProxySQL, работающих на той же ОС, той же версии ядра, 1 имеет эту проблему, 2 других разрешают подключение к сокетуфайл в /tmp/proxsql.sock, хотя и там, иногда перезапуск ProxySQL приводит к тому, что файл сокета создается как закрытый (например, недоступный для других приложений)

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Извините всех, проблема была смущающей проста - это была просто моя ошибка.

Когда я менял расположение файла сокета в ProxySQL Admin, я использовал следующее

update global_variablesset variable_value = '0.0.0.0: 6033; /tmp/proxysql.sock', где variable_name = 'mysql-interfaces';СОХРАНИТЕ MYSQL ПЕРЕМЕННЫЕ НА ДИСК;

Да, это пробел в конце "/tmp/proxysql.sock". Когда я менял его в другое место, я переписывал только первую половину этого (папку), но не имя файла, поэтому я просто копирую пространство и, следовательно, всегда получаю файл или каталог, не найденный ...

Проблема решена!

К сожалению об этом

0 голосов
/ 08 октября 2019

Многие клиенты MySQL имеют специальную обработку слова localhost. localhost не означает «использовать распознаватель для разрешения localhost и подключения через TCP», но «использовать сокет домена unix на пути по умолчанию», чтобы использовать TCP вместо 127.0.0.1. Если proxySQL также предоставляет сокет домена unix, укажите этот путь.

...