Я потратил много дней, пытаясь отправить несколько команд в кластер 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 updatesEndpoint 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, он использовал последний хост в соединении
Thread.Sleep(5000)
послеConnectionMultiplexer.Connect
? - person thepirat000   schedule 19.12.2016