Jedis连接不上Redis Sentinel跑进Docker

问题描述 投票:0回答:0

我正在尝试使用 Jedis 库连接到运行在 Windows(Docker Desktop 或 Rancher Desktop)上的 Docker 中的 Redis Sentinel。 Sentinel 工作正常,如果我杀死 redis-master,它会将 master 重新配置为 slave,反之亦然。

Redis版本:7.0.11 绝地武士版本:4.3.2

Java日志:

19:22:49.315 [main] INFO redis.clients.jedis.JedisSentinelPool -- Trying to find master from available Sentinels...
19:22:49.319 [main] DEBUG redis.clients.jedis.JedisSentinelPool -- Connecting to Sentinel localhost:26379
19:22:49.447 [main] DEBUG redis.clients.jedis.JedisSentinelPool -- Found Redis master at 172.18.0.2:6379
19:22:49.448 [main] INFO redis.clients.jedis.JedisSentinelPool -- Redis master running at 172.18.0.2:6379, starting Sentinel listeners...
19:22:49.449 [main] INFO redis.clients.jedis.JedisSentinelPool -- Created JedisSentinelPool to master at 172.18.0.2:6379
Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: Failed to connect to any host resolved for DNS name.
    at redis.clients.jedis.DefaultJedisSocketFactory.connectToFirstSuccessfulHost(DefaultJedisSocketFactory.java:63)
    at redis.clients.jedis.DefaultJedisSocketFactory.createSocket(DefaultJedisSocketFactory.java:87)
    at redis.clients.jedis.Connection.connect(Connection.java:180)
    at redis.clients.jedis.Connection.initializeFromClientConfig(Connection.java:338)
    at redis.clients.jedis.Connection.<init>(Connection.java:53)
    at redis.clients.jedis.Jedis.<init>(Jedis.java:214)
    at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:181)
    at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:571)
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:298)
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:223)
    at redis.clients.jedis.util.Pool.getResource(Pool.java:34)
    at redis.clients.jedis.JedisSentinelPool.getResource(JedisSentinelPool.java:287)
    at com.example.demo.DemoApplication.main(DemoApplication.java:12)
    Suppressed: java.net.SocketTimeoutException: Connect timed out
        at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:546)
        at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597)
        at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327)
        at java.base/java.net.Socket.connect(Socket.java:633)
        at redis.clients.jedis.DefaultJedisSocketFactory.connectToFirstSuccessfulHost(DefaultJedisSocketFactory.java:73)

docker-compose.yml

version: '3.9'

networks:
  redis-network:
    name: "redis-network"
    driver: bridge

services:
  redis-master:
    container_name: redis-master
    image: redis
    ports:
      - "6379:6379"
    command: "redis-server /etc/redis.conf"
    volumes:
      - "./data/master:/data"
      - "./config/master.conf:/etc/redis.conf"
    networks:
      - redis-network

  redis-slave:
    container_name: redis-slave
    image: redis
    ports:
      - "6380:6379"
    command: "redis-server /etc/redis.conf"
    volumes:
      - "./data/slave:/data"
      - "./config/slave.conf:/etc/redis.conf"
    networks:
      - redis-network

  redis-sentinel:
    container_name: redis-sentinel
    image: bitnami/redis-sentinel:latest
    ports:
      - "26379:26379"
    command: "redis-server /etc/sentinel.conf --sentinel"
    volumes:
      - "./config/sentinel.conf:/etc/sentinel.conf"
    depends_on:
      - redis-master
      - redis-slave
    networks:
      - redis-network
public static void main(String[] args) {
    new JedisSentinelPool("mymaster", Set.of("localhost:26379")).getResource();
}

master.conf

bind 0.0.0.0
protected-mode no
port 6379

slave.conf

bind 0.0.0.0
protected-mode no
port 6379
replicaof redis-master 6379

哨兵.conf

protected-mode no
port 26379
daemonize no
pidfile /var/run/redis-sentinel.pid
logfile ""
dir /tmp
sentinel monitor mymaster redis-master 6379 1
sentinel down-after-milliseconds mymaster 3000
acllog-max-len 128
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 3000
sentinel deny-scripts-reconfig yes
SENTINEL resolve-hostnames yes
SENTINEL announce-hostnames no
SENTINEL master-reboot-down-after-period mymaster 0

我试过 ping

172.18.0.2
没问题,但是当我尝试在 6379 上远程登录时,它无法访问。 使用 Jedis 直接连接到 master 也可以:
new JedisPool("localhost", 6379).getResource()

docker-compose jedis redis-sentinel
© www.soinside.com 2019 - 2024. All rights reserved.