2013-07-02 9 views
6

Zgodnie z komunikatami o zatwierdzeniu git, usługa ServiceStack dodała ostatnio obsługę przełączania awaryjnego. Początkowo zakładałem, że oznacza to, że mogę wycofać jedną z moich instancji Redis, a mój menedżer klienta z pulami poradziłby sobie z awaryjnym przełączaniem awaryjnym i spróbował połączyć się z jedną z moich alternatywnych instancji Redis. Niestety, mój kod właśnie załamuje się i mówi, że nie może połączyć się z początkową instancją Redis.Jak działa przełączanie awaryjne ServiceStack PooledRedisClientManager?

Aktualnie używam instancji Redis 2.6.12 na Windowsie, z masterem na porcie 6379 i slave na 6380, z ustawionymi wskaźnikami, aby automatycznie wypromować urządzenie podrzędne do mastera, jeśli master się wyłączy. Ja obecnie instancji menedżera klienta tak: gospodarze

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

gdzie pierwsza tablica jest tylko do odczytu (dla Master), a druga tablica jest tylko do odczytu gospodarze (dla slave).

Kiedy kończę kapitana w porcie 6379, strażnicy promują niewolnika do kapitana. Teraz, gdy próbuję uruchomić mój kod C#, zamiast przeskakiwać do portu 6380, po prostu przerywa i zwraca błąd "nie mógł połączyć się z instancją redis na localhost: 6379".

Czy istnieje sposób obejścia tego problemu, czy przejście awaryjne po prostu nie zadziała tak, jak tego chcę?

+1

Znalazłeś sposób @Vliu – jaxxbo

+0

Nie, z większości badań, które zrobiłem, większość ludzi nie polega na kodzie do obsługi przełączania awaryjnego. Używają one (linuksowej) warstwy proxy w bazie danych redis, takich jak HAProxy @jaxxbo – Vliu

Odpowiedz

4

PooledRedisClientManager.FailoverTo pozwala na zresetowanie hostów do odczytu/zapisu, kontra tylko hosty i ponowne uruchomienie fabryki. Pozwala to na szybkie przejście bez konieczności ponownego tworzenia klientów.

+1

Podobnie jak w przypadku próby {// operacji redis} catch {PooledRedisClientManager.FailoverTo (port podrzędny jako port do odczytu i zapisu)}? – Vliu

+1

To byłby jeden sposób, aby to zrobić, tak. Skonfigurowałem specjalną usługę do obsługi żądań przychodzących z Redis Sentinel, w ten sposób, jeśli wykrył on nieudany węzeł, który negocjowałby i promował odpowiedni slave, a następnie powiadomiłby moje webservices o nowym adresie i porcie. – TheDruidsKeeper

+0

Witam @ TheDruidsKeeper, czy mógłbyś bardziej rozwinąć swoje podejście do niektórych przykładów, np. Jaką usługę masz na myśli i jak dokładnie wykryje nieudany węzeł, bardzo to doceniam. – wliao

Powiązane problemy