Próbuję skonfigurować rozszerzenie PHP
mysqlnd_ms
i mam pewne problemy. Dotychczas tutaj jest to, co mam zrobić:Problem z dzieleniem odczytu/zapisu do pracy z PHP mysqlnd_ms
- compiled PHP from source while enabling mysqlnd
Zainstalowane mysqlnd_ms
(Jeśli biegnę pecl info mysqlnd_ms
Mam uzyskać informacje o wtyczce mysqlnd_ms
):
$ sudo pecl install mysqlnd_ms
modyfikowany PHP.ini
(i ponownie go uruchomiono):
mysqlnd_ms.enable=1
mysqlnd_ms.disable_rw_split=0 ; for good measure
mysqlnd_ms.config_file=mysqlnd_ms_config.ini
-obudowana mysqlnd_ms_config.ini
z następujących treści (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:
Wtyczka wykonuje tylko do odczytu oświadczenia o skonfigurowanych MySQL niewolników i wszystkie inne pytania dotyczące pana MySQL. Oświadczenia są uważane tylko do odczytu, czy też zacząć Select, podpowiedzi SQL /MS = Slave/lub jeśli niewolnik został wybrany do prowadzenia poprzedniego zapytanie a zapytanie zaczyna z nutą SQL/ms = last_used /. We wszystkich innych przypadkach , zapytanie zostanie wysłane do replikacji MySQL mistrza serwerze
Więc w tym momencie Czekam moje SELECT
oświadczenia mają być wysłane do slave
i innych sprawozdań (np UPDATE
) do wysłane do master
.
napisałem mały skrypt, aby przetestować konfigurację:
$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";
Zapytania są prawidłowo wykonane BUT wszystkie są wysyłane do slave
(wiem to, bo jeśli ja powąchać ruchu z $ tcpdump -ni any port 3306
I nic nie widzę, natomiast jeśli wykonuję ręczne zapytania na 3306
, pojawiają się one w tcpdump
).
Używanie komentarzy, takich jak /*ms=slave*/
i /*ms=master*/
, nie ma znaczenia. general_log
ma pokazać, że nie ma żadnych innych uwag, które mogłyby mylić mysqlns_ms
:
121118 19:14:40 36 Connect [email protected] on mysqlnsmstest
36 Query /*ms=slave*/SELECT * FROM mytable
36 Query /*ms=master*/UPDATE mytable SET field='test' WHERE id=2
36 Quit
Próbowałem przy użyciu non-sprzężenia zwrotnego IP
(takich jak mój 10.0.0.56
lokalnym jeden) do „siła” Połączenie przez sieć, ale to nie robi różnicy.
$pdo->getAttribute(PDO::ATTR_CLIENT_VERSION)
podaje mi "mysqlnd 5.0.10 - 20111026 - $Id: b0b3b15c693b7f6aeb3aa66b646fee339f175e39
, który pokazuje mysqlnd
jest używany.
Czego mi brakuje, aby podział na czytanie/zapis działał (jakakolwiek sugestia z zadowoleniem)?
Aktualizacja:
znalazłem lepszy sposób niż tcpdump, aby sprawdzić, czy read/write
Podział pracuje:
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
)
PDO nie jest zadowolony z tego, jak to próbuje rozwiązać 'myapp' jakby to była nazwa hosta (' PDO :: __ construct(): php_network_getaddresses: getaddrinfo nie powiodło się: Nazwa lub usługa nie known'). 'ini_get' daje mi ustawienia, o których wspomniałem powyżej, z ich poprawną wartością, w tym plik konfiguracyjny, który zawiera klawisz' myapp', jak pokazano powyżej. – Max
To faktycznie działa :) Miałem problem z plikiem konfiguracyjnym ('Unknown: (mysqlnd_ms) Nie powiodło się otwarcie pliku konfiguracyjnego listy serwerów [mysqlnd_ms_config.ini] w Unknown w linii 0'). Naprawiono i teraz działa. – Max