1

Я пытаюсь настроить HA для своих повторных экземпляров с помощью redis-sentinel. Я предполагаю, что мое приложение Java должно использовать RedisSentinelConfiguration для создания фабрики соединений. Поэтому у меня есть настройки подключение завод, как показано нижеИспользование RedisSentinelConfiguration не переходит к следующему доступному досмотру/ведущему

@Bean(name = "redisConnectionFactory") 
    public JedisConnectionFactory redisConnectionFactory() { 
     String redisHost = redisSystemProperties.getProperty("redis.host"); 
     int redisPort = redisSystemProperties.getIntegerProperty("redis.port", DEFAULT_REDIS_PORT); 
     logger.info(format("Creating redis connection factory. host: %s, port: %d", redisHost, redisPort)); 
     JedisConnectionFactory connectionFactory = new JedisConnectionFactory(redisSentinelConfig(), jedisPoolConfig()); 
     boolean usePool = Boolean.valueOf(redisSystemProperties.getProperty("pool.enabled", "true")); 
     connectionFactory.setUsePool(usePool); 
     connectionFactory.afterPropertiesSet(); 
     return connectionFactory; 
    } 

    @Bean(name ="redisSentinelConfig") 
    public RedisSentinelConfiguration redisSentinelConfig(){ 
     RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration(); 
     for (int i = 0; i < MAX_REDIS_MASTER_NODES; i++) { 
      String hostPropertyName = format("redis.%d.host", i); 
      String host = redisSystemProperties().getProperty(hostPropertyName); 
      String portPropertyName = format("redis.%d.port", i); 
      String portStr = redisSystemProperties().getProperty(portPropertyName); 
      if (StrUtils.anyBlank(host, portStr)) { 
       break; 
      } 
      int port = toInt(portStr); 
      Assert.isTrue(port > 0, format("Invalid value '%s' for property '%s'", portStr, portPropertyName)); 
      RedisNode redisNode = new RedisNode(host, port); 
      logger.info(format("Adding connection to redis sentinel [%d]: host: '%s', port: %d", i, host, port)); 
      sentinelConfig.addSentinel(redisNode); 
      sentinelConfig.setMaster("mymaster"); 
     } 
     return sentinelConfig; 
    } 

Число IP и порт, которые используются для создания RedisSentinelConfiguration является экземпляры дозорного я начал. Я запустил часового для каждого мастера. У меня есть 3 мастера, и 3 стража. Похоже, что приложение работает отлично до тех пор, пока запущен мастер-узел, который сопоставлен с часовым «mymaster». Как только я SHUTDOWN, что redis узел приложение не удается получить соединение. Я вижу, что соединение отклонено. Во время отладки я вижу, что он пытается создать соединение, используя одну конфигурацию Sentinel, которую он использовал в первой попытке.

Вот моя конфигурация дозорного устройства.

port 26379 

sentinel monitor mymaster 127.0.0.1 7000 2 
sentinel down-after-milliseconds mymaster 1 
sentinel failover-timeout mymaster 1 
sentinel config-epoch mymaster 0 
# Generated by CONFIG REWRITE 
dir "/Users/skandula/redis-3.0.2" 
sentinel leader-epoch mymaster 0 
sentinel known-sentinel mymaster 127.0.0.1 26380 e4bc16a7435eec64512acc03404beb9799dea73e 
sentinel known-sentinel mymaster 127.0.0.1 26381 493d598ce30dd4429bdc53c94cf297b8a0436c67 
sentinel current-epoch 0 

Может кто-нибудь сообщить мне, что я могу делать неправильно? Я использую пружинные данные Redis 1.5.0.RELEASE и Jedis-2.7.0

Спасибо

ответ

1

Там есть разрыв между аварийным переключением и фактической реализацией, чтобы забрать вновь избранный главный узел. Хотя сам Sentinel может быть настроен на переход на другой ресурс немедленно, реализация драйвера java, вероятно, немного позади. Вам нужно будет позаботиться об этих ситуациях.

Запуск sentinel example вы можете легко изучить поведение путем случайного выключения экземпляров Redis и/или Sentinel при просмотре ошибок командной строки и времени восстановления.

Вы также можете использовать spring-retry, чтобы перенести попытки записи на redis. Там есть билет (DATAREDIS-370), открытый для интеграции RetryTemplate - так что вы можете проголосовать за него.

+0

Я думаю, что у меня такая же точная конфигурация и в моем приложении. Я вижу, что сторожец потерял соединение и повторил попытку, но похоже, что он не пытается использовать доступные часовые. Это то, что я вижу в журнале «SEVERE: потерянное соединение с Sentinel на 127.0.0.1:26379. Спящий 5000 мс и повторная попытка. 23 июня 2015 г. 10:25:32 redis.clients.jedis.JedisSentinelPool $ МастерListener run SEVERE : Потерянное соединение с Sentinel на 127.0.0.1:26379. Спящая 5000 мс и повторная попытка. " Вы видите что-то не так с моей конфигурацией дозорного? –

+0

Я понял это. На самом деле моя конфигурация неверна. Мне не нужно было кластеризации. Редизация Redis и достаточно дозорных процессов для мониторинга сервера - вот что мне нужно. И да весенняя попытка очень удобна. Я постараюсь сделать сообщение в блоге и связать его здесь. Спасибо, Крис. Весенние РОКИ. –

+0

BTW, когда я обновился до spring-data-redis 1.0.5, моя градиентная сборка удалила зависимость jedis. Я бы получил ошибку компиляции, чтобы не найти JedisPoolConfig. Мне пришлось явно добавить эту зависимость в мою сборку. –