我正在尝试使用 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()