2012-11-18 19 views
5

Sto provando a configurare l'estensione PHPmysqlnd_ms e sto riscontrando alcuni problemi. Finora qui è quello che ho fatto:Problema per ottenere la divisione di lettura/scrittura per lavorare con PHP mysqlnd_ms

-compiled PHP from source while enabling mysqlnd

installato dal mysqlnd_ms (Se corro pecl info mysqlnd_ms io ottenere le informazioni sul plugin mysqlnd_ms):

$ sudo pecl install mysqlnd_ms 

-Modified PHP.ini (e riavviato dopo):

mysqlnd_ms.enable=1 
mysqlnd_ms.disable_rw_split=0 ; for good measure 
mysqlnd_ms.config_file=mysqlnd_ms_config.ini 

-Creato.210 con i seguenti contenuti (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:

Il plugin esegue sola lettura dichiarazioni sui configurate MySQL schiavi, e tutte le altre query sul master MySQL. Dichiarazioni sono considerati lettura solo se entrambi iniziano con SELECT, il suggerimento SQL /ms = Slave/o se uno slave fosse stata selezionata per l'esecuzione del precedente query e la query inizia con il suggerimento SQL/ms = last_used /. In tutti gli altri casi , la query verrà inviato al master replica di MySQL server di

Quindi a questo punto mi aspetto i miei SELECT dichiarazioni da inviare alle dichiarazioni slave e altri (come ad esempio UPDATE) a essere inviato allo master.

ho scritto un piccolo script per verificare l'installazione:

$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"; 

Le query vengono eseguite correttamente MA sono tutti inviati al slave (so che questo perché se intercettare il traffico con $ tcpdump -ni any port 3306 I non vedo nulla, mentre se faccio query manuali su 3306 si visualizzano in tcpdump).

L'utilizzo di commenti come /*ms=slave*/ e /*ms=master*/ non fa alcuna differenza. Il general_log fa mostrano che non v'è alcun altro commento che potrebbero confondere 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 

Ho provato ad utilizzare un non-loopback IP (come il mio 10.0.0.56 quello locale) per connessione "forza" attraverso la rete, ma non fa differenza.

$pdo->getAttribute(PDO::ATTR_CLIENT_VERSION) mi sta dando "mysqlnd 5.0.10 - 20111026 - $Id: b0b3b15c693b7f6aeb3aa66b646fee339f175e39 che mostra mysqlnd viene utilizzato.

Cosa mi manca per consentire la suddivisione in lettura/scrittura (qualsiasi suggerimento è benvenuto)?

Aggiornamento:
ho trovato un modo migliore di tcpdump per verificare se read/write spaccatura sta lavorando:

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 
) 

risposta

6

Per favore, assicuratevi di fare riferimento alla/mysqlnd_ms sezione relativa alla documentazione PECL che definisce i server quando cercando di stabilire la connessione. Dovresti passare il nome della sezione - "myapp" nel tuo esempio - come host per la funzione connect dell'API MySQL PHP che desideri utilizzare. Qualcosa di simile a questo:

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

Oppure, nel tuo caso qualcosa come:

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

Non usare:

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

Ciò si connetterà al molto server che è in ascolto sul socket $ presa.

+0

PDO non è felice con esso poiché tenta di risolvere 'myapp' come se fosse un nome host (' PDO :: __ construct(): php_network_getaddresses: getaddrinfo non riuscito: nome o servizio non noto'). 'ini_get' mi fornisce le impostazioni che ho menzionato sopra con il loro valore corretto, incluso il file di configurazione che contiene la chiave' myapp' come mostrato sopra. – Max

+1

In realtà funziona :) Ho avuto un problema con il file di configurazione ('Sconosciuto: (mysqlnd_ms) Impossibile aprire il file di configurazione dell'elenco dei server [mysqlnd_ms_config.ini] in Unknown on line 0'). Risolto il problema e ora funziona. – Max