Redis
 sql >> база данни >  >> NoSQL >> Redis

Въведение в Redis Cluster Sharding – предимства, ограничения, внедряване и клиентски връзки

Redis Cluster е естествената реализация на разделяне, налична в Redis, която ви позволява автоматично да разпространявате данните си в множество възли, без да се налага да разчитате на външни инструменти и помощни програми. В ScaleGrid наскоро добавихме поддръжка за Redis™* клъстери на нашата напълно управлявана платформа чрез нашия хостинг за планове Redis™. В тази публикация ще ви запознаем с разширените възможности за споделяне на Redis Cluster, ще обсъдим предимствата и ограниченията му, кога трябва да внедрите и как да се свържете с вашия Redis Cluster.

Шардиране с Redis Cluster

Цялото ключово пространство в Redis Clusters е разделено на 16384 слота (наречени хеш слотове) и тези слотове са присвоени на множество Redis възли. Даден ключ се съпоставя с един от тези слотове и хеш слотът за ключ се изчислява като:

HASH_SLOT =CRC16(ключ) мод 16384

Операции с няколко клавиша се поддържат в Redis клъстери, стига всички ключове, участващи в изпълнение на една команда, да принадлежат на един и същ хеш слот. Това може да се гарантира с помощта на концепцията за хеш тагове.

Спецификацията на Redis Cluster е окончателното ръководство за разбиране на вътрешните елементи на технологията, докато Redis Cluster Урокът предоставя указания за внедряване и администриране.

Предимства

Разгледайте основните предимства на Redis Clusters, за да видите как може да е от полза за внедряването ви:

  • Висока производителност

    Redis Cluster обещава същото ниво на производителност като самостоятелните внедрявания на Redis.

  • Висока наличност

    Redis Cluster поддържа стандартната конфигурация на главната реплика на Redis, за да гарантира висока наличност и издръжливост. Той също така прилага консенсусен подход, подобен на Raft, за да гарантира наличността на целия клъстер.

  • Хоризонтална и вертикална мащабируемост

    Добавянето или премахването на нови възли на Redis от клъстера може да става прозрачно и без прекъсване. Това прави лесно добавянето и премахването на фрагменти, оттеглянето или мащабирането на отделни възли.

  • Нативно решение

    Разгръщането на Redis Clusters не изисква външни прокси сървъри или инструменти, така че няма нови инструменти, които трябва да научите или да се притеснявате. Освен това осигурява почти пълна съвместимост със самостоятелни разгръщания на Redis.

Ограничения

Нека също така да сме наясно с ограниченията, за да гарантираме, че е подходящ за внедряването ви:

  • Изисква клиентска поддръжка

    Клиентите трябва да направят промени, за да поддържат Redis клъстери. Въпреки че Redis Clusters съществуват от много години, все още има клиенти, които не го поддържат. Вижте документацията на клиента Redis, за да се уверите, че клиентът, който използвате, се поддържа, преди да изберете да разположите Redis клъстери.

  • Ограничена поддръжка за операции с няколко клавиша

    Както бе споменато в предишния раздел, операциите с няколко клавиша се поддържат само когато всички ключове в една операция принадлежат на един и същ слот. Това е нещо, за което трябва да внимавате, когато проектирате вашите структури от данни.

  • Поддържа само една база данни

    За разлика от самостоятелните бази данни, Redis Clusters поддържа само една база данни (база данни 0) и командата SELECT не е разрешена. Тъй като повечето хора не използват множество бази данни, това също не е основно ограничение.

Кога трябва да разположите Redis клъстер?

Решението Redis Cluster може да е подходящо за вас, ако имате нужда от разчленено Redis решение. Redis Cluster е естествено решение, което е просто и предлага страхотна производителност.

Обикновено хората започват да разглеждат споделянето на своите внедрявания на Redis, когато започнат да насищат самостоятелен Redis възел с записи и искат да разпределят записите до множество възли. Въпреки че Redis е предимно еднонишков, I/O обикновено се обвързва самостоятелно в мрежа или памет, преди да започне да насища процесора. Обвързаността с паметта може да бъде преодоляна до известна степен, като изберете да добавите повече памет към самостоятелна система, но тя започва да става непосилна по отношение на разходите, архивирането, рестартирането, времето за загряване и т.н. след определен момент.

От друга страна, ако искате само да разпределите четенето си в множество възли, е много по-лесно просто да добавите реплики за четене към самостоятелния.

В сравнение с други решения за разделяне за Redis, ребалансирането на фрагменти в Redis Clusters е прозрачно за приложенията. Това прави много лесно добавянето или премахването на фрагменти, без да се засяга приложението.

Въведение в #Redis Cluster Sharding – предимства, ограничения, кога да се внедрят и клиентски връзки Щракнете за туит

Свързване към Redis клъстер

Ако изберете да внедрите Redis™ Cluster с ScaleGrid, получавате пълнофункционално внедряване на Redis Cluster, което е напълно съвместимо със стандартната версия.

Ако тепърва започвате, регистрирайте се за безплатна 30-дневна пробна версия на конзолата ScaleGrid и разгледайте тази документация за създаването на първото си внедряване на ScaleGrid за Redis™.

Ето какво ви трябва, за да се свържете с Redis™ Cluster в ScaleGrid:

  • Списък с имена на възли
  • Портове
  • Низ за удостоверяване

Разделът "Преглед" на вашата страница с подробности за внедряването на Redis™ съдържа списък с главните устройства на всеки шард, заедно с номера на портове и информация за удостоверяване:

Алтернативно, списъкът с всички възли на клъстера е достъпен в раздела Машини:

Както може би сте забелязали, не са налични много примери, показващи как да се свържете с активиран за удостоверяване Redis™ клъстер, наличен онлайн, ето няколко примера, използващи някои от популярните клиенти.

Свързване с Java

Сред популярните клиенти на Redis Java, Jedis и Lettuce поддържат Redis™ клъстери. Ще вземем джедаите за наш пример.

Джедаи

Redis™ Cluster връзките се абстрахират от JedisCluster клас. Най-добрите примери за използване на този клас за свързване с Redis™ клъстери могат да бъдат намерени в тестовете на Jedis, изходния код на Jedis. За съжаление в момента, когато е посочено удостоверяване, JedisCluster конструкторът не е много чист. Ето пример, който записва 100 ключа в Redis™ Cluster. Имайте предвид, че тъй като ключовете не са маркирани, те ще се окажат в различни слотове на различни възли:

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

Аргументите към конструктора са документирани в документите на Jedis API. Препоръчваме ви да посочите всички възли на клъстера по време на създаването на клъстер с Jedis.

Свързване с Ruby

Най-популярният Redis клиент в Ruby е redis-rb. Той също така поддържа Redis™ клъстери, така че ще го използваме в нашия пример.

Redis-rb

redis-rb версии 4.1.0 и по-нови имат поддръжка за Redis™ клъстери. 'клъстер' опцията трябва да бъде посочена по време на инициализацията на връзката и можете да се обърнете към тази документация за точна семантика. Ето същата програма като примера за Java по-горе в 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

Свързване с Node.js

Node_redis е най-популярният Redis клиент в Node.js. Въпреки това, той все още не поддържа официално Redis™ клъстери. ioredis е друг популярен клиент на Redis, който поддържа Redis™ клъстери, така че ще го използваме за нашия пример за Node.js.

ioredis

Документацията на ioredis описва подробностите за допълнителните параметри, които трябва да бъдат предадени за свързване с Redis™ клъстери, а основен пример също е предоставен в README. Ето примерна програма, която подканва потребителя за ключ и чете стойността му от 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);
});

Трябва да можете да изпълните някой от тези примери, след като инсталирате най-новите версии на драйверите на Redis на вашите клиентски машини.

Ако сте готови да мигрирате внедряванията си на Redis към напълно управляваната платформа на ScaleGrid за хостинг за Redis™, вижте невероятните функции, налични на конзолата ScaleGrid чрез безплатен 30-дневен пробен период. Нашите AWS хостинг за Redis™ планове са достъпни в 14 различни центъра за данни по целия свят и ние сме единствената услуга за Redis™, която ви позволява да управлявате внедряванията си в рамките на вашия собствен акаунт в облак.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. проблем с удостоверяване с частен канал laravel и laravel-echo-сървър

  2. Redis и заявка на стойности

  3. Въведение в Redis Data Structures:Bitmaps

  4. Отказ при отказ на клъстер

  5. Rails Resque смяна на лимит за работници?