2012-02-23 22 views
12

Colleghi!Sessioni Failover con PHP-memcache contro memcached

Sto eseguendo php 5.3 (5.3.8) con la libreria client memcache (2.2.6) (http://pecl.php.net/package/memcache) per gestire il server memcached. Il mio obiettivo è quello di avere una soluzione di failover per le sessioni del motore, vale a dire:

  • Solo nativo supporto sessioni PHP (nessun gestori personalizzati)
  • pochi server memcached nel pool

Quello che mi aspetto è che nel caso in cui uno dei server memcached sia inattivo, php tenterà di utilizzare il secondo server nel pool [lo collegherà e diventerà felice], tuttavia quando il primo server memcached nel pool è inattivo sto ricevendo il seguente errore:

Session start failed. Original message: session_start(): Server 10.0.10.111 (tcp 11211) failed with: Connection refused (111) 

mentre impostazioni PHP rilevanti sono:

session.save_handler memcache 
session.save_path tcp://10.0.10.111:11211?persistent=1&weight=1&timeout=1&retry_interval=10, tcp://10.0.10.110:11211?persistent=1&weight=1&timeout=1&retry_interval=10 

e memcache impostazioni (mentre penso che è vicino allo standard) sono:

Directive Local Value 
memcache.allow_failover 1 
memcache.chunk_size 8192 
memcache.default_port 11211 
memcache.default_timeout_ms 1000 
memcache.hash_function crc32 
memcache.hash_strategy standard 
memcache.max_failover_attempts 20 

Memcached ancora in esecuzione sul secondo server e perfettamente accessibile da il server Web:

telnet 10.0.10.110 11211 
Trying 10.0.10.110... 
Connected to 10.0.10.110 (10.0.10.110). 
Escape character is '^]'. 
get aaa 
END 
quit 
Connection closed by foreign host. 

Quindi, in altre parole, invece di interrogare tutto o Se i server elencati si bloccano sequenzialmente dopo un tentativo fallito di connettere il primo server nella coda. Finalmente mi rendo conto che ci sono versioni della libreria client 3.0.x disponibili, tuttavia non sembra troppo affidabile per me dato che è ancora in versione beta.

Si prega di consigli su come ottenere il comportamento desiderato con PHP standard, client lib e server.

Grazie mille!

migliore, Eugene

+0

Sei sicuro che la direttiva session.save_path consente più valori (separati da virgola)? Non ho visto alcun esempio reale che esamina i documenti php. –

+1

@Mike Sicuramente lo fa http://php.net/manual/en/memcached.sessions.php: 'Definisce una virgola separata da hostname: porta le voci da utilizzare per il pool del server di sessione, ad esempio "sess1: 11211, sess2 : 11211" '. – Eugene

+0

Grazie per il link, non ho visto quella pagina, dovrebbe essere almeno referenziato dai documenti di sessione, tipo sepolto sotto memcached. Nell'OP si menziona l'errore; 'Server 10.0.10.111 (tcp 11211) non riuscito', e hai dato l'esempio che puoi telnet in 10.0.10.110, puoi confermare che puoi effettivamente telnet in 10.0.10.111? –

risposta

7

Vorrei ringraziare tutti quelli che hanno partecipato a questa domanda, la risposta è la seguente: in realtà memcache (non Memcache d) come gestore di sessione supporta server separati da virgola come session.save_path, inoltre supporta il failover. L'errore menzionato sopra Session start failed. Original message: session_start(): Server 10.0.10.111 (tcp 11211) failed with: Connection refused (111) aveva solo il 8 ° livello (Avviso).Infatti, il motore ti informa solo del fatto che uno dei server non è disponibile (il che è logico, altrimenti come saprai?) E poi si connette correttamente al secondo server e lo usa.

Quindi tutto il fraintendimento è stato causato da documentazione debole, confusione di memcache/memcached e impostazioni paranoid (E_ALL) del mio gestore di errori personalizzato. Nel frattempo, il problema è stato risolto ignorando indicazioni da rispettare per errore Connection refused (111) nella sessione di stabilire contesto

+0

Ic, quindi il messaggio è stato generato perché il server era effettivamente inattivo, ma poiché l'altro server era funzionante, la gestione della sessione si stava comportando come previsto? –

+0

@Mike, si, esattamente – Eugene

+0

Lol, non mentirò, mi sento stupido per non averlo riconosciuto prima. E per chiarire, questo non è il pooling di connessioni, è ridondanza? –

7

utilizzare l'estensione Memcached. Nota che ci sono due plugin per memcache per PHP. Uno si chiama Memcache, l'altro è chiamato Memcached. Sì, questo è confuso, ma vero comunque.

Il plug-in Memcache supporta quegli URL complessi che stai utilizzando, con l'identificativo del protocollo (tcp) ei parametri (persistenza e così via), mentre il plug-in Memcached supporta i pool di connessione.

La documentazione che si menziona nei commenti sopra (http://www.php.net/manual/en/memcached.sessions.php) riguarda l'estensione Memcached, non quella di Memcache.

Aggiornamento: Alcuni lettura interessante: https://serverfault.com/questions/164350/can-a-pool-of-memcache-daemons-be-used-to-share-sessions-more-efficiently

+0

Ho notato questo anche guardando i documenti, ma secondo i documenti, anche la sua implementazione dovrebbe funzionare. –

+0

Beh, non riesco a trovare nei documenti che i pool di connessione dovrebbero funzionare per il plugin memcache. In realtà non c'è molta documentazione sul gestore di sessione memcache. –

+0

Dai un'occhiata a questi documenti: http://php.net/manual/en/memcached.sessions.php, secondo il funzionario di PHP e i commenti sottostanti, dovrebbe funzionare. –

0

È necessario modificare la strategia di hash

Cambia la tua config per

memcache.hash_strategy consistent 

Quando si effettua l'hash strategia a coerente memcache copia i dati su più server. Se uno dei server è inattivo, tenta di copiarlo alla successiva richiesta.