2012-02-10 16 views
26

Skonfigurowaliśmy serwer Redis z jednym masterem i dwoma urządzeniami podrzędnymi. Jeśli mój master zawiedzie, jak możemy obsłużyć przełączanie awaryjne bez restartowania serwera Redis.Błąd Redis Over

Odpowiedz

30

Aktualizacja:

Dzisiaj, polecam sprawdzanie redis-sentinel, narzędzie według Autor Antirez Redis' dla monitorowania i automatycznego przełączania awaryjnego.

Oryginalny odpowiedź:

Sprawdź SLAVEOF polecenie: http://redis.io/commands/slaveof

Kiedy okazuje się, że twój pan nie wyda SLAVEOF NO ONE na jednym ze swoich niewolników, aby promować to do opanowania. Następnie skieruj swojego drugiego niewolnika na nowego mistrza. Zobacz także "Aktualizowanie lub ponowne uruchamianie instancji Redis bez przestojów": http://redis.io/topics/admin

Do zarządzania plikami konfiguracyjnymi można zrobić coś wzdłuż tych linii (uwaga: nie testowano, jako przykład). Poniższy przykład zakłada dwa pliki konfiguracyjne dla każdego serwera (/etc/redis/server1.master.conf, /etc/redis/server1.slave.conf itp), z których jedna posiada serwera jako niewolnik jakiegoś predefiniowanego Master:

#!/bin/sh 

master() 
{ 
    server_name=$1 
    redis-cli slaveof no one 
    ln -sf /etc/redis/$server_name.master.conf /etc/redis/$server_name.conf 
} 

# Usage: slave(server1 server2 6379) 
slave() 
{ 
    server_name=$1 
    master=$2 
    master_port=$3 
    redis-cli slaveof $master $master_port 
    ln -sf /etc/redis/$server_name.slave.conf /etc/redis/$server_name.conf 
} 

Zamiast predefiniowanych plików konfiguracyjnych, można edytować je na mucha z np sed. Zasadniczo, upewnij się, że zawsze masz pozycję slaveof w plikach konfiguracyjnych, albo wskazując na mastera lub slaveof no one. Następnie przepisać konfigurację przy użyciu sed (ponownie, nie testowane, tak pomyślany jako pokarm dla myśli):

#!/bin/sh 

master() 
{ 
    server_name=$1 
    config=$server_name.conf 
    redis-cli slaveof no one 
    sed -i "s/^slaveof.*/slaveof no one/" $config 
} 

# Usage: slave(server1 server2 6379) 
slave() 
{ 
    server_name=$1 
    config=$server_name.conf 
    master=$2 
    master_port=$3 
    redis-cli slaveof $master $master_port 
    sed -i "s/^slaveof.*/slaveof $master $master_port/" $config 
} 
+0

Dzięki Linus, próbowałem że klient Redis jego pracy w porządku, ale jak zmienić takie same na Redis conf w locie, Czy istnieje jakiś skrypt dostępny do tego? Dzięki – vijay

+0

Great! I don” t Wiesz, której biblioteki klienckiej redis używasz, ale domyślam się, że ma komendę 'slaveof' Dla plików konfiguracyjnych możesz mieć dwie konfiguracje dla każdego serwera, jeden dla slave i jeden dla master oraz dowiązanie symboliczne między tymi serwerami. –

1

Polecam zajrzeć do Redis Klastra (wersja 3.2 jako ostatni stabilny dzisiaj). Cluster to nowe podejście, nie ma już strażników. Zasada "fail over over" jest taka sama, slave promuje się do master w przypadku, gdy master jest w dół i nowe funkcje, w tym logika sharding obsługiwana przez Redis. Aplikacja musi po prostu połączyć się z klastrem z zestawem węzłów, to wszystko.

Jeśli mówimy o ogólnym Fail Over, należy pamiętać, że Redis Cluster nie gwarantuje wysokiej spójności.

Proszę znaleźć fragment z: http://redis.io/topics/cluster-tutorial

„Redis klastrowania nie jest w stanie zagwarantować silną spójność W praktyce oznacza to, że w pewnych warunkach możliwe jest, że Redis Cluster stracą pisze, że były. potwierdzony przez system do klienta.

pierwszy powód Redis Klaster może stracić pisze to dlatego, że wykorzystuje asynchroniczną replikację.

Istnieje jeszcze inny znaczący scenariusz, w którym Klaster Redis utraci zapis, co dzieje się podczas partycji sieciowej, na której klient jest odizolowany z mniejszą liczbą instancji, w tym przynajmniej nadrzędną."