2013-07-02 8 views
6

Entsprechend den Git-Commit-Nachrichten hat ServiceStack kürzlich die Failover-Unterstützung hinzugefügt. Ich nahm zunächst an, dass dies bedeutete, dass ich eine meiner Redis-Instanzen herunterziehen konnte, und mein gepoolter Client-Manager würde das Failover elegant handhaben und versuchen, mich mit einer meiner alternativen Redis-Instanzen zu verbinden. Leider kommt mein Code nur fehl und sagt, dass er sich nicht mit der ursprünglichen Redis-Instanz verbinden kann.Wie funktioniert ServiceStack PooledRedisClientManager Failover?

Ich führe derzeit Instanzen von Redis 2.6.12 auf einem Windows, mit dem Master bei Port 6379 und einem Slave bei 6380, mit Sentinels eingerichtet, um automatisch den Slave zu einem Master zu fördern, wenn der Master ausfällt. Ich Instanziierung zur Zeit meiner Client-Manager wie folgen aus:

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

, wo das erste Array wird Lese-Schreib-Hosts (für den Master) und das zweite Array sind schreibgeschützt Hosts (für den Slave).

Wenn ich den Master an Port 6379 beende, befördern die Sentinels den Slave zu einem Master. Wenn ich nun versuche, meinen C# -Code auszuführen, bricht er einfach ab und gibt den Fehler "Verbindung zu Redis-Instanz bei localhost: 6379 kann nicht hergestellt werden" zurück.

Gibt es einen Weg, oder funktioniert Failover einfach nicht so, wie ich es möchte?

+1

Haben Sie einen Weg gefunden @Vliu – jaxxbo

+0

Nein, von den meisten der Forschung, die ich getan habe, verlassen sich die meisten Menschen nicht auf den Code, um Failover zu behandeln. Sie verwenden einen (Linux) Proxy-Layer über die Redis-Datenbank wie HAProxy @jaxxbo – Vliu

Antwort

4

PooledRedisClientManager.FailoverTo können Sie zurücksetzen, welche die Lese-/Schreib-Hosts sind, vs Readonly-Hosts, und die Factory neu starten. Dies ermöglicht einen schnellen Übergang, ohne dass Clients neu erstellt werden müssen.

+1

Wie ein Versuch {// redis-operation} catch {PooledRedisClientManager.FailoverTo (Slave-Port als Lese-Schreib-Port)}? – Vliu

+1

Das wäre ein Weg, es zu tun, ja. Ich habe einen speziellen Dienst eingerichtet, um eingehende Anfragen von Redis Sentinel zu behandeln. Wenn ein fehlgeschlagener Knoten gefunden wird, würde er den richtigen Slave aushandeln und befördern und dann meine Webservices über die neue Adresse und den neuen Port informieren. – TheDruidsKeeper

+0

Hallo @TheDruidsKeeper, würdest du mehr über deine Vorgehensweise mit einigen Beispielen erfahren, zum Beispiel, welchen Service du meinst und wie genau er einen ausgefallenen Knoten erkennt, sehr zu schätzen wissen. – wliao