2013-07-02 10 views
6

In base ai messaggi di commit git, ServiceStack ha recentemente aggiunto il supporto per il failover. Inizialmente pensavo che questo significasse che potevo tirare giù una delle mie istanze di Redis, e il mio gestore clienti in pool gestiva il failover in modo elegante e prova a connettermi con una delle mie istanze Redis alternative. Sfortunatamente, il mio codice è appena uscito dagli errori e dice che non può connettersi con l'istanza iniziale di Redis.Come funziona il failover di ServiceStack PooledRedisClientManager?

Attualmente sto eseguendo istanze di Redis 2.6.12 su un Windows, con il master sulla porta 6379 e uno slave su 6380, con le sentinelle configurate per promuovere automaticamente lo slave su un master se il master va giù. Attualmente sto istanziare il gestore clienti in questo modo: gli host

PooledRedisClientManager pooledClientManager = 
    new PooledRedisClientManager(new string[1] { "localhost:6379"}, 
     new string[1] {"localhost:6380"}); 

in cui il primo array viene letto-scrittura (per il master), e la seconda serie è di sola lettura ospiti (per lo slave).

Quando termino il master sulla porta 6379, le sentinelle promuovono lo slave su un master. Ora, quando provo a eseguire il mio codice C#, invece di fallire sulla porta 6380, si interrompe semplicemente e restituisce l'errore "Impossibile connettersi a Redis Instance su localhost: 6379".

C'è un modo per aggirare questo, o il failover semplicemente non funzionerà nel modo in cui lo voglio?

+1

Hai trovato un modo @Vliu – jaxxbo

+0

No, dalla maggior parte della ricerca che ho fatto, la maggior parte delle persone non si affida al codice per gestire il failover. Usano un livello proxy (linux) sul database redis come HAProxy @jaxxbo – Vliu

risposta

4

PooledRedisClientManager.FailoverTo consente di ripristinare quali sono gli host di lettura/scrittura, vs host di sola lettura e riavviare il factory. Ciò consente una transizione rapida senza la necessità di ricreare i client.

+1

Come un tentativo {// operazione redis} catch {PooledRedisClientManager.FailoverTo (porta slave come porta di lettura-scrittura)}? – Vliu

+1

Quello sarebbe un modo per farlo, sì. Ho impostato un servizio speciale per gestire le richieste in arrivo da Redis Sentinel, in questo modo se ha rilevato un nodo guasto avrebbe negoziato e promosso lo slave appropriato, quindi notificato i miei servizi web del nuovo indirizzo e porta. – TheDruidsKeeper

+0

Ciao @TheDruidsKeeper, potresti approfondire il tuo approccio con alcuni esempi, ad esempio, che servizio intendi e in che modo rileva esattamente un nodo non funzionante, lo apprezzo molto. – wliao

Problemi correlati