7

Suppongo di avere una webapp in esecuzione su un certo numero di server EC2 con carico bilanciato, che memorizzano e recuperano metadati da SimpleDB con blocchi di dati più grandi memorizzati su S3 (a causa dell'intera limitazione di 1 KB di SimpleDB). Dato che S3 ha una latenza piuttosto elevata e non voglio fare un sacco di richieste laggiù, voglio un livello di cache per le informazioni ... inserisci ElastiCache.In che modo un'app su EC2 individua automaticamente le istanze di ElastiCache?

Ok, quindi eseguo il provisioning di un server ElastiCache con endpoint X, quindi eseguo l'hardcode X nella mia app su EC2 e funziona felicemente fino a quando ottengo qualche centinaio di nuovi utenti e all'improvviso il mio server cache è tristemente sottodimensionato per la domanda . Fortunatamente posso solo avviare alcuni nuovi server cache più grandi ... ma poi mi rendo conto di avere endpoint X, Y e Z e la mia app sa solo provare X, quindi ho ancora un problema.

Quindi adesso sto solo cercando di mettere la mia testa intorno ai vari pezzi di questo puzzle, e non ho ancora ottenuto la parte di codifica, ma non sarà un problema? Ho letto la documentazione di ElastiCache e menziona che si tratta di un cluster di cache, ma ogni server nel cluster sembra avere un proprio endpoint. Esiste un modo per un'app in esecuzione su EC2 per conoscere tutti i server cache in esecuzione e più al punto in cui si contengono i dati per una particolare chiave? È possibile chiedere al cluster nel suo insieme di archiviare o recuperare un'informazione?

+0

dubito che conta molto per la risposta di questa domanda, ma per qualunque sia la sua pena il mio EC2 l'app sarà più che probabile in PHP. –

+0

Ho notato una richiesta di funzionalità lungo le stesse linee su https://forums.aws.amazon.com/thread.jspa?threadID=74852, quindi sfortunatamente sembra che avere un file di configurazione con gli endpoint della cache in esso riguardi tutti voi può fare per ora. –

risposta

0

Se l'app è distribuita da versioncontrol (spero lo sia), basta modificare il file di configurazione e ridistribuire l'applicazione. Non vedo un grosso problema con questo approccio, ma forse mi manca l'ovvio.

Fammi sapere.

+2

Speravo che esistesse un meccanismo elasticache per presentare il cluster di cache all'applicazione come se fosse un singolo server. non doversi preoccupare di quale endpoint colpire per una particolare chiave, non doversi preoccupare della configurazione della cache quando si gira o chiude un nodo della cache, ecc. Sembrerebbe che una cosa del genere non esista ancora. –

+0

Non è così. Generalmente, l'ElastiCache di AWS fornisce i nodi. Come vengono utilizzati quei nodi (ad esempio li usi tutti come un negozio gigante, o ti rispecchi, ecc.) Dipende da te. Questo è esattamente come funziona memcache. Probabilmente puoi racchiudere la tua scoperta in una chiamata API periodica, ma non la consiglierei. Re-deploy per questi cambiamenti. – Till

+0

Non metterei la magia estesa su questo. Per esempio. solo l'aggiunta di un nodo di solito non è una buona idea o qualcosa che la tua applicazione può probabilmente affrontare. Per esempio.quando aggiungo un altro nodo al nostro cluster ElasticCache, devo riequilibrare il cluster di cache per così dire. Di solito, è più facile aggiungerlo alla configurazione, regolare le impostazioni per ext/memcache (usiamo PHP) e quindi partire da zero svuotando la cache e facendola ri-popolare. – Till

0

Amazon's Elasticache Autodiscovery è assolutamente orribile. È praticamente impossibile da installare, il che è pazzesco perché dovrebbe essere molto semplice.

Ho scritto una semplice funzione in PHP per generare un URL del nodo elasticache in base al numero di nodi in esecuzione. Sì, devi aggiornare il tuo codice se cambi il numero di nodi (o forse metti questo valore in un env var).

Esso mappa gli stessi tasti per gli stessi nodi:

function get_elasticache_node_url($key, $config_url, $num_nodes) { 
    $node = hexdec(substr(md5($key), 0, 15)) % $num_nodes + 1; 
    $nodestr = str_pad($node, 4, "0", STR_PAD_LEFT); 
    return str_replace('.cfg.','.'.$nodestr.'.',$config_url); 
} 

$num_nodes = 10; 
$config_url = 'cluster-name.xyzxyz.cfg.use1.cache.amazonaws.com'; 

echo get_elasticache_node_url("key1", $config_url, $num_nodes); 
echo get_elasticache_node_url("key2", $config_url, $num_nodes); 

uscita:

cluster-name.xyzxyz.0001.use1.cache.amazonaws.com 
cluster-name.xyzxyz.0004.use1.cache.amazonaws.com