Redis Cluster je nativní implementace shardingu dostupná v Redis, která vám umožňuje automaticky distribuovat vaše data mezi více uzlů, aniž byste se museli spoléhat na externí nástroje a utility. Ve ScaleGrid jsme nedávno přidali podporu pro Redis™* Clusters na naši plně spravovanou platformu prostřednictvím našeho hostingu pro plány Redis™. V tomto příspěvku vám představíme pokročilé možnosti sdílení Redis Cluster, prodiskutujeme jeho výhody a omezení, kdy byste je měli nasadit a jak se připojit k vašemu Redis Cluster.
Sharding s Redis Cluster
Celý klíčový prostor v Redis Clusters je rozdělen do 16384 slotů (nazývaných hash sloty) a tyto sloty jsou přiřazeny více uzlům Redis. Daný klíč je namapován na jeden z těchto slotů a hash slot pro klíč se vypočítá takto:
HASH_SLOT =CRC16(klíč) mod 16384
Operace s více klíči jsou na clusterech Redis podporovány, pokud všechny klíče zapojené do provádění jednoho příkazu patří do stejného hashovacího slotu. To lze zajistit pomocí konceptu hash tagů.
Specifikace Redis Cluster je definitivním průvodcem k pochopení vnitřností technologie, zatímco Redis Cluster Tutorial poskytuje pokyny pro nasazení a správu.
Výhody
Podívejte se na hlavní výhody Redis Clusters a zjistěte, jak mohou být přínosem pro vaše nasazení:
-
Vysoký výkon
Redis Cluster slibuje stejnou úroveň výkonu jako samostatná nasazení Redis.
-
Vysoká dostupnost
Redis Cluster podporuje standardní konfiguraci Redis master-replika, aby byla zajištěna vysoká dostupnost a odolnost. Implementuje také konsenzuální přístup podobný Raftu, aby byla zajištěna dostupnost celého clusteru.
-
Horizontální a vertikální škálovatelnost
Přidání nebo odebrání nových uzlů Redis z Clusteru může probíhat transparentně a bez jakýchkoli prostojů. To usnadňuje přidávání a odstraňování úlomků, vyřazování nebo škálování jednotlivých uzlů.
-
Nativní řešení
Nasazení Redis Clusters nevyžaduje žádné externí proxy ani nástroje, takže se nemusíte učit žádné nové nástroje nebo se o ně starat. Poskytuje také téměř úplnou kompatibilitu se samostatnými nasazeními Redis.
Omezení
Uvědomme si také omezení, abychom zajistili, že je to správné pro vaše nasazení:
-
Vyžaduje zákaznickou podporu
Klienti musí provést změny, aby mohli podporovat Redis Clusters. Přestože Redis Clusters existují již mnoho let, stále existují klienti, kteří je nepodporují. Než se rozhodnete nasadit Redis Clusters, podívejte se do dokumentace klienta Redis a ujistěte se, že klient, kterého používáte, je podporován.
-
Omezená podpora víceklíčových operací
Jak bylo zmíněno v předchozí části, operace s více klávesami jsou podporovány pouze v případě, že všechny klíče v jedné operaci patří do stejného slotu. Na to je třeba dávat pozor při navrhování datových struktur.
-
Podporuje pouze jednu databázi
Na rozdíl od samostatných databází podporují Redis Clusters pouze jednu databázi (databázi 0) a příkaz SELECT není povolen. Vzhledem k tomu, že většina lidí nepoužívá více databází, není to také zásadní omezení.
Kdy byste měli nasadit Redis Cluster?
Řešení Redis Cluster se pro vás může hodit, pokud potřebujete rozbité řešení Redis. Redis Cluster je nativní řešení, které je jednoduché a nabízí skvělý výkon.
Lidé obvykle začnou uvažovat o sdílení svých nasazení Redis, když začnou zaplňovat samostatný uzel Redis zápisy a chtějí rozšířit zápisy do více uzlů. I když je Redis primárně jednovláknový, I/O se obvykle stanou sítí nebo pamětí vázány na samostatný, než mohou začít zahlcovat CPU. Vázání paměti lze do určité míry překonat tím, že se rozhodnete přidat více paměti do samostatného systému, ale od určitého bodu to začíná být neúnosné z hlediska nákladů, zálohování, restartu, zahřívání atd.
Na druhou stranu, pokud chcete pouze rozšířit své čtení mezi více uzlů, je mnohem snazší přidat přečtené repliky do samostatného.
Ve srovnání s jinými řešeními shardingu pro Redis je rebalancování shardů v Redis Clusters pro aplikace transparentní. Díky tomu je velmi snadné přidávat nebo odebírat úlomky bez ovlivnění aplikace.
Úvod do #Redis Cluster Sharding – Výhody, omezení, kdy nasadit a připojení klientů Kliknutím na Tweet
Připojení ke clusteru Redis
Pokud se rozhodnete nasadit Redis™ Cluster s ScaleGrid, získáte plně funkční nasazení Redis Cluster, které je zcela kompatibilní se standardní verzí.
Pokud právě začínáte, zaregistrujte se k bezplatné 30denní zkušební verzi konzole ScaleGrid a prohlédněte si tuto dokumentaci o vytvoření prvního nasazení ScaleGrid pro Redis™.
Zde je to, co potřebujete k připojení ke clusteru Redis™ na ScaleGrid:
- Seznam názvů uzlů
- Porty
- Ověřovací řetězec
Karta Přehled na stránce s podrobnostmi o nasazení Redis™ obsahuje seznam hlavních serverů každého fragmentu spolu s čísly portů a ověřovacími informacemi:
Případně je seznam všech uzlů clusteru dostupný na kartě Počítače:
Jak jste si mohli všimnout, není k dispozici mnoho příkladů, které by vám ukázaly, jak se připojit ke clusteru Redis™ s povoleným ověřováním dostupným online, zde je několik příkladů využívajících oblíbené klienty.
Připojení s Javou
Mezi oblíbenými klienty Redis Java podporují clustery Redis™ Clusters Jedis a Lettuce. Jako příklad si vezmeme Jedise.
Jedisové
Spojení Redis™ Cluster jsou abstrahována pomocí JedisCluster třída. Nejlepší příklady použití této třídy pro připojení k Redis™ Clusters lze nalézt v testech Jedis, zdrojovém kódu Jedis. Bohužel v tuto chvíli, kdy je zadána autentizace, JedisCluster konstruktor není příliš čistý. Zde je příklad, který zapíše 100 klíčů do Redis™ Cluster. Všimněte si, že protože klíče nejsou označeny, skončí v různých slotech na různých uzlech:
... import java.util.HashSet; import java.util.Set; import redis.clients.jedis.HostAndPort; import redis.clients.jedis.JedisCluster; import redis.clients.jedis.JedisPoolConfig; ... public class RedisClusterModeTest { public static final int DEFAULT_TIMEOUT = 5000; public static final int DEFAULT_REDIRECTIONS = 5; public static void main(String[] args) { Set jedisClusterNodes = new HashSet(); jedisClusterNodes.add(new HostAndPort("SG-example-1.servers.scalegrid.io, 6379)); jedisClusterNodes.add(new HostAndPort("SG-example-2.servers.scalegrid.io", 6379)); jedisClusterNodes.add(new HostAndPort("SG-example-3.servers.scalegrid.io", 6379)); jedisClusterNodes.add(new HostAndPort("SG-example-4.servers.scalegrid.io", 6379)); jedisClusterNodes.add(new HostAndPort("SG-example-5.servers.scalegrid.io", 6379)); jedisClusterNodes.add(new HostAndPort("SG-example-6.servers.scalegrid.io", 6379)); JedisCluster jedis = new JedisCluster(jedisClusterNodes, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT, DEFAULT_REDIRECTIONS, <auth>, new JedisPoolConfig()); for (int i = 0; i < 100; i++) { jedis.set("key" + i, "value" + i); } jedis.close(); } }
Argumenty konstruktoru jsou zdokumentovány v dokumentech Jedis API. Doporučujeme, abyste během vytváření clusteru pomocí Jedis specifikovali všechny uzly clusteru.
Spojení s Ruby
Nejoblíbenějším klientem Redis v Ruby je redis-rb. Podporuje také Redis™ Clusters, takže jej použijeme v našem příkladu.
Redis-rb
redis-rb verze 4.1.0 a vyšší mají podporu pro Redis™ Clusters. 'shluk' možnost je třeba zadat během inicializace připojení a přesnou sémantiku najdete v této dokumentaci. Zde je stejný program jako v příkladu Java výše v Ruby:
require 'redis' require 'pp' NODES = ["redis://SG-example-1.servers.scalegrid.io:6379", "redis://SG-example-2.servers.scalegrid.io:6379", "redis://SG-example-3.servers.scalegrid.io:6379", "redis://SG-example-4.servers.scalegrid.io:6379", "redis://SG-example-5.servers.scalegrid.io:6379", "redis://SG-example-6.servers.scalegrid.io:6379"] begin pp "Attempting connection..." redis = Redis.new(cluster: NODES, password: <auth>) 100.times { |i| redis.set("key#{i}", "value#{i}") } pp "Done..." redis.close rescue StandardError => e puts e.message end
Připojení k Node.js
Node_redis je nejoblíbenější klient Redis v Node.js. Zatím však oficiálně nepodporuje Redis™ Clusters. ioredis je další oblíbený klient Redis, který má podporu Redis™ Clusters, takže jej použijeme pro náš příklad Node.js.
ioredis
Dokumentace ioredis popisuje podrobnosti o dalších parametrech, které je nutné předat pro připojení k Redis™ Clusters, a základní příklad je také uveden v souboru README. Zde je příklad programu, který uživatele vyzve k zadání klíče a přečte jeho hodnotu z Redis™ Cluster:
const readline = require('readline'); const Redis = require('ioredis'); var cluster = new Redis.Cluster([{ port: 6379, host: 'SG-example-1.servers.scalegrid.io' }, { port: 6379, host: 'SG-example-2.servers.scalegrid.io' }, { port: 6379, host: 'SG-example-3.servers.scalegrid.io' }, { port: 6379, host: 'SG-example-4.servers.scalegrid.io' }, { port: 6379, host: 'SG-example-5.servers.scalegrid.io' }, { port: 6379, host: 'SG-example-6.servers.scalegrid.io' } ], { redisOptions: { password: '<auth>' } }); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, prompt: 'enter key> ' }); console.log('Welcome to the Redis Cluster reader. Enter the key which you want to read [Ctrl D to Exit]'); rl.prompt(); rl.on('line', (line) => { if (line.trim()) { cluster.get(line, function (err, result) { if (err) { console.error(err); } else { console.log("value: " + result); } rl.prompt(); }); } else { console.error("No input received"); rl.prompt(); } }).on('close', () => { console.log('\nterminating'); cluster.quit(); process.exit(0); });
Po instalaci nejnovějších verzí ovladačů Redis na klientské počítače byste měli být schopni spustit kterýkoli z těchto příkladů.
Pokud jste připraveni migrovat svá nasazení Redis na plně spravovanou platformu ScaleGrid pro hostování pro Redis™, podívejte se na úžasné funkce dostupné na konzole ScaleGrid prostřednictvím bezplatné 30denní zkušební verze. Náš hosting AWS pro plány Redis™ je dostupný ve 14 různých datových centrech po celém světě a my jsme jedinou službou pro Redis™, která vám umožňuje spravovat vaše nasazení v rámci vašeho vlastního cloudového účtu.