Sto provando a configurare l'estensione PHP
mysqlnd_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
)
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
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