Java-клиент не может подключиться к Redis Sentinel, работающему на локальном хосте - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть 3 экземпляра Redis Server и 3 экземпляра Redis Sentinel на моем локальном хосте.Серверы работают по адресу:

127.0.0.1:6379 // Master
127.0.0.1:6380 // Slave
127.0.0.1:6381 // Slave

, а стражи работают по адресу:

127.0.0.1:5000
127.0.0.1:5001
127.0.0.1:5002

У меня есть клиент (Java), который пытается подключиться к одному из часовых и установитьключи на сервере redis:

// import statements

public class RedisPush {

    private static final String MASTER_NAME = "mymaster";
    private static final String PASSWORD = "foobared";
    private static final Set sentinels;
    static {
        sentinels = new HashSet();
        sentinels.add("127.0.0.1:5000");
        sentinels.add("127.0.0.1:5001");
        sentinels.add("127.0.0.1:5002");
    }

    public static void pushToRedis() {

        Jedis jedis = null;

        try {
            JedisSentinelPool pool = new JedisSentinelPool(MASTER_NAME, sentinels);
            System.out.println("Fetching connection from pool.");
            jedis = pool.getResource();
            jedis.auth(PASSWORD);
            Socket socket = jedis.getClient().getSocket();

            System.out.println("Connected to " + socket.getRemoteSocketAddress());
            int i = 0;
            while (true) {
                jedis.set("sentinel_key" + i, "value" + i);
                System.out.println(i);
                i++;
                Thread.sleep(1000);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            if(jedis != null)
                jedis.close();
        }

    }

    public static void main(String[] args) throws Exception {

        while(true) {

            pushToRedis();
            Thread.sleep(1000);
        }
    }
}

Первоначально моя конфигурация стража была следующей (например, первый страж, работающий на порту 5000):

bind 127.0.0.1
port 5000
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel auth-pass mymaster foobared

Если я пытаюсьЗапустив мой (Java) клиент, я получаю следующую ошибку:

Nov 23, 2018 1:52:57 AM redis.clients.jedis.JedisSentinelPool initSentinels
INFO: Trying to find master from available Sentinels...
Nov 23, 2018 1:52:57 AM redis.clients.jedis.JedisSentinelPool initSentinels
WARNING: Cannot get master address from sentinel running @ 192.168.0.102:5001. Reason: redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused (Connection refused). Trying next one.
Nov 23, 2018 1:52:57 AM redis.clients.jedis.JedisSentinelPool initSentinels
WARNING: Cannot get master address from sentinel running @ 192.168.0.102:5000. Reason: redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused (Connection refused). Trying next one.
Nov 23, 2018 1:52:57 AM redis.clients.jedis.JedisSentinelPool initSentinels
WARNING: Cannot get master address from sentinel running @ 192.168.0.102:5002. Reason: redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused (Connection refused). Trying next one.
redis.clients.jedis.exceptions.JedisConnectionException: All sentinels down, cannot determine where is mymaster master is running...
    at redis.clients.jedis.JedisSentinelPool.initSentinels(JedisSentinelPool.java:180)
    at redis.clients.jedis.JedisSentinelPool.<init>(JedisSentinelPool.java:95)
    at redis.clients.jedis.JedisSentinelPool.<init>(JedisSentinelPool.java:82)
    at redis.clients.jedis.JedisSentinelPool.<init>(JedisSentinelPool.java:70)
    at redis.clients.jedis.JedisSentinelPool.<init>(JedisSentinelPool.java:44)
    at RedisPush.pushToRedis(RedisPush.java:29)
    at RedisPush.main(RedisPush.java:61)

Однако, если я изменяю свой конфигурационный скрипт стража на следующий:

# bind 127.0.0.1
port 5000
protected-mode no
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel auth-pass mymaster foobared

, клиент работает отлично.Я не понимаю почему.

AFAIK, если requirepass не задано в sentinel.conf файле И bind прокомментировано в sentinel.conf файле, ТОЛЬКО тогда protected-mode будет yes, чтобы избежать подключения любого клиента к стражукроме localhost.В моей первой конфигурации дозорного у меня была команда bind, но она все еще не работала.

Почему работает комментирование bind и явная установка protected-mode в no?

PS Я также пытался иметь и bind 127.0.0.1, и protected-mode no, но даже это не сработало.

1 Ответ

0 голосов
/ 10 мая 2019

У меня была похожая проблема, когда Jedis выдавал ту же ошибку, она была связана с https://github.com/xetorthio/jedis/issues/1367

Чтобы обойти это на моем Mac, я сделал sudo ifconfig lo0 alias 127.0.1.1 Затем изменил мой sentinel.conf на bind 127.0.1.1 а затем обновил мой yaml для данных весны, чтобы подключиться к этому ip

sentinel.nodes: 127.0.1.1:5000, 127.0.1.1:5002, 127.0.1.1:5003
...