如何从其他主机连接Bitnami Redis Cluster集群
解决Bitnami Redis Cluster跨主机集群连接失败问题
问题根源
你遇到的核心问题是Redis集群节点的通告地址配置错误:Bitnami Redis Cluster默认会使用容器内部的主机名(如redis-node-0)向客户端通告自身地址,而跨主机的客户端无法解析这些容器内部的主机名,导致集群客户端(Jedis、DataGrip)获取到无效的节点地址后无法建立连接。虽然单个节点的CLI能正常连接,但集群模式下需要客户端获取完整的节点路由信息,因此会出现连接失败。
解决方案
需要为每个Redis集群节点配置外部可访问的通告IP和端口,让集群向客户端返回正确的、跨主机可访问的节点地址。
修改docker-compose.yml配置
为每个redis-node-*服务添加REDIS_ANNOUNCE_IP和REDIS_ANNOUNCE_PORT环境变量:
REDIS_ANNOUNCE_IP:设置为Redis集群所在主机的局域网IP(即你的192.168.100.12)REDIS_ANNOUNCE_PORT:设置为该节点对外映射的端口(对应每个服务的ports配置中的宿主机端口)
修改后的完整配置如下:
version: '3.8' services: redis-node-0: image: docker.io/bitnami/redis-cluster:7.2 ports: - '6385:6379' environment: - 'ALLOW_EMPTY_PASSWORD=yes' - 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5' - 'REDIS_BIND=192.168.100.12' - 'REDIS_ANNOUNCE_IP=192.168.100.12' - 'REDIS_ANNOUNCE_PORT=6385' redis-node-1: image: docker.io/bitnami/redis-cluster:7.2 ports: - '6380:6379' environment: - 'ALLOW_EMPTY_PASSWORD=yes' - 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5' - 'REDIS_BIND=192.168.100.12' - 'REDIS_ANNOUNCE_IP=192.168.100.12' - 'REDIS_ANNOUNCE_PORT=6380' redis-node-2: image: docker.io/bitnami/redis-cluster:7.2 ports: - '6381:6379' environment: - 'ALLOW_EMPTY_PASSWORD=yes' - 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5' - 'REDIS_BIND=192.168.100.12' - 'REDIS_ANNOUNCE_IP=192.168.100.12' - 'REDIS_ANNOUNCE_PORT=6381' redis-node-3: image: docker.io/bitnami/redis-cluster:7.2 ports: - '6382:6379' environment: - 'ALLOW_EMPTY_PASSWORD=yes' - 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5' - 'REDIS_BIND=192.168.100.12' - 'REDIS_ANNOUNCE_IP=192.168.100.12' - 'REDIS_ANNOUNCE_PORT=6382' redis-node-4: image: docker.io/bitnami/redis-cluster:7.2 ports: - '6383:6379' environment: - 'ALLOW_EMPTY_PASSWORD=yes' - 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5' - 'REDIS_BIND=192.168.100.12' - 'REDIS_ANNOUNCE_IP=192.168.100.12' - 'REDIS_ANNOUNCE_PORT=6383' redis-node-5: image: docker.io/bitnami/redis-cluster:7.2 ports: - '6384:6379' environment: - 'ALLOW_EMPTY_PASSWORD=yes' - 'REDIS_CLUSTER_REPLICAS=1' - 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5' - 'REDIS_CLUSTER_CREATOR=yes' - 'REDIS_BIND=192.168.100.12' - 'REDIS_ANNOUNCE_IP=192.168.100.12' - 'REDIS_ANNOUNCE_PORT=6384' volumes: redis-cluster_data-0: driver: local redis-cluster_data-1: driver: local redis-cluster_data-2: driver: local redis-cluster_data-3: driver: local redis-cluster_data-4: driver: local redis-cluster_data-5: driver: local
重新部署集群
因为原集群的节点信息已经持久化到卷中,需要先清理旧数据再重新启动:
- 停止并删除现有容器:
docker-compose down -v
- 重新启动集群:
docker-compose up -d
验证配置
集群启动完成后,从外部主机用集群模式连接Redis,执行CLUSTER NODES命令查看节点地址:
redis-cli -c -h 192.168.100.12 -p 6385 192.168.100.12:6385> CLUSTER NODES
如果输出的所有节点地址都是192.168.100.12加上对应的外部端口,说明配置生效,此时Jedis和DataGrip就能正常连接集群了。
内容的提问来源于stack exchange,提问作者Obed Navarrete
相关产品推荐
相关产品推荐

