Я следовал этому уроку http://www.clusterdb.com/mysql-cluster/creating-a-simple-cluster-on-a-single-linux-host используя эту загрузку с сайта mysql: mysql-cluster-gpl-7.3.10-linux-glibc2.5-x86_64.tar.gz
У меня есть это и работает на коробке Ubuntu 14.04LTS, что означает, что я могу войти в MySQL кластер с помощью терминала на каждом порту, чтобы подтвердить, что он работает хорошо. Просто не удается подключиться из тестового сценария PHP к mysql-кластеру из-за вышеуказанной ошибки PHP, когда я пытаюсь подключиться к нему с помощью /etc/mysqlnd_ms_cfg.ini. Потратил целый день на поиск в интернете, не решая эту проблему, поэтому любая помощь очень ценится.
Запуск www.test.loc / test.php приводит к ошибке:
$pdo = new PDO("mysql:host=myapp;dbname=test", "root", "");
printf("[%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
$result = $pdo->query("select * from assets");
var_dump($result->fetchAll());
die();
Принимая во внимание, что это работает www.test.loc / test.php:
$pdo = new PDO("mysql:unix_socket=/tmp/my.1.sock;dbname=test", "root", "");
printf("[%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
$result = $pdo->query("select * from assets");
var_dump($result->fetchAll());
die();
Что подтверждает, что подключение к одному из узлов работает, так как возвращает результат строки.
Просто таким образом мы не используем mysqlnd_ms_cfg.ini, который бы загружал баланс другому мастеру в циклическом порядке.
Если я заменил ключ «myapp» на что-то другое в /etc/mysqlnd_ms_cfg.ini, я получу еще одну ошибку, сообщающую, что php не найдет файл, что будет означать, что путь к файлу правильный. Также проверил формат JSON для опечаток, но в соответствии с https://jsonformatter.curiousconcept.com/ это действительно.
Окружение:
/etc/mysqlnd_ms_cfg.ini
{
"myapp": {
"master": {
"master_1": {
"host": "localhost",
"db": "test",
"user": "root",
"password": "",
"port": "3306",
"socket": "\/tmp\/my.1.sock"},
"master_2": {
"host": "127.0.0.1",
"db": "test",
"user": "root",
"password": "",
"port": "3307"},
"master_3": {
"host": "127.0.0.1",
"db": "test",
"user": "root",
"password": "",
"port": "3308"}
},
"slave": {
},
"filters": {
"roundrobin": []
},
"failover": {
"strategy": "loop_before_master",
"remember_failed": true
}
}
}
Установленный php5-mysqlnd:
sudo apt-get install php5-mysqlnd
Добавил настройки в 10-mysqlnd.ini и перезагрузил apache2:
; configuration for php MySQL module
; priority=10
extension=mysqlnd.so
mysqlnd_ms.enable=1
mysqlnd_ms.force_config_usage=1
mysqlnd_ms.config_file=/etc/mysqlnd_ms_cfg.ini
;mysqlnd_ms.ini_file=/etc/mysqlnd_ms_cfg.ini
;Disabling built-in read-write splitting.
mysqlnd_ms.disable_rw_split=1
;Configure masters only.
;mysqlnd_ms.multi_master=1
Вывод PHPINFO: здесь проверено phpinfo () и весь раздел о mysqlnd:
Содержимое моего файла hosts / etc / hosts:
127.0.0.1 localhost
127.0.1.1 dev-pc
127.0.0.1 www.test.loc
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
В вашем вопросе много несоответствующей информации.
Это не имеет ничего общего с кластеризацией.
Это не имеет ничего общего с PHP.
Это не имеет ничего общего с MySQL.
Важные биты:
new PDO("mysql:host=myapp;dbname=test", "root", "");
а также
$pdo = new PDO("mysql:unix_socket=/tmp/my.1.sock;dbname=test", "root", "");
а также
mysqlnd php_network_getaddresses: getaddrinfo failed: No such host is known
а также
127.0.0.1 localhost
127.0.1.1 dev-pc
127.0.0.1 www.test.loc
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
В вашем файле hosts нет записи для «myapp» (имя хоста используется в первой строке подключения выше). Измените это на 127.0.0.1 или один из псевдонимов, которые вы определили Другой чем localhost, и он должен работать как вы ожидаете (при условии, что это не просто скрывает дальнейшие проблемы конфигурации в другом месте).
Других решений пока нет …