首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java客户端无法连接到运行在本地主机上的Redis Sentinel

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

Stack Overflow用户
提问于 2018-11-23 04:36:51
回答 2查看 5.7K关注 0票数 4

我在本地主机上安装了3个Redis Server和3个Redis Sentinel实例。服务器在以下位置运行:

代码语言:javascript
复制
127.0.0.1:6379 // Master
127.0.0.1:6380 // Slave
127.0.0.1:6381 // Slave

哨兵的位置是:

代码语言:javascript
复制
127.0.0.1:5000
127.0.0.1:5001
127.0.0.1:5002

我有一个(Java)客户端,它尝试连接到其中一个前哨,并在redis服务器中设置密钥:

代码语言:javascript
复制
// 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上运行的第一个前哨):

代码语言:javascript
复制
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)客户端,我得到以下错误:

代码语言:javascript
复制
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)

但是,如果我将我的前哨配置脚本更改为以下脚本:

代码语言:javascript
复制
# 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之外的任何客户端连接到前哨。在我的第一个前哨配置中,我使用了bind命令,但它仍然不起作用。

为什么注释掉bind并将protected-mode显式设置为no会起作用?

另外,我也尝试过同时使用bind 127.0.0.1protected-mode no,但即使这样也不起作用。

EN

回答 2

Stack Overflow用户

发布于 2019-05-11 01:26:54

我遇到过一个类似的问题,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 for spring data以连接到那个ip

代码语言:javascript
复制
sentinel.nodes: 127.0.1.1:5000, 127.0.1.1:5002, 127.0.1.1:5003
票数 3
EN

Stack Overflow用户

发布于 2020-08-28 23:22:51

Jedis对Redis Sentinel的支持不是很好。用生菜代替,它有更好的池子管理。并且在springboot上也得到了很好的支持。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53437726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档