Domanda

Come si fa a gestire la sostituzione / aggiunta / rimozione di nodi memcached nelle applicazioni di produzione? Avrò una serie di applicazioni che vengono clonati e personalizzato a causa di ogni cliente bisogno in esecuzione su un server web e lo stesso, quindi mi immagino che ci sarà un giorno in cui alcuni dei nodi sarà cambiato.

Ecco come memcached è popolata da normale:

$m = new Memcached();

$servers = array(
    array('mem1.domain.com', 11211, 33),
    array('mem2.domain.com', 11211, 67)
);
$m->addServers($servers);

La mia idea iniziale, è quello di rendere l'array $ server per essere popolato dal database, anche nella cache, ma basata su file, fatto una volta al giorno o qualcosa del genere, con la possibilità di forzare un aggiornamento sulla prossima corsa della funzione che detiene la chiamata $ addservers. Tuttavia, sto indovinando che questo potrebbe aggiungere un po 'sovraccarico aggiuntivo in quanto i dischi sono di stoccaggio abbastanza lento ...

Cosa ne pensi?

È stato utile?

Soluzione

E 'sempre meglio per definire cose del genere nel sorgente. Certo, si potrebbe usare parse_ini_file() o qualcosa di simile per leggere un file di configurazione. In realtà, però, appartiene alla sorgente. Ma se definita in un file INI, non ci sono molti problemi di sicurezza come l'iniezione di codice e simili al contrario di definire le voci in PHP.

Dato che ci sono alcune applicazioni che potrebbero leggere lo stesso file INI, si può mettere in una posizione comune che tutte le applicazioni hanno accesso a (utilizzando le autorizzazioni di gruppo, per esempio). Effettivamente facendo, che non è davvero consigliato.

Altri suggerimenti

Usa un file di configurazione - se la sua da parse_ini_file o qualche altro schema di configurazione di analisi. Se siete preoccupati per il tempo di analisi, si potrebbe mettere quei file di configurazione nel percorso php carico ini http://brian.moonspot.net/using-ini-files-for-php-application-settings - questo pre-analizza tutti i VaR è necessario, ma avrete bisogno di riavviare Apache per caricare eventuali modifiche.

Una volta che i file sono leggere abbastanza (a patto che non avete troppa dibatteva sulla vostra macchina) il file di configurazione sarà nella memoria cache mappata in ogni caso, così sarà veramente veloce. È possibile ottimizzare utilizzando il modulo serializzato PHP che carichi veloce, e anche ottimizzare ulteriormente utilizzando la cache utente APC.

Infine, utilizzare le più recenti librerie client memcache -. Usano gli algoritmi di hashing coerente ora, e vi aiuterà l'aggiunta / rimozione di singoli server

A seconda delle esigenze userei una lista che supporta la funzione di sfratto dopo qualche TTL (modalità passiva) o una sorta di modello di chi ascolta, se si desidera che questo sia aggiornato immediatamente (modalità attiva). Ovunque si mantiene la fonte primaria (le proprietà del file, database, ecc) non è davvero importante fintanto che è raggiungibile in caso di necessità e il vostro TTL è abbastanza grande (come lei ha ricordato nel tuo commento).

Per approccio passivo si potrebbe usare il riutilizzo qualche altra libreria caching locale che supporta TTL (ad esempio EHCache in Java), mettendo il vostro elenco di server nella cache sotto qualche chiave nota. Per approccio attivo, per esempio, Java ha java.util.EventListener. E '(ONU) per fortuna molti anni da quando ho fatto nulla in PHP, quindi non in grado di consigliare su questo.

Vi consiglio caldamente di non mettere i dati di configurazione nel codice. Nel mondo che sto vivendo hardcoding è un peccato grave.

Si potrebbe anche voler dare un'occhiata alla come last.fm sta usando coerente hashing algoritmo per essere in grado di aggiungere / rimuovere i server da / per la piscina memcached senza causare rimappare completa di tutte le chiavi.

Per quanto mi udnerstood, la preoccupazione principale è come memorizzare nella cache la configurazione mantenendolo per lo più up-to-date quando cambia.

Bene, l'opzione migliore qui è, ovviamente, la memorizzazione in un database e rinfrescante da DB, per esempio, ogni 15 secondi. Avendo grande carico sulla domanda, interrogando il DB, una volta a 15 secondi non cambierà nulla. Caricare i dati da DB in sé è abbastanza veloce come è necessario solo un paio di campi.

Un'altra opzione che potrebbe funzionare qui - utilizzano un separato memcached :) Scherzi a parte, solo in cache la configurazione caricata da DB lì, spurgo che chiave di cache on aggiornamento della configurazione.

Per riassumere: qualsiasi schema di scadenza in base al tempo avrebbe funzionato. La soluzione più semplice - a mantenere sul proprio (negozio volta lo scorso aggiornamento e verificare su ogni chiamata di funzione); un po 'più avanzato -. uso qualcosa come memcached

Aggiorna : DB è la soluzione migliore in quanto scale abbastanza bene:. Non c'è bisogno di copiare file di configurazione in 20 server su ogni aggiornamento di configurazione

  • Utilizzare un localizzatore di servizio come - https://www.consul.io/ . Aggiungere o rimuovere e servizi i consumatori a ottenere informazioni di servizio da console in tempo reale.
  • Se console rende più overhead di gestione di un nuovo pezzo di software, spostare le informazioni in una configurazione centralizzata. Sulla aggiornamento ricaricare i gli eventi di aggiornamento di configurazione o di innesco. I consumatori ascoltano per gli eventi e aggiornare le informazioni.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top