Java 客户端无法连接到在本地主机上运行的 Redis Sentinel

标签 java redis jedis redis-sentinel redis-server

我在本地主机中设置了 3 个 Redis 服务器和 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 服务器中设置 key :

// 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);
        }
    }
}

最初我的sentinel配置如下(比如第一个sentinel运行在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

客户端完美运行。我不明白为什么。

据我所知,如果 sentinel.conf 文件中未设置 requirepass 并且 sentinel.conf 中注释了 bind > 文件,只有这样 protected-mode 才会是 yes 以避免任何客户端连接到除 localhost 之外的哨兵。在我的第一个 sentinel 配置中,我有 bind 命令,但它仍然不起作用。

为什么注释掉 bind 并将 protected-mode 显式设置为 no 有效?

附言我还尝试同时设置 bind 127.0.0.1protected-mode no 但即使那样也没有用。

最佳答案

我有一个类似的问题,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 以获取 spring 数据以连接到该 ip

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

关于Java 客户端无法连接到在本地主机上运行的 Redis Sentinel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53437726/

相关文章:

java - 如何正确编码和解码Base64字符串?

ruby - 使用 redis 和 ruby​​ 发布/订阅消息传递

java - 使用jedis如何缓存Java对象

java - Java 中 Redis 的监听器

java - 改变循环类型以消除效率低下的问题

java - 使用 Java 获取每个内核的 CPU 负载

java - 由于环境变量,Eclipse 无法打开

json - Redis/Rejson 嵌套文档层次结构性能

redis - Redis geo 有存储多边形的能力吗?

java - Jedis "couldn' t get pool resource"on a Storm topology