2012-11-18 11 views
5

Próbuję skonfigurować rozszerzenie PHPmysqlnd_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 
) 

Odpowiedz

6

Proszę, upewnij się, aby odwołać/mysqlnd_ms sekcję dokumentacji PECL definiującą serwery, gdy próbuje ustanowić połączenie. Powinieneś przekazać nazwę sekcji - "myapp" w twoim przykładzie - jako host do funkcji connect z PHP MySQL API, którego chcesz użyć. Coś takiego:

$pdo = new PDO('mysql:host=myapp;dbname=database', 'username', 'password'); 

Lub, w przypadku gdy coś podobnego:

$mysql = new PDO("mysql:host=myapp;dbname=$dbname", $user, $pass); 

Nie stosować:

$mysql = new PDO("mysql:unix_socket=$socket;dbname=$dbname", $user, $pass); 

ten połączy się z samym serwerze, który nasłuchuje na gnieździe $ socket.

+0

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

+1

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