Redis Sentinel – Vysoká Dostupnost: Vše, co potřebujete vědět, od DEV PROD: Kompletní Průvodce

Co znamená termín ‚Redis‘ vlastně znamená?

to znamená vzdálený slovník Server.

dobře! Existuje spousta různých Redis články tam, ale chtěl jsem se podělit o mé zkušenosti jako vývojář s Redis vytvořením „vše v jednom řádné článku“ pokrývající nejvíce základní a důležité věci, které je potřebné a užitečné pro vývojáře nebo devops engineer vybudovat Vysoce Dostupné Redis clusteru s Sentinel.

Takže pojďme začít…

Redis, což je open source v paměti datovou strukturu obchodu, je velmi populární výběr mezi vývojáři použít pro účely ukládání do mezipaměti, jako message broker a také používá hlavně jako NoSQL Klíč-Hodnota databáze pro různé případy použití.

v tomto příspěvku budu konkrétně diskutovat a demo o Redis spolu s replikací Master/Slave, vysokou dostupností (Redis Sentinel), automatickým Failover, některými tipy pro optimalizaci úrovně výroby a aspekty monitorování. Kromě toho spolu s těmito tématy zmíním problémy a chyby, kterým jsem čelil při implementaci Redis Sentinel s Ubuntu. Následující zobrazuje verzi OS a podrobnosti o verzi Redis.

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

navíc chci zdůraznit, že dokumentace Redis je velmi informativní a je to „přejít na místo“, pokud potřebujete další objasnění Redis.

posun vpřed k základům Redis; Redis je databáze v paměti, což jednoduše znamená, že Redis běží na paměti RAM. Musíte také vědět, že Redis podporuje několik datových struktur, jako jsou řetězce, hashe, seznamy, sady, tříděné sady s dotazy na rozsah, bitmapy. Kromě toho také podporuje atomové operace, jako je připojení k řetězci, zvýšení hodnoty v hash, posunutí prvku do seznamu atd.

pojďme začít s vysokou dostupností Redis.

Redis sentinel je řešení vysoké dostupnosti nabízených Redis. V případě poruchy ve vašem Redis clusteru Sentinel automaticky detekuje bod selhání a vrátí cluster zpět do stabilního režimu bez jakéhokoli zásahu člověka.

co se skutečně děje uvnitř Redis Sentinel ?

Sentinel vždy kontroluje instance MASTER a SLAVE v clusteru Redis a kontroluje, zda fungují podle očekávání. Pokud sentinel zjistí selhání v hlavním uzlu v daném clusteru, Sentinel zahájí proces převzetí služeb při selhání. V důsledku toho Sentinel vybere instanci otroka a povýší ji na MASTER. Nakonec budou ostatní zbývající instance SLAVE automaticky překonfigurovány tak, aby používaly novou instanci MASTER.

Sentinel funguje jako poskytovatel konfigurace nebo zdroj oprávnění pro zjišťování služeb klientů.

co to znamená ? Jednoduše, klienti aplikací se připojují k Sentinelům a Sentinely jim poskytují nejnovější hlavní adresu Redis.

kromě toho je Sentinel robustní distribuovaný systém, kde více Sentinelů musí souhlasit s tím, že daný master již není k dispozici. Pak jen proces převzetí služeb při selhání spustí vybrat nový hlavní uzel. Tato sentinelová dohoda se provádí podle hodnoty kvora.

co je usnášeníschopné ?

hodnota kvora je počet Sentinelů, kteří musí souhlasit s tím, že velitel není dosažitelný. Usnášeníschopnost se však používá pouze k detekci selhání. Aby bylo možné skutečně provést převzetí služeb při selhání, musí být jeden ze strážců zvolen vůdcem pro převzetí služeb při selhání a musí být oprávněn pokračovat. To se děje pouze s hlasováním většiny sentinelových procesů.

zašpiníme si ruce Redisem Sentinelem.

budeme se držet základního nastavení s instancemi serveru 3.

Prosím, viz výše uvedené schéma, které znázorňuje 3 instance serveru základní nastavení. Nejprve se ujistěte, že vaše instance Ubuntu jsou aktuální s příslušnými závislostmi sestavení. Někdy, možná budete potřebovat také jemalloc. Následující kroky ukazují kroky k instalaci Redis na instance serveru.

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

Nyní v redis adresáře, měli byste být schopni vidět, jak redis.conf a sentinel.konfigurační soubory conf.

předtím, Než jsme se spustit Redis pojďme udělat nějaké nezbytné základní konfigurace a spustit Redis clusteru. Níže jsou uvedeny IP adresy tohoto nastavení.

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

Výchozí port pro server Redis je 6379 a Sentinel je 26379. Proto se ujistěte, že otevřete tento port pomocí,

sudo ufw allow 6379
sudo ufw allow 26379

konfigurace Redis (oba v redis.conf a sentinel.conf) ve výše uvedených serverech by měly být konfigurovány následovně.

Pro základní nastavení výše uvedené konfigurace bude stačit, ale pro úroveň produkce zvažte prosím tipy uvedené v druhé části tohoto příspěvku. Jediný rozdíl v redis.soubory conf v serverech 3 je to, že všichni otroci musí mít následující konfiguraci. 10.52.209.46 je hlavní IP adresa.

slaveof 10.52.209.46 6379

slaveof řekne Redis clusteru, aby vytvořil tuto konkrétní instanci serveru jako slave instanci daného hlavního uzlu (10.52.209.46).

v sentinel.conf, po config upozornit Sentinels zahájit monitorování clusteru s následujícími počátečními nastaveními. Poté se toto nastavení konfigurace může automaticky aktualizovat.

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)

dále, sentinel.conf zahrnuje také následující konfigurační hodnoty.

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! Teď … projedeme Redise.

existuje mnoho způsobů, jak spustit Redis. V tomto demu se budu držet následujícího příkazu.

(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.)

poté můžete jednoduše zkontrolovat procesy Redis pomocí příkazu ps-ef | grep redis. Každá instance serveru by měla spouštět proces Redis i proces Sentinel. Pokud vše půjde do plánu, měly by být spuštěny 2 procesy následovně.

Nyní připojit k Redis klienta prostřednictvím jednoho z následujících příkazu a vyzkoušet, zda Redis je v pořádku.

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

úžasné! Nyní máte Redis v provozu. Zaměřme se na replikaci Master / Slave.

replikace Master / Slave

Nyní, pokud zkontrolujete redis.log (který se nachází na místě, které jsme definovali v redis.conf) z každé instance můžete vidět synchronizaci Master-Slave došlo.

Master node-redis.přihlásit

Slave uzel — redis.přihlásit

Kontrola Stavu Replikace

Můžete zkontrolovat informace o replikaci prostřednictvím info příkazu replikace v Redis CLI stejně. Pod atributem role se uvádí, zda je tento konkrétní uzel MASTER nebo SLAVE (žlutý rámeček). navíc v hlavním uzlu zobrazuje podrobnosti o všech připojených otrocích. (zelené pole)

nyní se podívejme, co sentinel.log indikují. (který se nachází v místě, které jsme definovali v Sentinelu.conf)

kromě toho, pokud zkontrolujete sentinel.soubor conf, můžete vidět, že soubor conf je automaticky aktualizován nejnovějšími konfiguracemi, včetně hodnot sentinel known-slave a sentinel known-sentinel.

Super! Nyní vytvoříme vzorovou hodnotu ve všech uzlech.

127.0.0.1:6739> set demokey "Amila"

Jak můžete vidět na výše uvedeném grafu, OTROCI jsou POUZE pro ČTENÍ, a proto můžete pouze zapisovat data na Master. Protože Redis asynchronně replikuje se všemi zbývajícími otroky, můžete načíst vloženou hodnotu z libovolných otroků Redis pomocí stejného daného klíče. Kromě toho můžete pomocíKEYS* uvést všechny vložené klíče. Výše uvedený diagram jasně popisuje, o čem jsme právě mluvili.

nyní se podívejme, jak funguje automatické převzetí služeb při selhání Redis Sentinel.

Redis Sentinel Automatic Failover

Okiee! Simulujme scénář automatického převzetí služeb při selhání. Chcete-li simulovat scénář převzetí služeb při selhání, můžete jednoduše zastavit server Redis nebo zabít proces Redis v hlavní instanci. Dokonce i vy můžete spát proces Redis stejně. Můžete si vybrat, jak si přejete.

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

Jak je znázorněno ve výše uvedeném grafu, ve převzetí služeb při selhání scénář, pokud hlavní uzel selže, pak 2 zbývající Hlídky určí převzetí služeb při selhání a pokud oba souhlasí (Od kvora hodnota je 2 ), pak nový MISTR bude zvolen z těch 2 zbývajících uzlech.

následující zobrazuje ocas protokolu pro tento scénář převzetí služeb při selhání.

redis.protokol podřízených uzlů.

sentineli.protokol Slave uzly

Nyní se pojďme zkontrolovat stav replikace prostřednictvím info příkazu replikace.

Dále vypracování protokolu ocas,

Každý Sentinel zjistí, že mistr je dolů s +sdown událost. (+sdown znamená, že zadaná instance je nyní v subjektivně dolů stavu.)

+ nová epocha znamená, že aktuální epocha byla aktualizována.

+sdown událost je později eskalována na +odown, což znamená, že více Sentinelů souhlasí s tím, že master není dosažitelný. (+odown znamená, že zadaná instance je nyní objektivně dole.)

Sentinels + Hlasujte pro Sentinel, který zahájí první pokus o převzetí služeb při selhání.

dojde k selhání.

dále, následující ukazuje povýšené úlohy.

Povýšeného pro 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

Povýšeného pro 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

Gratulujeme! To je prostě všechno. Takto Redis zpracovává vysokou dostupnost a automatické převzetí služeb při selhání. Nyní se podívejme na několik zajímavých faktů Redis, než skočíme na optimalizaci tipů a triků.

Zajímavá fakta o Redis.

Referenční Obraz: http://download.redis.io/logocontest/

Redis dokáže zpracovat až 2 32 klíče, a byl testován v praxi zvládnout alespoň 250 milionů klíčů za instanci.

prázdná instance používá ~ 3 MB paměti.

1 milion malých klíčů – > páry hodnot řetězce používají ~ 85 MB paměti.

1 milion klíčů – > hodnota Hash, představující objekt s 5 poli, používá ~ 160 MB paměti.

Redis je jediný závit. Jak mohu využít více CPU / jader?

není příliš časté, že se CPU stane vaším úzkým hrdlem s Redis, protože Redis je obvykle vázán na paměť nebo síť. Pokud tomu tak je, horizontální nebo vertikální škálování instancí Redis pomůže snížit úzká místa související s CPU.

Redis je paměťová, ale trvalá databáze na disku.

Redis Persistence – >RDB : point-in-time snímky vaší datové sady v určených intervalech. (Zálohování dat) / AOF: zaznamenává každou operaci zápisu přijatou serverem. (Odolnější)

pokud používáte Javu, můžete použít Jedis, což je klient java, pro připojení Java aplikace s Redis. Poznámka: Jedis používá Apache Commons Pool pro sdružování připojení (GenericObjectPool). A single Jedis instance is not threadsafe! Chcete-li se těmto problémům vyhnout, měli byste použít JedisPool, což je threadsafe pool síťových připojení. Výchozí maximální velikost bazénu připojení je 8.

nyní se zaměřme na problémy/chyby, které můžete získat, a některé tipy a triky pro optimalizaci produkčního výkonu pro Redis.

problémy / chyba, kterou můžete získat & tipy a triky pro optimalizaci výkonu výroby

nejprve v Redisu.conf a sentinel.conf, všechny konfigurace jsou v pořadí, takže se nemusíte pokazit s objednávkou. V opačném případě budete mít konfigurační chyby takto.

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

z hlediska bezpečnosti Nastavte heslo pro ověření pomocí master a slaves. Za tímto účelem můžete snadno změnit redis.conf a sentinel.conf v souladu s následující konfigurační hodnotou.

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

znamená, že nastavení TCP backlog (max connections) je 511. Tuto hodnotu můžete odpovídajícím způsobem nastavit (s ohledem na specifikaci serveru) pomocí následujících kroků.

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.

některé z varování, které byste mohli narazit na redis.log může být,

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žná budete muset zakázat THP nebo transparentní obrovskou stránku.

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

použití unix socket namísto TCP portu 6379 také přispěje k Redis zvýšení výkonu.

Reference: https://redis.io/topics/benchmarks

aby toho bylo dosaženo, redis.conf by měl být změněn na následující nastavení.

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

kromě toho můžete v závislosti na vašem případě použití nakonfigurovat také možnost Redis persistence.

Pokud si přejete, můžete zakázat vytrvalost, pokud chcete, aby vaše data existují jen tak dlouho, dokud je spuštěn server. Poznámka: vytrvalost RDB můžete zakázat komentováním všech řádků „uložit“ v Redisu.conf takto.

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

AOF persistance (připojit pouze soubor) je ve výchozím nastavení v redis zakázán.conf.

appendonly no

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

monitorování Redis

z pohledu monitorování existuje několik nástrojů pro monitorování Redis. NewRelic poskytuje pokročilé funkce pro sledování a analýzu Redis, včetně „nejvíce časově spotřebované operace db“, „operace podle propustnosti“, „operace podle času dotazu“ atd.

Více informací o New Relic Redis je zde uvedeno. Navíc je Redis-stat také dobrým monitorovacím nástrojem opensource Redis.

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

AWS ElasticCache

AWS nabízí také in-memory cache cloud službu s názvem „ElastiCache“, který také přichází s Redis v ceně. Lze jej specifikovat jako efektivní snadno použitelnou cloudovou službu, která vyloží většinu manuálních konfigurací a administrativních úkolů.

ElastiCache je webová služba, která usnadňuje spuštění, správu a škálování distribuované mezipaměti v paměti v cloudu.

Zajímavé je, že lodě s pohádkovou pokročilé funkce, jako je Režim Clusteru s sharding během několika kliknutí, Multi-AZ s Auto-převzetí služeb při Selhání, Šifrování na odpočinek, Šifrování v-tranzitní, Dovozní RDB soubor S3, Povolit automatické zálohy a mnoho dalších.

Nejúžasnější funkce AWS ElastichCache je to, že nabízí komplexní monitorování dashboard pro Redis clusteru včetně sledování aspektů, jako je CPU/využití Paměti (Swap a Freeable paměť), Připojení počítat, Položka, počet, Vystěhování, String;Klíč;Hash na základě Příkazu počítat, Replikace mas a mnoho dalších.

No… to je do značné míry pro tento příspěvek!

Jak jsem se zmínil na začátku tohoto příspěvku, existuje spousta různých Redis články tam, ale já chtěl vytvořit „vše v jednom řádné článku“ pokrývající nejdůležitější fakta a tipy, které je potřebné a užitečné pro vývojáře nebo devops engineer vybudovat Vysoce Dostupné Redis clusteru s Sentinel.

před dokončením tohoto příspěvku byl jedním ze zajímavých článků, které jsem našel, jak Flickr implementoval Redis Sentinel. Nezapomeňte také zkontrolovat tento příspěvek.

OK. Takže děkuji moc za přečtení tohoto článku a těším se, že přijít s dalším zajímavým článkem brzy, sdílení mé zkušenosti jako vývojář. Do té doby, na zdraví! a šťastné kódování!