当前位置: 首页 > 知识库问答 >
问题:

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

王英彦
2023-03-14

我在我的本地主机中设置了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服务器中设置密钥:

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

但是,如果我将sentinel配置脚本更改为下面的脚本:

# 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

为什么注释出绑定并显式地将protected-mode设置为no起作用?

附言。我还尝试使用绑定127.0.0.1保护模式NO,但即使这样也不起作用。

共有1个答案

姜学海
2023-03-14

我也遇到过类似的问题,Jedis抛出了相同的错误,它与https://github.com/xetorthio/Jedis/issues/1367有关

为了在mac上解决这个问题,我做了sudo ifconfig lo0别名127.0.1.1,然后将sentinel.conf更改为bind127.0.1.1,然后更新了spring数据的yaml以连接到该ip

sentinel.nodes: 127.0.1.1:5000, 127.0.1.1:5002, 127.0.1.1:5003
 类似资料:
  • 当我在我的本地机器上运行consul和bootstrap.properties中具有以下属性的Spring Boot客户端时,我可以看到它连接、发现服务并能够使用服务发现从一个服务连接到另一个服务。Bootstrap.properties: 但是现在,我在 openshift 上安装了领事,提供了通往它的路线。我可以浏览到领事UI,并看到领事服务已注册。但是当我尝试将在本地主机上运行的客户端连接到

  • 问题内容: 我正在尝试使用PyMySQL连接到本地主机上的MySQL: 但是(在Python 2.7和Python 3.2上)我得到了错误: socket.error:[Errno 111]连接被拒绝 pymysql.err.OperationalError:(2003年,“无法连接到’localhost’(111)上的MySQL服务器”) 我确定mysqld正在运行,因为我可以使用command

  • 试图连接一个简单的JMX监控。托管应用程序和监控工具位于同一台服务器上。当试图连接一个错误 00:30:55610致命http-8080-6 SiteListener:makeJmxConnection:99-java.io。IOException:检索RMIServer存根失败:javax.naming。ServiceUnavailableException[根异常为java.rmi.Conne

  • 我需要关于xde博览会的帮助。创建项目后,当我扫描二维码时,它会给我以下错误: 我的移动设备和笔记本电脑在同一个网络上。我正在使用: 它适用于隧道连接,但速度有点慢。

  • 问题内容: 当我尝试使用连接到Elasticsearch时, 它工作正常。 但是当我运行它时抛出一个错误说 无法连接到本地主机端口9200:连接被拒绝 如何解决这个错误? 问题答案: 默认情况下,它应该绑定到所有本地地址。因此,假设你没有使用防火墙在网络层的问题,唯一的ES设置我能想到是检查并确保其未设置或设置为或或正确的IP地址为您的网络。 更新:根据ES 2.3中的注释,您应该进行设置。

  • 大家好,我是Docker的新手,我想通过在官方网站上学习教程来熟悉Docker。现在我被困在教程的第2部分(你可以在这里查看链接)= 我有示例应用程序代码、Dockerfile和要求。txt与官方教程完全相同 我的Dockerfile是这样的 所有3个文件的文件内容/代码也与教程完全相同。我能够用这个命令构建镜像注册表 一切看起来都很好。现在我有了样本项目图像注册表。 然后,我根据官方教程使用此命