Domanda

Sto creando un'applicazione con più server coinvolti. (4 server in cui ognuno ha un database e un server web. 1 database master e 3 slave + un bilanciamento del carico)

Esistono diversi approcci per abilitare la memorizzazione nella cache. Al momento è abbastanza semplice e per nulla efficiente. Tutta la memorizzazione nella cache viene eseguita su una condivisione di partizione NFS tra tutti i server. NFS è il collo di bottiglia nell'architettura.

  1. Ho implementato diverse idee caching. Può essere fatto su un server livello (file system locale) ma il il problema è invalidare una cache file quando il contenuto è stato aggiornamento su tutti i server: può essere fatto avendo una piccola cache vita (non efficiente perché il la cache verrà aggiornata prima dovrebbe essere il più delle volte)
  2. Può anche essere fatto da un messaggio sistema (ad esempio XMPP) dove ciascuno il server comunica tra loro. Il server responsabile per invalida della cache inviare a chiedere a tutti gli altri di lasciarli sapere che la cache è stata invalidata. La latenza è probabilmente più grande (prendi più tempo per tutti per sapere che la cache è stata invalidato) ma la mia domanda non richiede cache atomica invalidazione.
  3. Il terzo approccio consiste nell'utilizzare un cloud sistema per memorizzare la cache (come CouchDB) ma non ho idea di prestazioni per questo. È più veloce dell'utilizzo di un database SQL?

Ho pianificato di usare Zend Framework ma non credo sia davvero rilevante (tranne che probabilmente esiste un pacchetto in altri Framework per gestire XMPP, CouchDB)

Requisiti: cache persistente (se un server viene riavviato, la cache non deve essere persa per evitare di arrestare il server durante la ricostruzione della cache)

È stato utile?

Soluzione 2

Penso di aver trovato una soluzione relativamente buona.

Uso Zend_Cache per archiviare localmente ogni file di cache. Ho creato un piccolo demone basato su nanoserver che gestisce anche i file cache localmente. Quando un server crea / modifica / elimina un file cache localmente, invia la stessa azione a tutti i server attraverso il demone che esegue la stessa azione.

Ciò significa che ho file di memorizzazione nella cache locale e azioni remote allo stesso tempo. Probabilmente non perfetto, ma dovrebbe funzionare per ora. CouchDB era troppo lento e NFS non è abbastanza affidabile.

Altri suggerimenti

http://www.danga.com/memcached/

Memcached copre la maggior parte dei requisiti che imposti: lettura, commit e invalidamento basati sui messaggi. Elevata disponibilità e alta velocità, ma scarsa affidabilità atomica (sacrificata per le prestazioni).

(Inoltre, memcached alimenta cose come YouTube, Wikipedia, Facebook, quindi penso che sia abbastanza consolidato che le organizzazioni con il tempo, i soldi e il talento per valutare seriamente molte opzioni di cache distribuite si accontentano di memcached!)

Modifica (in risposta al commento) L'idea di una cache è che sia relativamente transitoria rispetto al tuo archivio di backup. Se è necessario conservare i dati della cache a lungo termine, si consiglia di esaminare (a) la denormalizzazione del livello dati per ottenere maggiori prestazioni o (b) l'aggiunta di un server di database di livello intermedio che memorizza i dati di volume elevato in chiave diretta- tabelle di coppie di valori o qualcosa di simile a questo.

A difesa di memcached come archivio cache, se si desidera un alto rendimento con un basso impatto del riavvio di un server, perché non avere solo 4 server memcached? O 8? Ogni "riavvio" avrebbe di conseguenza meno effetti sul server di database.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top