spring-boot - Lettuce无法连接到docker redis

标签 spring-boot docker docker-compose redis lettuce

我使用 docker-compose 创建了一个 redis 集群,当我尝试使用 java 应用程序(docker 也位于其中)从本地计算机连接该集群时,但在 jedis 连接到集群时生菜超时。 Lettuce 连接到主服务器 7001 7002 7003,之后它发现其他节点并再次尝试连接它们并超时。这是我的代码。

Docker-compose.yml

version: '3.8'

networks:
  redis-net:
    name: redis-net
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 10.0.0.0/16

services:

  redis-cluster:
    image: redis:latest
    container_name: redis-cluster
    command: redis-cli --cluster create 10.0.0.11:6379 10.0.0.12:6379 ... --cluster-replicas 1 --cluster-yes
    depends_on:
      - redis-1
      - redis-2
     ...
    networks:
      redis-net:
        ipv4_address: 10.0.0.2

  redis-1:
    build: ./redis
    container_name: redis-1
    image: redis-cluster-node
    networks:
      redis-net:
        ipv4_address: 10.0.0.11
    ports:
      - 7001:6379

  redis-2:
    image: redis-cluster-node
    container_name: redis-2
    networks:
      redis-net:
        ipv4_address: 10.0.0.12
    ports:
      - 7002:6379
    ...
      
  redis_commander:
    image: rediscommander/redis-commander:latest
    container_name: redis_web
    environment:
      REDIS_HOSTS: "local:redis-1:6379,local:redis-2:6379,..."
    ports:
      - "5000:8081"
    depends_on:
      - redis-1
      - redis-2
      ...
    networks:
      redis-net:
        ipv4_address: 10.0.0.3

Dockerfile

FROM redis:latest
COPY redis.conf /etc/redis/redis.conf
ENTRYPOINT ["redis-server","/etc/redis/redis.conf"]

redis.conf

port 6379
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
appendonly yes
maxmemory-policy volatile-lru
maxmemory 3gb
bind 0.0.0.0

测试类

public static void lettuce() {
        RedisURI node1 = RedisURI.Builder.redis("localhost",7001).build();
        RedisURI node2 = RedisURI.Builder.redis("localhost",7002).build();
        RedisURI node3 = RedisURI.Builder.redis("localhost",7003).build();

        RedisClusterClient redisClient = RedisClusterClient.create(Arrays.asList(node1, node2, node3));
        ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder().dynamicRefreshSources(false).build();

        redisClient.setOptions(ClusterClientOptions.builder()
                .topologyRefreshOptions(topologyRefreshOptions)
                .build());
        StatefulRedisClusterConnection<String, String> connection = redisClient.connect();
        RedisAdvancedClusterCommands<String, String> syncCommands = connection.sync();
        syncCommands.set("test key", "test value");
}

错误

2022-02-12 11:06:11.494  WARN 21392 --- [ioEventLoop-6-4] i.l.core.cluster.RedisClusterClient      : connection timed out: /10.0.0.12:6379
2022-02-12 11:06:21.530  WARN 21392 --- [ioEventLoop-6-5] i.l.core.cluster.RedisClusterClient      : connection timed out: /10.0.0.11:6379
2022-02-12 11:06:31.564  WARN 21392 --- [ioEventLoop-6-6] i.l.core.cluster.RedisClusterClient      : connection timed out: /10.0.0.13:6379
2022-02-12 11:06:41.586  WARN 21392 --- [ioEventLoop-6-7] i.l.core.cluster.RedisClusterClient      : connection timed out: /10.0.0.14:6379
2022-02-12 11:06:51.625  WARN 21392 --- [ioEventLoop-6-8] i.l.core.cluster.RedisClusterClient      : connection timed out: /10.0.0.16:6379
2022-02-12 11:07:01.635  WARN 21392 --- [ioEventLoop-6-1] i.l.core.cluster.RedisClusterClient      : connection timed out: /10.0.0.15:6379
Exception in thread "restartedMain" java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: io.lettuce.core.RedisConnectionException: Unable to connect
    at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:94)
    at io.lettuce.core.AbstractRedisClient.getConnection(AbstractRedisClient.java:352)
    at io.lettuce.core.cluster.RedisClusterClient.connect(RedisClusterClient.java:400)
    at io.lettuce.core.cluster.RedisClusterClient.connect(RedisClusterClient.java:375)
    at com.exercise.redis.utils.RedisShardedPoolUtils.lettuce(RedisShardedPoolUtils.java:47)
    at com.exercise.redis.RedisExerciseApplication.main(RedisExerciseApplication.java:12)
    ... 5 more
Caused by: io.netty.channel.ConnectTimeoutException: connection timed out: /10.0.0.15:6379
    at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe$1.run(AbstractNioChannel.java:261)
    at io.netty.util.concurrent.PromiseTask.runTask(PromiseTask.java:98)
    at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:170)
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:469)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:503)
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.base/java.lang.Thread.run(Thread.java:834)

谢谢

最佳答案

我在这里找到了 bitnami-redis 的解决方案,这是我的 docker-compose.yml

services:
  redis-0:
    image: bitnami/redis-cluster
    container_name: redis-0
    restart: always
    networks:
      redis-net:
        ipv4_address: 172.22.0.100
    environment:
      - 'REDIS_PORT_NUMBER=7000'
      - 'ALLOW_EMPTY_PASSWORD=yes'
      - 'REDIS_NODES=redis-0 redis-1 redis-2 redis-3 redis-4 redis-5'
      - 'REDIS_CLUSTER_ANNOUNCE_PORT=7000'
      - 'REDIS_CLUSTER_ANNOUNCE_IP=192.168.0.13' --local ip--
      - 'REDIS_CLUSTER_BUS_ANNOUNCE_PORT=17000'
      - 'REDIS_CLUSTER_DYNAMIC_IPS=no'
    ports:
      - "7000:7000"
      - "17000:17000"

  redis-1:
    image: bitnami/redis-cluster
    container_name: redis-1
    restart: always
    networks:
      redis-net:
        ipv4_address: 172.22.0.101
    environment:
      - 'REDIS_PORT_NUMBER=7001'
      - 'ALLOW_EMPTY_PASSWORD=yes'
      - 'REDIS_NODES=redis-0 redis-1 redis-2 redis-3 redis-4 redis-5'
      - 'REDIS_CLUSTER_ANNOUNCE_PORT=7001'
      - 'REDIS_CLUSTER_ANNOUNCE_IP=192.168.0.13' --local ip--
      - 'REDIS_CLUSTER_BUS_ANNOUNCE_PORT=17001'
      - 'REDIS_CLUSTER_DYNAMIC_IPS=no'
    ports:
      - "7001:7001"
      - "17001:17001"

  redis-2:
    image: bitnami/redis-cluster
    container_name: redis-2
    restart: always
    networks:
      redis-net:
        ipv4_address: 172.22.0.102
    environment:
      - 'REDIS_PORT_NUMBER=7002'
      - 'ALLOW_EMPTY_PASSWORD=yes'
      - 'REDIS_NODES=redis-0 redis-1 redis-2 redis-3 redis-4 redis-5'
      - 'REDIS_CLUSTER_ANNOUNCE_PORT=7002'
      - 'REDIS_CLUSTER_ANNOUNCE_IP=192.168.0.13' --local ip--
      - 'REDIS_CLUSTER_BUS_ANNOUNCE_PORT=17002'
      - 'REDIS_CLUSTER_DYNAMIC_IPS=no'
    ports:
      - "7002:7002"
      - "17002:17002"

  --- other nodes

  redis-cluster-init:
    image: redis:6.2
    container_name: redis-cluster-init
    restart: 'no'
    networks:
      redis-net:
        ipv4_address: 172.22.0.106
    depends_on:
      - redis-0
      - redis-1
      - redis-2
      - redis-3
      - redis-4
      - redis-5
    entrypoint: []
    command:
      - /bin/bash
      - -c
      - redis-cli --cluster create 172.22.0.100:7000 172.22.0.101:7001 172.22.0.102:7002 172.22.0.103:7003 172.22.0.104:7004 172.22.0.105:7005 --cluster-replicas 1 --cluster-yes

  redis_commander:
    image: rediscommander/redis-commander:latest
    container_name: redis_web
    environment:
      REDIS_HOSTS: "local:redis-0:7000,local:redis-1:7001,local:redis-2:7002,local:redis-3:7003,local:redis-4:7004,local:redis-5:7005"
    ports:
      - "5000:8081"
    depends_on:
      - redis-1
      - redis-2
      - redis-3
      - redis-4
      - redis-5
      - redis-0
      - redis-cluster-init
    networks:
      redis-net:
        ipv4_address: 172.22.0.107
networks:
  redis-net:
    name: redis-net
    driver: bridge
    ipam:
      config:
        - subnet: 172.22.0.0/16

这是我的生菜代码

RedisURI redis0 = RedisURI.create("127.0.0.1",7000);
RedisURI redis1 = RedisURI.create("127.0.0.1",7001);
RedisURI redis2 = RedisURI.create("127.0.0.1",7002);

RedisClusterClient clusterClient = RedisClusterClient.create(Arrays.asList(redis1,redis2,redis0));

StatefulRedisClusterConnection<String, String> connection = clusterClient.connect();

RedisAdvancedClusterCommands<String, String> syncCommands = connection.sync();

关于spring-boot - Lettuce无法连接到docker redis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71090070/

相关文章:

java - 无法在 Spring Boot 2.0.1 中禁用 Spring Security

java - Spring 启动: log file not generating

mongodb - 如何将数据导入 mongodb 容器并创建镜像

docker - 构建 Dockerfile 时出现错误,因为 pynacl 的构建轮失败

database - 如何通过在 postgres 的 pg_hba.conf 文件中指定 docker-compose 主机名来允许连接?

django - docker-compose - 数据库迁移和其他前/后脚本

java - Spring "The request was rejected because the URL was not normalized."如何判断使用了什么 url?

spring-boot - reactor.util.retry.Retry 中是否有重试成功时可以使用的函数

docker - 如何在我的 docker 镜像中安装 openmodelica?

linux - Docker 文件 ENTRYPOINT 无法检测到我的启动脚本