2015-03-25 19 views
12

Jak wyjaśniono w StackExchange.Redis Basics documentation, można połączyć się z wieloma serwerami Redis, a StackExchange.Redis automatycznie określi konfigurację master/slave. Cytując odpowiednią część:W jaki sposób StackExchange.Redis używa wielu punktów końcowych i połączeń?

Bardziej skomplikowany scenariusz może wymagać konfiguracji master/slave; dla tego zastosowania, należy określić wszystkie żądane węzły, które tworzą ten logiczny Redis Poziom (zostanie ona automatycznie zidentyfikować Master):

ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("server1:6379,server2:6379"); 

Przeprowadziłem test, w którym uruchamiany jest przełączanie awaryjne, tak że mistrz zejdzie na chwilę, powodując, że stary niewolnik stanie się nowym panem, a stary pan stanie się nowym niewolnikiem. Zauważyłem, że pomimo tej zmiany, StackExchange.Redis wysyła polecenia do starego mistrza, powodując niepowodzenie operacji zapisu.

Pytania dotyczące powyższego:

  1. Jak StackExchange.Redis zdecydować, który punkt końcowy w użyciu?
  2. Jak korzystać z wielu punktów końcowych (jak w powyższym przykładzie)?

Zauważyłem również, że dla każdego łączenia, StackExchange.Redis otwiera dwa połączeń fizycznych, z których jedna jest pewnego rodzaju abonamentu. Do czego dokładnie to służy? Czy jest używany przez instancje Sentinel?

Odpowiedz

3

Co się stanie powinno być się zdarza, że ​​używa wielu rzeczy (w szczególności zdefiniowanej konfiguracji replikacji) do określenia, który jest głównym i bezpośrednim ruchem na odpowiednim serwerze (z uwzględnieniem parametru "serwer", który domyślnie do "preferuj master", ale który zawsze wysyła operacje zapisu do mastera).

Jeśli otrzymasz błąd "nie można zapisać do urządzenia podrzędnego" (nie pamiętam dokładnego tekstu), spróbuję przywrócić konfigurację, a powinien automatycznie przełączać się na, aby to uszanować. Niestety redis nie nadaje zmian konfiguracji, więc biblioteka nie może tego wykryć z wyprzedzeniem.

Należy pamiętać, że jeśli używasz metod biblioteki do zmiany wzorca, to może wykorzystać pub/sub, aby wykryć tę zmianę natychmiast i automatycznie.

Po drugie połączenie: to byłoby dla pub/sub; obraca to z wyprzedzeniem, ponieważ domyślnie próbuje wykryć transmisje konfiguracji specyficzne dla biblioteki.

+1

Dzięki za odpowiedź. Nie jestem pewien, czy podążam ... co masz na myśli, mówiąc o metodach bibliotecznych, aby zmienić konfigurację specyficzną dla master/library? Ponadto, kiedy spowodowałem przełączenie awaryjne master/slave, faktycznie czekałem kilka sekund i kilka razy próbowałem wysłać SET ponownie i zawsze wysyłałem go do starego master. – Gigi

+1

@Gigi Będę musiał zbadać problem 'SET'; z drugiej: 'IServer.MakeMaster (...)' –

+0

@MarcGravell Jaki jest parametr "serwera", o którym wspomniałeś? Nie mogłem go znaleźć w typie ConfigurationOptions. –