2014-04-18 2 views
11

Я использую StackExchange.Redis, чтобы поговорить с 3 разными экземплярами Redis: 1 в одной и той же подсети и 2 удаленно. Вот мой код конфигурации:StackExchange.Redis ConnectionMultiplexer.Connect() Непосредственно работает

var configurationOptions = new ConfigurationOptions 
{ 
    EndPoints = 
    { 
     { host, port } 
    }, 
    KeepAlive = 180, 
    Password = password, 
    DefaultVersion = new Version("2.8.5"), 
    // Needed for cache clear 
    AllowAdmin = true 
}; 

var connectionMultiplexer = ConnectionMultiplexer.Connect(configurationOptions); 

последняя линия бросает исключение соединение приблизительно 70% времени:

Не удалось подключиться к серверу (ов) Redis; для создания отключенного мультиплексора, отключить AbortOnConnectFail

Почему эта прерывистая и/или что я делаю неправильно? Когда я ping сервер Redis в командной строке, есть 0% потери пакетов и < 1 мс ответ. Сеть стабильна.

Спасибо!

EDIT

Вот что бревенчатые выходы, когда это не удается:

10.48.68.28:6379,keepAlive=180,version=2.8.5 

1 unique nodes specified 
Requesting tie-break from 10.48.68.28:6379 > __Booksleeve_TieBreak... 
Allowing endpoints 00:00:01 to respond... 
10.48.68.28:6379 did not respond 
10.48.68.28:6379 failed to nominate (WaitingForActivation) 
No masters detected 
10.48.68.28:6379: Standalone v2.8.5, master; keep-alive: 00:03:00; int: Connecting; sub: ConnectedEstablished, 1 active; not in use: DidNotRespond 
10.48.68.28:6379: int ops=0, qu=4, qs=0, qc=0, wr=0, socks=1; sub ops=2, qu=0, qs=0, qc=0, wr=0, subs=1, sync=2, socks=1 
Circular op-count snapshot; int: 0 (0.00 ops/s; spans 10s); sub: 0+2=2 (0.20 ops/s; spans 10s) 
Sync timeouts: 0; fire and forget: 0; last heartbeat: -1s ago 
Starting heartbeat... 
+0

Если вы передаете в TextWriter в качестве параметра журнала (StringWriter работает отлично) - что он говорит ? –

+0

LSO: это право при первом запуске? Первый раз? Мне интересно, сколько стоит JIT/Fusion/DNS/etc –

+0

Сразу при запуске, в первый раз. Когда я расширяю тайм-аут синхронизации до 30000 мс, это не помогает. Всегда ждет макс и терпит неудачу. Попробуйте «BookSleeve» прямо сейчас, чтобы узнать, работает ли он. – Haney

ответ

5

Я смог обходить его, установив ConnectTimeouton клиента при подключении к Redis. Вот мой код

ConnectionMultiplexer connection = 
     ConnectionMultiplexer.Connect("endpoint,password=password,ConnectTimeout=10000"); 
+1

это работает для меня. Спасибо :) – Sampath

3

Для меня эта ошибка, потому что общее число связи достигло своего максимального предела, т.е. 10K. Перезапуск клиента и уничтожение некоторых из них решило проблему. Вы можете проверить портал Azure и выяснить, достигли ли вы максимального предела для любого из ресурсов.

1

Я мог бы решить выше, делая это:

ошибка, вы получаете, как правило, признак того, что вы не установили abortConnect = ложь в строке подключения. Значение по умолчанию для abortConnect равно true, что делает его так, что StackExchange.Redis не будет автоматически подключаться к серверу при определенных условиях. Мы настоятельно рекомендуем вам установить abortConnect = false в строку подключения, чтобы SE.Redis автоматически повторно подключался в фоновом режиме, если происходит сбой сети.

Источник: https://stackoverflow.com/a/30918632/2236811

Так что мой Init() выглядит следующим образом

ConfigurationOptions co = new ConfigurationOptions() 
     { 
      SyncTimeout = 500000, 
      EndPoints = 
      { 
       {url,portNumber } 
      }, 
      AbortOnConnectFail = false // this prevents that error 
     }; 

     seClient = ConnectionMultiplexer.Connect(co); 

благодаря

Смежные вопросы