StackExchange.Redis.RedisServerException: NOAUTH Требуется аутентификация ОШИБКА после исправления ElastiCache - PullRequest
0 голосов
/ 31 октября 2019

Настройка Redis

  1. ElastiCache Redis
  2. Кластеризация
  3. SSL
  4. Версия 3.2.6
  5. Redis AUTH = Да

Клиент

  1. C #. Консольное приложение .Net Core
  2. StackExchange.Redis: 2.0.601

Иногда к нашему экземпляру Redis для ElastiCache применяются обновления AWS. Когда применяются эти обновления, все наши клиенты, использующие библиотеку StackExchance.Redis, начинают получать «StackExchange.Redis.RedisServerException: требуется проверка подлинности NOAUTH». ошибки. Мы должны перезапустить клиентов, и тогда все работает нормально.

Нам не удалось продублировать эту проблему за пределами обновления службы ElastiCache.

Вещи, которые мы пытались продублировать:

  1. Выключите Redis и перезапустите его
  2. Обновите версию
  3. Измените настройки SSL вперед и назад

Во всех этих случаях локальный клиент переподключался без проблем.

Мы не знаем, как продублировать эту проблему и как решить эту проблему. У меня была одна мысль - создать сердцебиение внутри каждого клиента, чтобы попытаться подключиться и прочитать ключ, если он потерпит неудачу, а затем восстановить соединение с Redis, но мы слепы, поскольку не можем дублировать его по требованию. Любая помощь будет принята с благодарностью.

Наш конструктор провайдера Redis

public RedisProvider(RedisConnectionSettings connectionSettings, ILogger logger)
        {
            options = new ConfigurationOptions()
            {
                Ssl = connectionSettings.SslEnabled,
                DefaultDatabase = connectionSettings.Database,
                Password = connectionSettings.Password,
                EndPoints = { connectionSettings.Connection }
            };

            try
            {
                connectionMultiplexer = ConnectionMultiplexer.Connect(options);
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message);
            }
            keysPrefix = $"{connectionSettings.KeyPrefix}:{_redisApplicationName}";
        }

Наш метод получения базы данных Redis, используемой при каждом вызове Redis

private IDatabase GetRedisDataBase()
{
            if (connectionMultiplexer == null)
            {
                connectionMultiplexer = ConnectionMultiplexer.Connect(options);
            }

            var redisDatabase = connectionMultiplexer.GetDatabase();

            return redisDatabase;
}
...