sql >> Databasteknik >  >> NoSQL >> Redis

Redis Sentinel

Redis Sentinel är den officiella rekommendationen för att köra en högst tillgänglig Redis-konfiguration genom att köra ett antal ytterligare redis sentinel-processer för att aktivt övervaka befintliga redis master- och slavinstanser för att säkerställa att var och en fungerar som förväntat. Om det i samförstånd fastställs att mastern inte längre är tillgänglig kommer den automatiskt att övertas och marknadsföra en av de replikerade slavarna som den nya mastern. Vaktposterna upprätthåller också en auktoritativ lista över tillgängliga redis-instanser som ger kunderna ett centralt arkiv för att upptäcka tillgängliga instanser de kan ansluta till.

Stöd för Redis Sentinel är tillgängligt med RedisSentinel klass som lyssnar på tillgängliga Sentinels för att hämta sin lista över tillgängliga master-, slav- och andra sentinel redis-instanser som den använder för att konfigurera och underhålla Redis Client Managers, och initierar eventuella failovers när de rapporteras.

Användning #

För att använda det nya Sentinel-stödet, istället för att fylla Redis Client Managers med anslutningssträngen för master- och slavinstanserna skulle du skapa en enda RedisSentinel instans konfigurerad med anslutningssträngen för de körande Redis Sentinels:

var sentinelHosts = new[]{ "sentinel1", "sentinel2:6390", "sentinel3" };
var sentinel = new RedisSentinel(sentinelHosts, masterName: "mymaster");

Detta visar ett typiskt exempel på att konfigurera en RedisSentinel som refererar till 3 sentinel-värdar (d.v.s. det minsta antalet för en högt tillgänglig installation som kan överleva vilken nod som helst som misslyckas). Den är också konfigurerad för att titta på mymaster konfigurationsuppsättning (standardhuvudgruppen).

INFO

Redis Sentinels kan övervaka mer än 1 master-/slavgrupp, var och en med olika mastergruppsnamn.

Standardporten för sentinels är 26379 (när det är ospecificerat) och eftersom RedisSentinel kan automatiskt upptäcka andra vaktposter, är den minsta konfigurationen som krävs bara:

var sentinel = new RedisSentinel("sentinel1");

INFO

Genomsökning och automatisk upptäckt av andra Sentinels kan inaktiveras med ScanForOtherSentinels=false

Börja övervaka Sentinels #

När du väl har konfigurerat kan du börja övervaka Redis Sentinel-servrarna och komma åt den förkonfigurerade klienthanteraren med:

IRedisClientsManager redisManager = sentinel.Start();

Som som tidigare kan registreras i din föredragna IOC som en singleton instans:

container.Register<IRedisClientsManager>(c => sentinel.Start());

Avancerad Sentinel Configuration #

RedisSentinel hanterar som standard en konfigurerad PooledRedisClientManager instans som löser båda master Redis-klienter för läs/skriv GetClient() och slavar för skrivskyddad GetReadOnlyClient() API:er.

Detta kan ändras för att använda den nyare RedisManagerPool med:

sentinel.RedisManagerFactory = (master,slaves) => new RedisManagerPool(master);

Custom Redis Connection String #

Värden som RedisSentinel är konfigurerad med gäller endast den Sentinel-värden, du kan fortfarande använda flexibiliteten hos Redis Connection Strings för att konfigurera de individuella Redis-klienterna genom att ange ett anpassat HostFilter :

sentinel.HostFilter = host => "{0}?db=1&RetryTimeout=5000".Fmt(host);

Detta kommer att returnera klienter som är konfigurerade för att använda Databas 1 och en Timeout för återförsök på 5 sekunder (används i den nya funktionen för automatiskt försök igen).

Annan RedisSentinel-konfiguration #

Även om ovanstående täcker den populära Sentinel-konfigurationen som vanligtvis skulle användas, nästan alla aspekter av RedisSentinel beteende är anpassningsbart med konfigurationen nedan:

OnSentinelMessageReceived Avslutas när Sentinel-arbetaren får ett meddelande från Sentinel-prenumerationen
OnFailover Avbröts när Sentinel misslyckas över Redis Client Manager till en ny master
OnWorkerError Avbröts när Redis Sentinel Worker-anslutningen misslyckas
IpAddressMap Mappa interna redis-värd-IP:er som returneras av Sentinels till dess externa IP
ScanForOtherSentinels Om rutinmässigt ska söka efter andra vaktvärdar (standard sant)
RefreshSentinelHostsAfter Vilket intervall som ska skannas efter andra sentinelvärdar (standard 10 minuter)
WaitBetweenFailedHosts Hur lång tid att vänta efter misslyckande innan du ansluter till nästa redis-instans (standard 250ms)
MaxWaitBetweenFailedHosts Hur länge du ska försöka ansluta till värdar igen innan du kastar (standard 60-tal)
WaitBeforeForcingMasterFailover Hur lång tid efter på varandra följande misslyckade försök att tvinga fram failover (standard 60s)
ÅterställWhenSubjectivelyDown Återställ klienter när Sentinel rapporterar att redis är subjektivt nere (standard sant)
ÅterställWhenObjectivelyDown Återställ klienter när Sentinel rapporterar att omdis är objektivt nere (standard sant)
SentinelWorkerConnectTimeoutMs Maximal anslutningstid för Sentinel Worker (standard 100ms)
SentinelWorkerSendTimeoutMs Max TCP-socket-sändningstid för Sentinel Worker (standard 100ms)
SentinelWorkerReceiveTimeoutMs Max TCP-socket-mottagningstid för Sentinel Worker (standard 100ms)

Konfigurera Redis Sentinel-servrar #

Redis config-projektet förenklar konfigurationen och körningen av en högtillgänglig Redis Sentinel-konfiguration med flera noder inklusive start/stopp-skript för att omedelbart ställa in den minimala högt tillgängliga Redis Sentinel-konfigurationen på en enda (eller flera) Windows-, OSX- eller Linux-servrar. Den här konfigurationen med en enda server/multiprocess är idealisk för att ställa in en fungerande vaktkonfiguration på en enda dev-arbetsstation eller fjärrserver.

Redis-config-förrådet innehåller även MS OpenTech Windows redis-binärfiler och kräver ingen mjukvaruinstallation.

Windows-användning #

För att köra den medföljande Sentinel-konfigurationen, klona redis-config-repo på servern du vill köra den på:

git clone https://github.com/ServiceStack/redis-config.git

Starta sedan 1x Master, 2x Slaves och 3x Sentinel redis-servrar med:

cd redis-config\sentinel3\windows
start-all.cmd

Avstängningsstartade instanser:

stop-all.cmd

Om du kör redis-processerna lokalt på din dev-arbetsstation är den minimala konfigurationen för att ansluta till de körande instanserna bara:

var sentinel = new RedisSentinel("127.0.0.1:26380");
container.Register(c => sentinel.Start());

Localhost vs nätverks-IP:s #

Sentinel-konfigurationen förutsätter att alla redis-instanser körs lokalt på 127.0.0.1 . Om du istället kör den på en fjärrserver som du vill att alla utvecklare i ditt nätverk ska kunna komma åt, måste du antingen ändra IP-adressen i *.conf filer för att använda servrarnas nätverks-IP. Annars kan du lämna standardinställningarna och använda RedisSentinel IP-adresskartfunktion för att transparent mappa lokala värd-IP:er till nätverks-IP:en som varje dator i ditt nätverk kan ansluta till.

T.ex. om detta körs på en fjärrserver med 10.0.0.9 Nätverks-IP, den kan konfigureras med:

var sentinel = new RedisSentinel("10.0.0.9:26380") {
    IpAddressMap = {
        {"127.0.0.1", "10.0.0.9"},
    }
};
container.Register(c => sentinel.Start());

Google Cloud – Klicka för att distribuera Redis #

Den enklaste molntjänsten vi har hittat som omedelbart kan konfigurera en Redis Sentinel-konfiguration med flera noder är att använda Google Clouds klicka för att distribuera Redis-funktion tillgänglig från Google Cloud Console under Deploy &Manage :

Klicka på Distribuera knappen låter dig konfigurera typ, storlek och plats där du vill distribuera Redis virtuella datorer. Se hela Click to Deploy Redis-guiden för en genomgång av hur du konfigurerar och inspekterar en mycket tillgänglig redis-konfiguration på Google Cloud.

Ändra för att använda RedisManagerPool #

Som standard använder RedisSentinel en PooledRedisClientManager , kan detta ändras för att använda den nyare RedisManagerPool med:

sentinel.RedisManagerFactory = (master,replicas) => new RedisManagerPool(master);

Börja övervaka Sentinels #

När du väl har konfigurerat kan du börja övervaka Redis Sentinel-servrarna och komma åt den förkonfigurerade klienthanteraren med:

IRedisClientsManager redisManager = sentinel.Start();

Som som tidigare kan registreras i din föredragna IOC som en singleton instans:

container.Register<IRedisClientsManager>(c => sentinel.Start());

Konfigurera Redis Sentinel-servrar #

Se redis config-projektet för ett snabbt sätt att konfigurera den minimala, högst tillgängliga Redis Sentinel-konfigurationen inklusive start/stopp-skript för att omedelbart köra flera redis-instanser på en enda (eller flera) Windows-, OSX- eller Linux-servrar.

Redisstatistik #

Du kan använda RedisStats klass för synlighet och introspektion i dina löptillfällen. Redis Stats-wikin listar tillgänglig statistik.

Automatiska återförsök #

För att förbättra motståndskraften hos klientanslutningar, RedisClient kommer transparent att försöka igen misslyckade Redis-operationer på grund av Socket- och I/O-undantag i en exponentiell backoff som börjar från 10ms fram till RetryTimeout av 10 000 ms . Dessa standardinställningar kan justeras med:

RedisConfig.DefaultRetryTimeout = 10000;
RedisConfig.BackOffMultiplier = 10;

  1. Kan inte installera mongodb doktrin i symfony2 med kompositör

  2. MongoDB - stängs av med kod:62

  3. MongoDB:Fruktansvärda MapReduce Performance

  4. MongoDB som en tidsseriedatabas