Как отправить несколько команд в кластер Redis с помощью библиотеки StackExchange.Redis

Я потратил много дней, пытаясь отправить несколько команд в кластер redis, используя другой подход, но все еще не нашел решений. В этом подходе используется StachExchange. У меня есть кластер Redis с 3 мастерами по 1 подчиненному устройству. порты 30001, 30002 и 30003 являются мастерами

вот мой код

using StackExchange.Redis;
using System;

namespace redis
{
    class Program
    {
        static void Main(string[] args)
        {
            ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("192.168.1.100:30001,192.168.1.100:30002,192.168.1.100:30003,connectTimeout=1000");
            IDatabase db = redis.GetDatabase();

            db.StringSet("mykey", "abcdefg");

            db.StringSet("mykey1", "11111");
            db.StringSet("mykey2", "2222");

            string value2 = db.StringGet("mykey2");
            Console.WriteLine(value2);
        }
    }
}

и ниже ошибка

Unhandled Exception: StackExchange.Redis.RedisServerException: Endpoint 127.0.0.1:30003 serving hashslot 14687 is not reachable at this point of time. Please check connectTimeout value. If it is low, try increasing it to give the ConnectionMultiplexer a chance to recover from the network disconnect.
   at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor`1 processor, ServerEndPoint server)
   at StackExchange.Redis.RedisBase.ExecuteSync[T](Message message, ResultProcessor`1 processor, ServerEndPoint server)
   at StackExchange.Redis.RedisDatabase.StringSet(RedisKey key, RedisValue value, Nullable`1 expiry, When when, CommandFlags flags)
   at redis.Program.Main(String[] args) in c:\users\xxxx\documents\visual studio 2015\Projects\redis\redis\Program.cs:line 31
Press any key to continue . . .

Я также провел некоторый эксперимент, запустив команды непосредственно в redis cli, и я замечаю перенаправление после отправки команд, которые, как мне кажется, вызывают проблему

перед отправкой команд я сделал flushall своим мастерам 30001, 30002 и 30003

xxxx@RedisServer:~/cluster-test/30003$ redis-cli -c -p 30001
127.0.0.1:30001> set mykey "abcdefg"
-> Redirected to slot [14687] located at 127.0.0.1:30003
OK
127.0.0.1:30003> set mykey1 "11111"
-> Redirected to slot [1860] located at 127.0.0.1:30001
OK
127.0.0.1:30001> set mykey2 "2222"
-> Redirected to slot [14119] located at 127.0.0.1:30003
OK
127.0.0.1:30003> get mykey
"abcdefg"
127.0.0.1:30003> get mykey1
-> Redirected to slot [1860] located at 127.0.0.1:30001
"11111"
127.0.0.1:30001> get mykey2
-> Redirected to slot [14119] located at 127.0.0.1:30003
"2222"
127.0.0.1:30003>

Мне нужна помощь в отправке этих команд в кластер Redis. код отлично работает на некластерном кстати

12/4 updates
Endpoint 127.0.0.1:30003 serving hashslot 14687 is not reachable at...

глядя на приведенный выше код ошибки, я изменил свое соединение, чтобы подключиться только к порту 30003

 ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("192.168.1.100:30003,connectTimeout=1000");
            IDatabase db = redis.GetDatabase();
            db.StringSet("mykey", "abcdefg");

и он смог подключиться и установить mykey

127.0.0.1:30003> get mykey
"abcdefg"

еще один тест

на этот раз я установил отладку в строке, где mykey1

 ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("192.168.1.100:30003,connectTimeout=1000");
            IDatabase db = redis.GetDatabase();
            db.StringSet("mykey", "abcdefg");
            db.StringSet("mykey1", "11111");

Строка mykey выполнена успешно, потому что мы подключаемся к узлу, которому принадлежит хэш-слот mykey. Но mykey1 имеет исключение, так как этот хэш-слот принадлежит узлу 30001

occurred in StackExchange.Redis.dll

Additional information: Endpoint 127.0.0.1:30001 serving hashslot 1860 is not reachable at this point of time. Please check connectTimeout value. If it is low, try increasing it to give the ConnectionMultiplexer a chance to recover from the network disconnect.

Я думаю, проблема в том, что клиент StackExchange.Redis не может узнать, к какому хэшлоту принадлежит ключ, потому что каждый ключ в кластере Redis имеет соответствующий хешлот, который принадлежит определенному главному узлу

еще один тест

mykey принадлежит к 30003, поэтому я сначала помещаю 192.168.1.100:30003 в строку подключения, затем я знаю, что mykey1 принадлежит 192.168.1.100:30001, поэтому я помещаю его сразу после 30003

ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("192.168.1.100:30003,192.168.1.100:30001,connectTimeout=1000");
            IDatabase db = redis.GetDatabase();
            db.StringSet("mykey", "abcdefg");
            db.StringSet("mykey1", "11111");

результат после отладки, исключение ниже возникает при установке mykey

An unhandled exception of type 'StackExchange.Redis.RedisServerException' occurred in StackExchange.Redis.dll

Additional information: Endpoint 127.0.0.1:30003 serving hashslot 14687 is not reachable at this point of time. Please check connectTimeout value. If it is low, try increasing it to give the ConnectionMultiplexer a chance to recover 

этот результат показал мне, что клиент использует 192.168.1.100:30001, он использовал последний хост в соединении


person Heero Yuy    schedule 02.12.2016    source источник
comment
Можете ли вы повторно запустить тесты, добавив Thread.Sleep(5000) после ConnectionMultiplexer.Connect?   -  person thepirat000    schedule 19.12.2016
comment
Какую версию библиотеки вы используете?   -  person thepirat000    schedule 19.12.2016
comment
это мой пакет ‹package id = StackExchange.Redis version = 1.1.608 targetFramework = net452 /› Я также добавил Thread.Sleep (5000) после ConnectionMultiplexer.Connect, но он добавил только 5-секундную задержку, а затем выдает «StackExchange.Redis. RedisServerException 'в db.StringSet (mykey, abcdefg);   -  person Heero Yuy    schedule 19.12.2016


Ответы (2)


Теоретически да. Все биты есть. Однако библиотека авторы в настоящее время не используют кластер (потому что в ней отсутствует функция, ориентированная на DC, которая включена в дорожную карту для 4.2). Чтобы помочь с тестированием, мы недавно улучшили доступ к конфигурациям кластера; Я постараюсь пропустить ваш образец через это. Однако мне было бы действительно интересно, если бы вы могли запустить точно такой же тест между библиотекой и командной строкой - в вашем примере здесь ключи на самом деле разные. Мне бы хотелось увидеть, что там написано для тех же самых ключей.

person Marc Gravell    schedule 03.12.2016
comment
Спасибо за ваше время. Я повторно запустил свои ключи кода в ключи командной строки - person Heero Yuy; 03.12.2016
comment
Спасибо. По крайней мере, хорошая новость заключается в том, что он правильно понимает все аспекты шардинга и разрешения. Плохая новость заключается в том, что он не может разговаривать с сервером. Я не знаю, почему из головы. Но мы активно наращиваем наши кластерные тесты и поддержку, что может помочь, если есть врожденная проблема. Вы также можете попробовать передать средство записи текста в API подключения, чтобы увидеть, что он говорит. - person Marc Gravell; 03.12.2016
comment
Спасибо, отметка, я сделал еще один тест. см. обновления 12/4 выше. я надеюсь, что это поможет - person Heero Yuy; 04.12.2016
comment
Я думаю, что проблема в том, что клиент StackExchange.Redis не может знать, к какому хеш-алгоритму принадлежит ключ, потому что каждый ключ в кластере Redis имеет соответствующий хэш-код, который принадлежит определенному главному узлу - он не знает. Даже если вы поместите в конфиг только один сервер, он знает. Он просто не мог его найти. Мне нужно выяснить почему. - person Marc Gravell; 04.12.2016

Это могло произойти из-за ошибки перекрестного слота.

Взгляните: Ошибка слота Redis Cross

person doodhwala    schedule 07.12.2016