StackExchange.Redis ConnectionMultiplexer.Connect () периодически работает

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

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

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

Спасибо!

ИЗМЕНИТЬ

Вот что выводит журнал в случае сбоя:

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...

person Haney    schedule 18.04.2014    source источник
comment
Если вы передадите TextWriter в качестве параметра журнала (StringWriter отлично работает) - о чем он говорит?   -  person Marc Gravell    schedule 18.04.2014
comment
LSO: это правильно при первом запуске? Первый раз? Мне интересно, сколько стоит JIT / Fusion / DNS / и т. Д.   -  person Marc Gravell    schedule 18.04.2014
comment
Прямо при запуске, в первый раз. Когда я увеличиваю тайм-аут синхронизации до 30000 мс, это не помогает. Всегда ждет по максимуму и терпит неудачу. Пытаюсь прямо сейчас BookSleeve проверить, работает ли это.   -  person Haney    schedule 18.04.2014
comment
Любопытный. Очень любопытный. Вопрос: а ты ip указываешь? Или имя хоста?   -  person Marc Gravell    schedule 18.04.2014
comment
IP для одного из экземпляров, имя хоста для другого 2. Я пробую журнал сейчас и сообщу через секунду. Также данный процесс будет настроен только для 1 из 3 экземпляров (подумайте, DEV, QA, PROD)   -  person Haney    schedule 18.04.2014
comment
АГА! Получил, чтобы снова потерпеть неудачу, ждите журнала.   -  person Haney    schedule 19.04.2014
comment
qu = 4 меня очень интересует - он предполагает, что писатель не запускал. Подскажите, какую именно версию вы используете? По сути qu - это неотправленная очередь: есть 4 сообщения, которые по какой-то причине еще не были отправлены. Меня это беспокоит.   -  person Marc Gravell    schedule 19.04.2014
comment
Тот факт, что это скорее соединение, чем соединение, тоже интригует.   -  person Marc Gravell    schedule 19.04.2014
comment
@MarcGravell, на котором запущен последний пакет nuget 1.0.270.   -  person Haney    schedule 19.04.2014
comment
@MarcGravell, если я могу помочь тестированием, дайте мне знать. Рад сделать это. Просто хочу, чтобы это работало. :)   -  person Haney    schedule 19.04.2014
comment
длинные выходные здесь: я должен буду посмотреть, когда смогу. Помогает ли увеличение тайм-аута подключения?   -  person Marc Gravell    schedule 19.04.2014
comment
Нет, если я увеличу тайм-аут до 60 секунд, это займет 60 секунд. Что было бы в соответствии с тем, что вы не отправляете, потому что это вещь в очереди. Наслаждайтесь долгими выходными! Соберемся на следующей неделе. :)   -  person Haney    schedule 19.04.2014
comment
Тебе удалось с этим разобраться?   -  person Craig    schedule 21.05.2014
comment
@ Крейг, насколько мне известно, Марк все еще занимается этим. Если есть новая версия, вы можете попробовать обновиться до нее. На время я вернулся к BookSleeve, и он работал хорошо.   -  person Haney    schedule 21.05.2014


Ответы (4)


Мне удалось обойти это, установив ConnectTimeout на клиенте при подключении к Redis. Вот мой код

 ConnectionMultiplexer connection = 
        ConnectionMultiplexer.Connect("endpoint,password=password,ConnectTimeout=10000");
person pranav rastogi    schedule 25.11.2014

Кажется, это довольно распространенная проблема: https://github.com/StackExchange/StackExchange.Redis/issues/42

Я только что загрузил новую сборку и больше не видел проблемы. Пока что.

person shawn.r.stevens    schedule 29.05.2014

Я мог бы решить вышеперечисленное, выполнив следующие действия:

Ошибка, которую вы получаете, обычно является признаком того, что вы не установили abortConnect = false в строке подключения. Значение по умолчанию для abortConnect - истина, поэтому 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);

Благодарность

person ankur    schedule 25.10.2016

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

person Rocks    schedule 12.12.2014