2016-05-31 8 views
1

Ich benutze StackExchange.Redis, um mit einem Paar Redis-Server, einem Master und einem Slave zu sprechen. Wenn ich den Master nicht bestehe, kann ich dem Slave nicht schreiben.Wie schreibe ich mit StackExchange.Redis in einen Slave?

Ich habe IServer.AllowSlaveWrites Satz zu true, und ich habe die slave-read-only Konfigurationseinstellung auf beiden Servern zu no gesetzt. (Bestätigt durch INFO.)

Wenn der Master ist nach wie vor in dem Server-Pool des Kunden (aber offline), erhalte ich:

RedisConnectionException: SocketFailure on <master_ip>/Subscription 

Wenn ich den Master nehme ganz aus dem Server-Pool, die ich erhalte:

Im ersten Fall scheint es zu versuchen, mit dem Master zu sprechen und auf Fehler zu verzichten. In der zweiten spricht es mit dem Slave, kann aber keine Schreiboperationen ausführen.

Wie kann ich meinen Client dazu bringen, auf einen Slave-Server zu schreiben, ohne dass ein Master vorhanden ist?

(Siehe auch How does StackExchange.Redis use multiple endpoints and connections?)

Antwort

1

Es stellt sich die Bibliothek aus fest einprogrammiert wird keine Schreiboperationen zu Sklaven ermöglichen.

im Konstruktor Message (Message.cs, Linie 170), gibt es den folgenden Code:

bool masterOnly = IsMasterOnly(command); 
if (masterOnly) SetMasterOnly(); 

IsMasterOnly() kehrt true für alle Befehle schreiben. SetMasterOnly() überschreibt alle Master/Slave-Flags, die der Benutzer für CommandFlags.DemandMaster angegeben hat. Wenn das System versucht, auf einen Slave zu schreiben, löst dieses Flag den oben angegebenen Wert RedisConnectionException aus.

ich bin nicht sicher, warum dieser hartkodierte Überschreibung da drin ist, als AllowSlaveWrites Flagge und die slave_read_only Config Wert vor versehentlichem Slave schreibt schützen bereits (WriteMessageToServer() sehen).

In jedem Fall scheint das Entfernen dieser Zeilen aus Message.cs die erwartete Operation zu ermöglichen.

0

Ich hatte vor kurzem ein ähnliches Problem. Hier ist, wie ich es fest:

IConnectionMultiplexer con = ConnectionMultiplexer.Connect("127.0.0.1:6379"); 
IDatabase db = con.GetDatabase(); 
db.Execute("ZINTERSTORE", key, 2, first, second, "WEIGHTS", 0, 1); 

Wie Sie oben db.Execute Methode sehen kann, würde den Trick tun.

Verwandte Themen