Redis Sentinel-wysoka dostępność: wszystko, co musisz wiedzieć od dewelopera do PROD: kompletny przewodnik

co właściwie oznacza termin „Redis”?

oznacza zdalny serwer słownikowy.

Istnieje wiele różnych artykułów Redis, ale chciałem podzielić się moim doświadczeniem jako programista z Redis, tworząc „wszystko w jednym właściwym artykule” obejmującym najważniejsze i najważniejsze rzeczy, które są potrzebne i pomocne dla programisty lub inżyniera devops, aby zbudować wysoce Dostępny klaster Redis z Sentinel.

Zacznijmy więc…

Redis, który jest open source w pamięci przechowywania struktury danych, jest bardzo popularnym wyborem wśród programistów używanych do celów buforowania, jako broker wiadomości, a także głównie jako baza danych klucz-wartość NoSQL dla różnych przypadków użycia.

w tym poście zamierzam szczegółowo omówić i zaprezentować Redis wraz z replikacją Master/Slave, wysoką dostępnością (Redis Sentinel), automatycznym przełączaniem awaryjnym, niektórymi wskazówkami dotyczącymi optymalizacji poziomu produkcji i aspektami monitorowania. Ponadto, wraz z tymi tematami wspomnę o problemach i błędach, z którymi miałem do czynienia podczas implementacji Redis Sentinel z Ubuntu. Poniżej przedstawiono wersję systemu operacyjnego i szczegóły wersji Redis.

OS version: Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-119-generic x86_64)
Redis Version: 4.0.9

dodatkowo chcę podkreślić, że dokumentacja Redis jest bardzo pouczająca i jest „przejdź do miejsca”, jeśli potrzebujesz dalszych wyjaśnień na temat Redis.

przechodząc do podstaw Redis; Redis jest bazą danych w pamięci, co po prostu oznacza, że Redis działa na PAMIĘCI RAM. Musisz również wiedzieć, że Redis obsługuje kilka struktur danych, takich jak ciągi znaków, skróty, listy, zestawy, posortowane zestawy z zapytaniami zakresu, bitmapy. Co więcej, obsługuje również operacje atomowe, takie jak dołączanie do łańcucha, zwiększanie wartości w hashu, pchanie elementu do listy itp.

zacznijmy od Redis High Availability.

Redis sentinel to rozwiązanie o wysokiej dostępności oferowane przez Redis. W przypadku awarii w klastrze Redis, Sentinel automatycznie wykryje punkt awarii i przywróci klaster do trybu stabilnego bez interwencji człowieka.

co tak naprawdę dzieje się w Redis Sentinel ?

Sentinel zawsze sprawdza instancje MASTER i SLAVE w klastrze Redis, sprawdzając, czy działają zgodnie z oczekiwaniami. Jeśli program sentinel wykryje awarię węzła głównego w danym klastrze, program Sentinel rozpocznie proces przełączania awaryjnego. W rezultacie Sentinel wybierze instancję SLAVE i awansuje ją do MASTER. Ostatecznie Pozostałe instancje SLAVE zostaną automatycznie skonfigurowane do użycia nowej instancji MASTER.

Sentinel działa jako dostawca konfiguracji lub źródło uprawnień do wykrywania usług dla klientów.

Co to znaczy ? Po prostu klienci aplikacji łączą się z Sentinel i Sentinel dostarczają im najnowszy adres główny Redis.

ponadto Sentinel jest solidnym systemem rozproszonym, w którym wielu strażników musi zgodzić się na fakt, że dany master nie jest już dostępny. Wtedy tylko proces przełączania awaryjnego rozpoczyna wybierz nowy węzeł główny. Ta umowa sentinel odbywa się zgodnie z Kworum wartości.

co to jest kworum ?

wartość kworum to liczba Wartowników, którzy muszą się zgodzić co do faktu, że mistrz nie jest osiągalny. Kworum służy jednak tylko do wykrycia awarii. Aby faktycznie wykonać przełączanie awaryjne, jeden z strażników musi zostać wybrany liderem przełączania awaryjnego i być upoważniony do kontynuowania. Dzieje się tak tylko przy głosowaniu większości procesów Sentinel.

pobrudzmy sobie ręce z Redis Sentinel.

trzymamy się podstawowej konfiguracji z 3 instancjami serwera.

proszę zapoznać się z powyższym diagramem, który ilustruje podstawową konfigurację instancji serwera 3. Przede wszystkim upewnij się, że instancje Ubuntu są aktualne z odpowiednimi zależnościami kompilacji. Czasami możesz też potrzebować jemalloca. Poniżej przedstawiono kroki instalacji Redis na wystąpieniach serwera.

sudo apt-get update 
sudo apt-get install build-essential tcl
sudo apt-get install libjemalloc-dev (Optional)curl -O http://download.redis.io/redis-stable.tar.gz
tar xzvf redis-stable.tar.gz
cd redis-stable
make
make test
sudo make install

teraz w katalogu redis powinieneś być w stanie zobaczyć oba redis.conf i sentinel.pliki konfiguracyjne conf.

zanim uruchomimy Redis, zróbmy kilka podstawowych konfiguracji, aby uruchomić klaster Redis. Poniżej znajdują się adresy IP tej konfiguracji.

10.52.209.46 (Initial Master Node)
10.52.209.47 (Initial Slave Node)
10.52.209.49 (Initial Slave Node)

domyślny port dla serwera Redis to 6379, a Sentinel to 26379. Dlatego upewnij się, że otwierasz te porty za pomocą,

sudo ufw allow 6379
sudo ufw allow 26379

konfiguracje Redis (oba w redis.conf i sentinel.conf) w powyższych serwerach należy skonfigurować w następujący sposób.

dla podstawowej konfiguracji powyższe konfiguracje będą wystarczające, ale dla poziomu produkcji proszę rozważyć wskazówki wymienione w drugiej części tego postu. Jedyna różnica w redis.pliki conf w 3 serwerach jest to, że wszystkie niewolników musi mieć następującą konfigurację. 10.52.209.46 to główny adres IP.

slaveof 10.52.209.46 6379

slaveof mówi klastrowi Redis, aby ten konkretny serwer był instancją SLAVE danego węzła głównego (10.52.209.46).

w sentinel.conf, po config powiadom Sentinels, aby rozpocząć monitorowanie klastra z następujących ustawień początkowych. Następnie to ustawienie konfiguracyjne może być automatycznie aktualizowane.

sentinel monitor mymaster 10.52.209.46 6379 2
(This tells sentinel to monitor the master node. And the last argument which is 2 is the quorum value)

dalej, sentinel.conf zawiera również następujące wartości konfiguracyjne.

sentinel down-after-milliseconds mymaster 5000
(Means server will unresponsive for 5 seconds before being classified as +down and consequently activating a +vote to elect a new master node.)sentinel failover-timeout mymaster 10000
(Specifies the failover timeout in milliseconds.)

Okie Dokie! Teraz … przejdźmy do Redis.

istnieje wiele sposobów uruchomienia Redis. W tym demo będę trzymać się następujących poleceń.

(Go to src folder.)
cd src/ && redis-server ../redis.conf &
cd src/ && redis-server ../sentinel.conf — sentinel &(Or else you can simply use cd utils && ./install_server.sh.)

następnie możesz po prostu sprawdzić procesy Redis za pomocą polecenia ps-EF | grep redis. Każda instancja serwera powinna uruchamiać zarówno proces Redis, jak i proces Sentinel. Jeśli wszystko pójdzie zgodnie z planem, powinny być 2 procesy działające w następujący sposób.

teraz połącz się z Klientem Redis za pomocą jednego z poniższych poleceń i sprawdź, czy Redis działa poprawnie.

redis-cli ping
or
redis-cli -h IP_Address pingYou should get a output of PONG.

zajebiste! Teraz Redis działa. Skupmy się na replikacji Master/Slave.

replikacja Master/Slave

teraz, jeśli sprawdzisz redis.log (który znajduje się w miejscu, które zdefiniowaliśmy w redis.conf) każdej instancji, możesz zobaczyć synchronizację Master — Slave.

węzeł główny — redis.log

węzeł Slave-redis.log

Sprawdzanie stanu replikacji

informacje o replikacji można sprawdzić również za pomocą polecenia info replication w Redis CLI. Pod atrybutem role wskazuje, czy dany węzeł jest MASTER czy SLAVE (żółte pole). ponadto w węźle Master wyświetla szczegóły wszystkich połączonych Slave ’ ów. (zielone pole)

teraz sprawdźmy, co sentinel.dziennik wskazuje. (który znajduje się w miejscu, które określiliśmy w sentinel.conf)

co więcej, jeśli sprawdzisz Sentinela.plik conf, możesz zobaczyć, że plik conf jest automatycznie aktualizowany za pomocą najnowszych konfiguracji, w tym wartościach sentinel known-slave i sentinel known-sentinel.

Super! Teraz stwórzmy przykładową wartość we wszystkich węzłach.

127.0.0.1:6739> set demokey "Amila"

jak widać na powyższym diagramie, Slave ’ Y są tylko do odczytu, stąd można zapisywać tylko dane do Master. Ponieważ Redis asynchronicznie replikuje się ze wszystkimi pozostałymi niewolnikami, możesz pobrać wstawioną wartość z dowolnych niewolników Redis używając tego samego podanego klucza. Ponadto via,KEYS* możesz wyświetlić listę wszystkich wstawionych kluczy. Powyższy diagram wyraźnie opisuje to, o czym właśnie rozmawialiśmy.

teraz sprawdźmy, jak działa automatyczne przełączanie awaryjne Redis Sentinel.

Redis Sentinel Automatyczne Przełączanie Awaryjne

Okiee! Zasymulujmy scenariusz automatycznego przełączania awaryjnego. Aby symulować scenariusz przełączania awaryjnego, możesz po prostu zatrzymać serwer Redis lub zabić proces Redis w instancji głównej. Nawet ty możesz spać w procesie Redis. Możesz wybrać sposób, w jaki pragniesz.

kill -9 <process id>
or
redis-cli -p 6379 DEBUG sleep 30
or
redis-cli -p 6379 DEBUG SEGFAULT

jak pokazano na powyższym diagramie, w scenariuszu przełączania awaryjnego, jeśli węzeł główny nie powiedzie się, 2 Pozostałe Sentinele określi przełączanie awaryjne, a jeśli oba się zgodzą (ponieważ wartość kworum wynosi 2), nowy MASTER zostanie wybrany z tych 2 pozostałych węzłów.

poniżej pokazuje ogon dziennika dla tego scenariusza przełączania awaryjnego.

redis.dziennik węzłów Slave.

sentinel.dziennik węzłów Slave

teraz sprawdźmy stan replikacji za pomocą polecenia info replication.

dalsze opracowanie ogona kłody,

każdy Sentinel wykrywa, że mistrz został pokonany za pomocą zdarzenia +sdown. (+sdown oznacza, że określona instancja jest teraz w stanie subiektywnie Down.)

+new-epoch oznacza, że obecna Epoka została zaktualizowana.

+sdown zdarzenie jest później eskalowane do +odown, co oznacza, że wielu strażników zgadza się co do faktu, że master nie jest osiągalny. (+odown oznacza, że określona instancja jest teraz w stanie obiektywnie Down.)

Sentinel + głosuj na Sentinela, który rozpocznie pierwszą próbę przełączania awaryjnego.

następuje przełączanie awaryjne.

Dalej, poniżej pokazuje się rozpocznij pracę.

Upstart dla Redis

description "Redis Server"start on runlevel 
stop on runlevel script
echo $$ > /var/run/redis.pid
su - amila -c "cd /home/amila/redis-stable/src/; redis-server ../redis.conf"
end scriptpost-stop script
rm -f /var/run/redis.pid
end script

Upstart dla Sentinel

description "Redis Sentinel Server"start on runlevel 
stop on runlevel script
echo $$ > /var/run/redis.pid
su - amila -c "cd /home/amila/redis-stable/src/; redis-server ../sentinel.conf --sentinel"
end scriptpost-stop script
rm -f /var/run/redis.pid
end script

Gratulacje! To po prostu to. W ten sposób Redis radzi sobie z wysoką dostępnością i automatycznym przełączaniem awaryjnym. Teraz rzućmy okiem na kilka interesujących faktów Redis, zanim przejdziemy do wskazówek i wskazówek dotyczących optymalizacji.

ciekawe fakty na temat Redis.

odniesienie do obrazu: http://download.redis.io/logocontest/

Redis może obsługiwać do 2 32 kluczy i został przetestowany w praktyce pod kątem obsługi co najmniej 250 milionów kluczy na instancję.

pusta instancja używa ~ 3MB pamięci.

1 milion małych klawiszy -> pary wartości ciągów używają ~ 85MB pamięci.

1 milion kluczy – > wartość skrótu, reprezentująca obiekt z 5 polami, zużywa ~ 160 MB pamięci.

Redis jest jednowątkowy. Jak mogę wykorzystać wiele procesorów / rdzeni?

nie jest to częste, że procesor staje się wąskim gardłem w przypadku Redis, ponieważ zwykle Redis jest związany z pamięcią lub siecią. W takim przypadku skalowanie poziome lub pionowe wystąpień Redis pomoże zmniejszyć wąskie gardła związane z procesorem.

Redis jest przechowywaną w pamięci, ale trwałą bazą danych na dysku.

Redis – >RDB : migawki punkt-w-czasie zbioru danych w określonych odstępach czasu. (Data backup)| AoF : rejestruje każdą operację zapisu otrzymaną przez serwer. (Trwalszy)

jeśli używasz języka Java, możesz użyć Jedis, który jest klientem java, aby połączyć aplikację Java z Redis. Uwaga: Jedis używa puli Apache Commons do poolingu połączeń (GenericObjectPool). A single Jedis instance is not threadsafe!aby uniknąć tych problemów, powinieneś użyć JedisPool, który jest bezpieczną pulą połączeń sieciowych. Domyślny maksymalny rozmiar puli połączeń to 8.

teraz skupmy się na problemach/błędach, które możesz napotkać, oraz na kilku poradach i wskazówkach dotyczących optymalizacji wydajności produkcji dla Redis.

problemy / błąd, który możesz uzyskać & porady i wskazówki dotyczące optymalizacji wydajności produkcji

przede wszystkim w redis.conf i sentinel.conf, wszystkie konfiguracje są w porządku, więc nie psuj kolejności. W przeciwnym razie otrzymasz następujące błędy konfiguracyjne.

*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 98
>>> 'sentinel down-after-milliseconds mymaster 5000'
No such master with specified name.

z punktu widzenia bezpieczeństwa skonfiguruj hasło do uwierzytelniania za pomocą master i Slave. W tym celu można łatwo zmienić redis.conf i sentinel.conf odpowiednio z następującą wartością config.

In sentinel.conf
sentinel auth-pass <master-name> <password>In redis.conf
masterauth <master-password>

sprawia, że ustawienie Backlogu TCP (Max connections) wynosi 511. Możesz odpowiednio ustawić tę wartość (biorąc pod uwagę specyfikację serwera), wykonując następujące kroki.

sudo nano /etc/rc.local
Add this:
sysctl -w net.core.somaxconn=65535When you reboot the next time, the new setting will be to allow 65535 connections instead of 128 as before. When you add the line to rc.local make sure it's before the exit 0.

niektóre ostrzeżenia, które możesz natknąć się z redis.log może być,

WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.You can add this via following command as well as using a cat command you can makesure whether the value is set properly.echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
cat /etc/sysctl.conf

może być konieczne wyłączenie THP lub przezroczysta Ogromna strona.

WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.Fixsudo nano /etc/rc.local
echo never > /sys/kernel/mm/transparent_hugepage/enabled

użycie gniazda UNIX zamiast portu TCP 6379 również przyczyni się do zwiększenia wydajności Redis.

Numer referencyjny: https://redis.io/topics/benchmarks

aby to osiągnąć, redis.conf powinien zostać zmieniony na następujące ustawienie.

unixsocket /var/run/redis.sock
unixsocketperm 777# Accept connections on the specified port, default is 6379.
# If port 0 is specified Redis will not listen on a TCP socket.
port 0

ponadto, w zależności od przypadku użycia, można również skonfigurować opcję trwałości Redis.

jeśli chcesz, możesz w ogóle wyłączyć trwałość, jeśli chcesz, aby Twoje dane istniały tak długo, jak działa serwer. Uwaga: możesz wyłączyć trwałość RDB, komentując wszystkie wiersze „Zapisz” w redis.conf w następujący sposób.

Comment out these 3 values in redis.conf
save 900 1
save 300 10
save 60 10000rdbcompression no
rdbchecksum no

trwałość AOF (tylko plik dopisywania) jest domyślnie wyłączona w redis.conf.

appendonly no

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

monitorowanie Redis

z punktu widzenia monitorowania istnieje kilka narzędzi do monitorowania Redis. NewRelic zapewnia zaawansowane możliwości monitorowania i analizy Redis, w tym” najbardziej zużyte operacje db”,” operacje według przepustowości”,” operacje według czasu zapytania ” itp.

więcej informacji na temat New Relic Redis znajduje się tutaj. Ponadto Redis-stat jest również dobrym narzędziem do monitorowania Redis opensource.

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

AWS ElasticCache

AWS oferuje również usługę w chmurze pamięci podręcznej o nazwie „ElastiCache”, która również zawiera Redis. Można ją określić jako skuteczną, łatwą w użyciu usługę w chmurze, która odciąża większość ręcznych konfiguracji i zadań administracyjnych.

ElastiCache to usługa internetowa, która ułatwia uruchamianie, zarządzanie i skalowanie rozproszonej pamięci podręcznej w chmurze.

co ciekawe, jest dostarczany z bajecznymi zaawansowanymi funkcjami, takimi jak tryb klastra z shardingiem w ciągu kilku kliknięć, Multi-AZ z automatycznym przełączaniem awaryjnym, szyfrowanie w spoczynku, szyfrowanie w tranzycie, Importowanie pliku RDB do S3, Włączanie automatycznych kopii zapasowych i wiele innych.

najfajniejszą cechą AWS ElastichCache jest to, że oferuje kompleksowy pulpit nawigacyjny do monitorowania klastra Redis, w tym aspekty monitorowania, takie jak wykorzystanie procesora/pamięci (pamięć wymienna i wolna), liczba połączeń, liczba elementów, eksmisje, liczba poleceń opartych na ciągach, kluczach, skrótach, opóźnienie replikacji i wiele innych.

Cóż … to prawie wszystko dla tego posta!

jak wspomniałem na początku tego postu, istnieje wiele różnych artykułów Redis, ale chciałem stworzyć „wszystko w jednym właściwym artykule” zawierający najważniejsze fakty i wskazówki, które są potrzebne i pomocne dla programisty lub inżyniera devops, aby zbudować wysoce Dostępny klaster Redis z Sentinel.

zanim skończyłem ten post, jednym z ciekawych artykułów, które znalazłem, było to, jak Flickr wdrożył Redis Sentinel. Sprawdź również ten post.

OK. Więc bardzo dziękuję za przeczytanie tego artykułu i czekam na kolejny ciekawy artykuł wkrótce, dzieląc się moim doświadczeniem jako programista. Do tego czasu zdrówko! i Szczęśliwego kodowania!