Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Wprowadzenie do Redis Cluster Sharding — zalety, ograniczenia, wdrażanie i połączenia z klientami

Redis Cluster to natywna implementacja shardingu dostępna w Redis, która umożliwia automatyczną dystrybucję danych między wieloma węzłami bez konieczności polegania na zewnętrznych narzędziach i narzędziach. W ScaleGrid niedawno dodaliśmy obsługę klastrów Redis™* na naszej w pełni zarządzanej platformie za pośrednictwem naszych planów hostingowych dla Redis™. W tym poście przedstawimy zaawansowane możliwości shardingu klastra Redis, omówimy jego zalety i ograniczenia, kiedy należy wdrożyć i jak połączyć się z klastrem Redis.

Sharding za pomocą klastra Redis

Cała przestrzeń klawiszy w klastrach Redis jest podzielona na 16384 sloty (zwane slotami haszowania), a te sloty są przypisane do wielu węzłów Redis. Dany klucz jest mapowany do jednego z tych slotów, a slot skrótu dla klucza jest obliczany jako:

HASH_SLOT =CRC16(klucz) mod 16384

Operacje wieloklawiszowe są obsługiwane w klastrach Redis, o ile wszystkie klucze zaangażowane w wykonanie pojedynczego polecenia należą do tego samego gniazda skrótu. Można to zapewnić za pomocą koncepcji hashtagów.

Specyfikacja klastra Redis jest ostatecznym przewodnikiem do zrozumienia elementów wewnętrznych technologii, natomiast samouczek dotyczący klastra Redis zawiera wskazówki dotyczące wdrażania i administrowania.

Zalety

Sprawdź najważniejsze zalety klastrów Redis, aby zobaczyć, jakie korzyści mogą odnieść Twoje wdrożenia:

  • Wysoka wydajność

    Klaster Redis obiecuje ten sam poziom wydajności, co samodzielne wdrożenia Redis.

  • Wysoka dostępność

    Redis Cluster obsługuje standardową konfigurację Redis master-replika, aby zapewnić wysoką dostępność i trwałość. Wdraża również podejście konsensusu podobne do Raft, aby zapewnić dostępność całego klastra.

  • Skalowalność pozioma i pionowa

    Dodawanie lub usuwanie nowych węzłów Redis z klastra może odbywać się w sposób przezroczysty i bez przestojów. Ułatwia to dodawanie i usuwanie fragmentów, wycofywanie lub skalowanie poszczególnych węzłów.

  • Rozwiązanie natywne

    Wdrażanie klastrów Redis nie wymaga żadnych zewnętrznych serwerów proxy ani narzędzi, więc nie ma nowych narzędzi, których trzeba się uczyć lub się o nie martwić. Zapewnia również prawie pełną kompatybilność z samodzielnymi wdrożeniami Redis.

Ograniczenia

Miejmy również świadomość ograniczeń, aby upewnić się, że jest odpowiedni dla twojego wdrożenia:

  • Wymaga obsługi klienta

    Klienci muszą wprowadzić zmiany w celu obsługi klastrów Redis. Chociaż klastry Redis istnieją już od wielu lat, nadal istnieją klienci, którzy ich nie obsługują. Zapoznaj się z dokumentacją klienta Redis, aby upewnić się, że klient, którego używasz, jest obsługiwany, zanim zdecydujesz się na wdrożenie klastrów Redis.

  • Ograniczona obsługa wielu klawiszy

    Jak wspomniano w poprzedniej sekcji, operacje wieloklawiszowe są obsługiwane tylko wtedy, gdy wszystkie klucze w jednej operacji należą do tego samego gniazda. Jest to coś, na co należy uważać podczas projektowania struktur danych.

  • Obsługuje tylko jedną bazę danych

    W przeciwieństwie do samodzielnych baz danych klastry Redis obsługują tylko jedną bazę danych (baza danych 0), a polecenie SELECT jest niedozwolone. Ponieważ większość ludzi nie korzysta z wielu baz danych, to również nie jest głównym ograniczeniem.

Kiedy należy wdrożyć klaster Redis?

Rozwiązanie Redis Cluster może być dla Ciebie dobrym rozwiązaniem, jeśli potrzebujesz podzielonego rozwiązania Redis. Klaster Redis to natywne rozwiązanie, które jest proste i oferuje doskonałą wydajność.

Zazwyczaj ludzie zaczynają patrzeć na sharding swoich wdrożeń Redis, gdy zaczynają nasycać samodzielny węzeł Redis zapisami i chcą rozłożyć zapisy na wiele węzłów. Mimo że Redis jest głównie jednowątkowy, wejścia/wyjścia zwykle stają się autonomiczne w sieci lub pamięci, zanim będą mogły zacząć nasycać procesor. Ograniczenie pamięci można do pewnego stopnia przezwyciężyć, wybierając więcej pamięci do samodzielnego systemu, ale po pewnym momencie zaczyna to stawać się zaporowe pod względem kosztów, tworzenia kopii zapasowych, ponownego uruchamiania, czasu nagrzewania itp.

Z drugiej strony, jeśli chcesz tylko rozłożyć odczyt na wiele węzłów, znacznie łatwiej jest po prostu dodać repliki odczytu do samodzielnego.

W porównaniu z innymi rozwiązaniami shardingu dla Redis, równoważenie shardów w klastrach Redis jest niewidoczne dla aplikacji. Ułatwia to dodawanie lub usuwanie fragmentów bez wpływu na aplikację.

Wprowadzenie do #Redis Cluster Sharding – zalety, ograniczenia, kiedy wdrożyć i połączenia klientaKliknij, aby tweetować

Łączenie z klastrem Redis

Jeśli zdecydujesz się wdrożyć klaster Redis™ za pomocą ScaleGrid, otrzymasz w pełni funkcjonalne wdrożenie klastra Redis, które jest całkowicie kompatybilne ze standardową wersją.

Jeśli dopiero zaczynasz, zarejestruj się, aby skorzystać z bezpłatnej 30-dniowej wersji próbnej w konsoli ScaleGrid i zapoznaj się z tą dokumentacją dotyczącą tworzenia pierwszego wdrożenia ScaleGrid for Redis™.

Oto, czego potrzebujesz, aby połączyć się z klastrem Redis™ w ScaleGrid:

  • Lista nazw węzłów
  • Porty
  • Ciąg uwierzytelniający

Karta Przegląd na stronie szczegółów wdrożenia Redis™ zawiera listę wzorców każdego fragmentu wraz z numerami portów i informacjami o uwierzytelnianiu:

Alternatywnie lista wszystkich węzłów klastra jest dostępna na karcie Maszyny:

Jak mogłeś zauważyć, nie jest dostępnych wiele przykładów pokazujących, jak połączyć się z klastrem Redis™ obsługującym uwierzytelnianie dostępnym online. Oto kilka przykładów wykorzystujących niektóre popularnych klientów.

Łączenie z Javą

Wśród popularnych klientów Redis Java, Jedis i Lettuce obsługują klastry Redis™. Weźmiemy za przykład Jedi.

Jedi

Połączenia klastra Redis™ są abstrahowane przez JedisCluster klasa. Najlepsze przykłady użycia tej klasy do łączenia się z klastrami Redis™ można znaleźć w testach Jedis, w kodzie źródłowym Jedis. Niestety w tej chwili, gdy określono uwierzytelnianie, JedisCluster Konstruktor nie jest bardzo czysty. Oto przykład zapisu 100 kluczy do klastra Redis™. Pamiętaj, że ponieważ klucze nie są otagowane, trafią do różnych miejsc w różnych węzłach:

...
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 konstruktora są udokumentowane w dokumentacji interfejsu API Jedis. Zalecamy określenie wszystkich węzłów klastra podczas tworzenia klastra za pomocą Jedis.

Łączenie z Rubim

Najpopularniejszym klientem Redis w Rubim jest redis-rb. Obsługuje również klastry Redis™, więc użyjemy go w naszym przykładzie.

Redis-rb

redis-rb wersje 4.1.0 i nowsze obsługują klastry Redis™. „Klaster” opcję należy określić podczas inicjowania połączenia, a dokładną semantykę można znaleźć w tej dokumentacji. Oto ten sam program, co w powyższym przykładzie Java w 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

Łączenie z Node.js

Node_redis to najpopularniejszy klient Redis w Node.js. Jednak nie obsługuje jeszcze oficjalnie klastrów Redis™. ioredis to kolejny popularny klient Redis, który obsługuje klastry Redis™, więc użyjemy tego w naszym przykładzie Node.js.

ioredis

Dokumentacja ioredis opisuje szczegóły dodatkowych parametrów, które należy przekazać, aby połączyć się z klastrami Redis™, a podstawowy przykład znajduje się również w pliku README. Oto przykładowy program, który prosi użytkownika o klucz i odczytuje jego wartość z klastra Redis™:

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);
});

Powinieneś być w stanie wykonać dowolny z tych przykładów po zainstalowaniu najnowszych wersji sterowników Redis na komputerach klienckich.

Jeśli jesteś gotowy na migrację wdrożeń Redis do w pełni zarządzanej platformy ScaleGrid w celu hostingu dla Redis™, sprawdź niesamowite funkcje dostępne na konsoli ScaleGrid poprzez bezpłatny 30-dniowy okres próbny. Nasz hosting AWS dla planów Redis™ jest dostępny w 14 różnych centrach danych na całym świecie i jesteśmy jedyną usługą dla Redis™, która umożliwia zarządzanie wdrożeniami na własnym koncie w chmurze.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Wsparcie Redis na indeksie wtórnym

  2. Zwiększanie setek liczników na raz, redis czy mongodb?

  3. Jak buforować duże obiekty za pomocą pamięci podręcznej Redis

  4. Jak przechowywać element listy w pamięci podręcznej Redis

  5. Redis i wartości zapytań