Я пытаюсь настроить 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
Спасибо
Я думаю, что у меня такая же точная конфигурация и в моем приложении. Я вижу, что сторожец потерял соединение и повторил попытку, но похоже, что он не пытается использовать доступные часовые. Это то, что я вижу в журнале «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 мс и повторная попытка. " Вы видите что-то не так с моей конфигурацией дозорного? –
Я понял это. На самом деле моя конфигурация неверна. Мне не нужно было кластеризации. Редизация Redis и достаточно дозорных процессов для мониторинга сервера - вот что мне нужно. И да весенняя попытка очень удобна. Я постараюсь сделать сообщение в блоге и связать его здесь. Спасибо, Крис. Весенние РОКИ. –
BTW, когда я обновился до spring-data-redis 1.0.5, моя градиентная сборка удалила зависимость jedis. Я бы получил ошибку компиляции, чтобы не найти JedisPoolConfig. Мне пришлось явно добавить эту зависимость в мою сборку. –