Redis Sentinel-High Availability: Everything you need to know from DEV to PROD: Complete Guide

wat betekent de term ‘Redis’ eigenlijk?

het betekent DIctionary Server op afstand.

goed! Er zijn tal van verschillende Redis artikelen die er zijn, maar ik wilde mijn ervaring als ontwikkelaar te delen met Redis door het creëren van een “alles in een juiste artikel” met betrekking tot de meest essentiële en belangrijke dingen die nodig en nuttig is voor een ontwikkelaar of een devops ingenieur om een zeer beschikbare Redis cluster te bouwen met Sentinel.

dus laten we beginnen…

Redis, een open source in de opslag van geheugengegevens, is een zeer populaire selectie onder ontwikkelaars die worden gebruikt voor cachingdoeleinden, als een message broker en ook voornamelijk gebruikt als een NoSQL Key-Value database voor verschillende use cases.

in dit bericht ga ik specifiek bespreken en demo over Redis samen met Master/Slave replicatie, hoge beschikbaarheid (Redis Sentinel), automatische Failover, enkele productieniveau optimalisatie tips en monitoring aspecten. Daarnaast, samen met deze onderwerpen zal ik het vermelden van de problemen en de fouten die ik geconfronteerd tijdens de implementatie van Redis Sentinel met Ubuntu. Volgende toont de OS-versie en Redis versie details.

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

Daarnaast wil ik benadrukken dat de Redis-documentatie zeer informatief is en dat het ’the go to place’ is als u verdere uitleg over Redis nodig heeft.

verder gaan naar de basisprincipes van Redis; Redis is een in-memory database, wat betekent dat Redis op RAM draait. U moet ook weten dat Redis verschillende datastructuren ondersteunt, zoals strings, hashes, lijsten, sets, gesorteerde sets met range queries, bitmaps. Verder ondersteunt het ook atomaire operaties zoals het toevoegen aan een string, het verhogen van de waarde in een hash, het pushen van een element naar een lijst en etc.

laten we beginnen met Redis High Availability.

Redis sentinel is de high availability oplossing aangeboden door Redis. In het geval van een storing in uw Redis-cluster, detecteert Sentinel automatisch het punt van storing en brengt het cluster terug naar de stabiele modus zonder enige menselijke tussenkomst.

Wat gebeurt er echt binnen Redis Sentinel ?

Sentinel controleert altijd de master-en SLAVE-instanties in het Redis-cluster en controleert of ze werken zoals verwacht. Als sentinel een fout detecteert in het masterknooppunt in een bepaald cluster, start Sentinel een failover-proces. Als gevolg hiervan zal Sentinel een slave-instantie kiezen en deze promoten tot MASTER. Uiteindelijk zullen de andere overgebleven SLAVE instanties automatisch opnieuw geconfigureerd worden om de Nieuwe MASTER instantie te gebruiken.

Sentinel fungeert als een configuratieprovider of een bron van autoriteit voor clients service discovery.

wat betekent dat ? Eenvoudig, applicatieclients verbinden met de Sentinels en Sentinels bieden het nieuwste Redis MASTER adres aan hen.

verder is Sentinel een robuust gedistribueerd systeem, waarbij meerdere sentinels moeten instemmen met het feit dat een bepaalde master niet langer beschikbaar is. Vervolgens start alleen het failover – proces een nieuw masterknooppunt selecteren. Deze sentinel-overeenkomst wordt uitgevoerd volgens de quorumwaarde.

Wat is quorum ?

de quorumwaarde is het aantal Sentinels dat overeenstemming moet bereiken over het feit dat de kapitein niet bereikbaar is. Het quorum wordt echter alleen gebruikt om de storing op te sporen. Om daadwerkelijk een failover uit te voeren, moet een van de Sentinels gekozen worden als leider voor de failover en bevoegd zijn om verder te gaan. Dit gebeurt alleen met de stem van de meerderheid van de Sentinel processen.

laten we onze handen vuil maken met Redis Sentinel.

we houden ons aan de basisinstellingen met 3 serverinstances.

raadpleeg het bovenstaande diagram dat de 3 server instance basic setup illustreert. Zorg er allereerst voor dat uw Ubuntu-instanties up-to-date zijn met relevante build-afhankelijkheden. Soms heb je jemalloc ook nodig. Hierna worden de stappen weergegeven OM Redis op uw serverinstances te installeren.

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

nu in de Redis directory moet je in staat zijn om beide redis te zien.conf en sentinel.conf configuratiebestanden.

voordat we Redis uitvoeren, laten we eerst wat noodzakelijke basisconfiguraties doen om een Redis cluster op te zetten en uit te voeren. Hieronder volgen de IP-adressen van deze setup.

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

standaard poort voor Redis server is 6379 en Sentinel is 26379. Zorg er daarom voor dat je deze poort opent met,

sudo ufw allow 6379
sudo ufw allow 26379

de Redis configuraties (beide in redis.conf en sentinel.conf) in de bovenstaande servers moet als volgt worden geconfigureerd.

voor de basis setup bovenstaande configuraties zal genoeg zijn, maar voor het productieniveau kunt u rekening houden met de tips vermeld in het laatste deel van dit bericht. Het enige verschil in redis.conf bestanden in 3 servers is dat alle slaves de volgende configuratie moeten hebben. 10.52.209.46 is het hoofd IP adres.

slaveof 10.52.209.46 6379

slaveof vertelt Redis cluster om deze specifieke server instantie te maken als een SLAVE instantie van de gegeven MASTER node (10.52.209.46).

in sentinel.conf, na config waarschuw Sentinels om de clustermonitoring te starten met de volgende initiële instellingen. Daarna kan deze configuratie instelling automatisch dienovereenkomstig bijgewerkt.

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)

verder, sentinel.conf bevat ook de volgende configuratiewaarden.

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! Nu … laten we Redis rennen.

er zijn vele manieren om Redis uit te voeren. In deze demo hou ik het bij het volgende commando.

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

daarna kunt u eenvoudig de Redis processen controleren via ps-ef | grep redis Commando. Elke serverinstantie moet zowel een Redis-proces als een Sentinel-proces draaien. Als alles naar het plan gaat, moeten er 2 processen als volgt draaien.

Maak nu verbinding met Redis client via een van de volgende commando en test of Redis werkt prima.

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

geweldig! Nu heb je Redis aan de praat. Laten we ons concentreren op de Master/Slave replicatie.

Master / Slave replicatie

nu als u de redis controleert.log (die zich bevindt op de plaats die we hebben gedefinieerd in de redis.conf) van elke instantie kun je de Master — Slave synchronisatie zien plaatsvinden.

Master node-redis.log

Slave node-redis.log

replicatiestatus controleren

u kunt de replicatiegegevens ook controleren via de opdracht info replication in Redis CLI. Onder de functie attribuut vermeldt het of dat bepaalde knooppunt is een MASTER of een SLAVE(gele doos). bovendien, in de Master Knooppunt, het toont de details van alle aangesloten slaves. (groene doos)

laten we nu eens kijken welke sentinel.log geeft aan. (die zich bevindt op de plaats die we hebben gedefinieerd in de sentinel.conf)

bovendien, als je de sentinel controleert.conf bestand, kunt u zien dat conf bestand automatisch wordt bijgewerkt met de nieuwste configuraties, inclusief sentinel known-slave en sentinel known-sentinel waarden.

Cool! Laten we nu een voorbeeldwaarde maken in alle knooppunten.

127.0.0.1:6739> set demokey "Amila"

zoals je kunt zien in het bovenstaande diagram, SLAVES zijn alleen-lezen dus je kunt alleen gegevens naar Master schrijven. Omdat Redis asynchroon repliceert met alle resterende slaves, kunt u de ingevoegde waarde ophalen van elke Redis slaves met dezelfde opgegeven sleutel. Bovendien kunt u viaKEYS* alle ingevoegde sleutels weergeven. Het bovenstaande diagram beschrijft duidelijk waar we het net over hadden.

laten we nu controleren hoe Redis Sentinel Automatic Failover werkt.

Redis Sentinel Automatic Failover

Okiee! Laten we een automatisch failover-scenario simuleren. Om een failover-scenario te simuleren, kunt u eenvoudig de Redis-server stoppen of het Redis-proces in de master-instantie stoppen. Zelfs u kunt slapen de Redis proces ook. Je kunt kiezen wat je maar wilt.

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

zoals geïllustreerd in het bovenstaande diagram, zullen in een failover-scenario, als MASTER node faalt, de 2 resterende Sentinels de failover bepalen en als beide akkoord gaan (aangezien quorumwaarde 2 is), dan zal een nieuwe MASTER worden gekozen uit Die 2 resterende nodes.

hieronder wordt de staart van het logbestand voor dit failover-scenario weergegeven.

redis.log van Slavenknooppunten.

sentinel.log van Slave knooppunten

laten we nu controleren op replicatie status via info replicatie commando.

verdere uitwerking van de staartstaart,

elke Sentinel detecteert dat de master down is met een +sdown gebeurtenis. (+sdown betekent dat de opgegeven instantie nu subjectief Down staat.)

+nieuw tijdperk betekent dat de huidige periode is bijgewerkt.

+sdown gebeurtenis wordt later geëscaleerd naar +odown, wat betekent dat meerdere Sentinels het erover eens zijn dat de master niet bereikbaar is. (+odown betekent dat de opgegeven instantie is nu in objectief Down toestand.)

Sentinels + stem een Sentinel die de eerste failover-poging zal starten.

de failover gebeurt.

verder, volgende toont opstarttaken.

opstart voor 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

opstart voor 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

Gefeliciteerd! Dat is het gewoon. Zo gaat Redis om met hoge beschikbaarheid en automatische Failover. Laten we nu eens een kijkje nemen op een aantal interessante Redis feiten voordat we springen in op het optimaliseren van tips en trucs.

interessante feiten over Redis.

referentie afbeelding: http://download.redis.io/logocontest/

Redis kan tot 2 32 toetsen verwerken en werd in de praktijk getest om minstens 250 miljoen toetsen per instantie te verwerken.

een lege instantie gebruikt ~ 3MB geheugen.

1 miljoen kleine sleutels- > Tekenreekswaardeparen gebruiken ~ 85MB geheugen.

1 miljoen sleutels- > hashwaarde, die een object met 5 velden vertegenwoordigt, gebruik ~ 160 MB geheugen.

Redis heeft één schroefdraad. Hoe kan ik meerdere CPU / cores exploiteren?

het komt niet vaak voor dat CPU uw knelpunt wordt met Redis, omdat Redis meestal geheugen-of netwerkgebonden is. Als dit het geval is, zal horizontale of verticale schaling van Redis instanties helpen om CPU-gerelateerde knelpunten te verminderen.

Redis is een in-memory maar persistent op schijfdatabase.

Redis persistentie – >RDB : point-in-time snapshots van uw dataset met bepaalde intervallen. (Data backup) / AOF: logt elke schrijfbewerking die de server ontvangt. (Duurzamer)

Als u Java gebruikt, kunt u Jedis gebruiken, een java-client, om uw Java-toepassing te verbinden met Redis. Opmerking: Jedis gebruikt Apache Commons Pool voor het poolen van verbindingen (GenericObjectPool). A single Jedis instance is not threadsafe! om deze problemen te voorkomen, moet je JedisPool gebruiken, een threadsafe pool van netwerkverbindingen. Standaard Max verbinding pool grootte is 8.

laten we ons nu concentreren op de problemen/fouten die u zou kunnen krijgen en enkele productieprestaties die tips en trucs voor Redis optimaliseren.

problemen / fout die u & Production performance optimizing tips and tricks

Ten eerste, in de redis.conf en sentinel.conf, alle configuraties staan in een volgorde, dus verknoei de volgorde niet. Anders krijg je config fouten als volgt.

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

vanuit beveiligingsperspectief, Stel een wachtwoord in om te authenticeren met de master en slaves. Hiervoor kunt u eenvoudig de redis wijzigen.conf en sentinel.conf dienovereenkomstig met volgende config waarde.

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

maakt dat de TCP-backlog-instelling (Max-verbindingen) 511 is. U kunt die waarde dienovereenkomstig instellen (rekening houdend met uw serverspecificatie) met de volgende stappen.

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.

enkele waarschuwingen die u tegenkomt in de redis.log zou kunnen zijn,

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

mogelijk moet u THP of transparante enorme pagina uitschakelen.

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

het gebruik van UNIX-socket in plaats van tcp-poort 6379 zal ook bijdragen aan Redis-prestatiewinst.

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

om dit te bereiken, redis.conf moet worden gewijzigd in de volgende instelling.

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

bovendien kunt u, afhankelijk van uw use case, ook de optie Redis persistence instellen.

Als u wilt, kunt u persistentie helemaal uitschakelen, als u wilt dat uw gegevens bestaan zolang de server draait. Opmerking: U kunt RDB-persistentie uitschakelen door alle “save” – regels in redis te becommentariëren.conf als volgt.

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

AoF persistance (alleen Bestand toevoegen) is standaard uitgeschakeld in redis.conf.

appendonly no

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

Monitoring Redis

vanuit Monitoringperspectief zijn er verschillende hulpmiddelen om Redis te monitoren. NewRelic biedt geavanceerde mogelijkheden om Redis te monitoren en te analyseren, waaronder “de meeste tijd verbruikt db operaties”, “operaties door doorvoer”, “operaties door query tijd” en etc.

meer informatie over nieuwe relikwie Redis wordt hier vermeld. Daarnaast is Redis-stat ook een goede opensource Redis monitoring tool.

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

AWS ElasticCache

AWS biedt ook een in-memory cache cloud service genaamd “ElastiCache”, die ook wordt geleverd met Redis meegeleverd. Het kan worden gespecificeerd als een effectieve eenvoudig te gebruiken cloud service, die offloads de meeste van de handmatige configuraties en administratieve taken.

ElastiCache is een webservice die het gemakkelijker maakt om een gedistribueerde in-memory cache in de cloud te starten, beheren en schalen.

interessant, het wordt geleverd met fantastische geavanceerde functies, zoals Cluster modus met sharding binnen enkele klikken, Multi-AZ met Auto-Failover, encryptie in rust, encryptie in-transit, Import RDB-bestand naar S3, inschakelen van automatische back-ups en nog veel meer.

coolste functie van AWS Elastischcache is dat, het biedt een uitgebreide monitoring dashboard voor uw Redis cluster met inbegrip van monitoring aspecten zoals CPU/geheugen gebruik (Swap en vrij geheugen), verbinding tellen, item count, uitzettingen, String;sleutel;Hash gebaseerde commando count, replicatie lag en nog veel meer.

nou … dat is het zo ‘ n beetje voor deze post!

zoals ik in het begin van dit bericht al zei, zijn er tal van verschillende Redis artikelen, maar ik wilde een “alles in een goed artikel” maken met de meest essentiële feiten en tips die nodig zijn en nuttig voor een ontwikkelaar of een DevOps engineer om een zeer beschikbare Redis cluster te bouwen met Sentinel.

voordat ik dit bericht afrondde, was een van de interessante artikelen die ik vond hoe Flickr Redis Sentinel implementeerde. Zorg ervoor dat u die post ook controleren.

oké. Dus heel erg bedankt voor het lezen van dit artikel en ik kijk ernaar uit om te komen met een ander interessant artikel binnenkort, het delen van mijn ervaring als ontwikkelaar. Tot dan, Proost! en veel succes met programmeren!