AliyunContainerService/redis-cluster

如何连接docker redis集群?

chenweiyj opened this issue · 10 comments

我根据denverdino的博文 https://yq.aliyun.com/articles/57953?do=login 部署了redis集群,但是我不知道怎么在我的docker应用(我是nodejs应用)里连接这个集群?直接指定 --link 的话是连 redis-master_1:redis 这样吗?

你可以从sentinal中获得redis cluster的连接

比如 测试用 Java Jedis 连接的示例代码如下

Set<String> sentinels = new HashSet<String>(16);
sentinels.add("rediscluster_sentinel_1:26379");
sentinels.add("rediscluster_sentinel_2:26379");
sentinels.add("rediscluster_sentinel_3:26379");
GenericObjectPoolConfig config = new GenericObjectPoolConfig();
config.setBlockWhenExhausted(true);
config.setMaxTotal(10);
config.setMaxWaitMillis(1000l);
config.setMaxIdle(25);
config.setMaxTotal(32);
jedisPool = new JedisSentinelPool("mymaster", sentinels, config);

如果我用阿里云的容器服务,它给了一个访问域名,这样还需要在代码里一个一个加sentinels吗?

rediscluster_sentinel_1是容器名,因为redis在上面的示例中是没有暴露到VM网络中的,你如果需要在容器集群外部访问redis,你需要配置exposed端口

容器服务默认提供的跨宿主机容器网络会提供优化而安全的网络配置

这个默认的跨宿主机网络我怎么连?假如redis-cluster作为阿里云容器服务的一个应用起来了,我的应用要连接到这几个sentinels在编排里怎么设置?

如果应用运行在容器中,可以使用容器名来访问相应容器的IP地址。这就是上文代码示例中显示的例子。
如果应用运行在虚拟机中,需要将容器(sentinel, redis)的端口暴露到宿主机上,然后通过IP:port来访问

阿里云容器服务部署在一个集群里是不是可以自动发现服务的?因为弹性伸缩的话IP会变化吧。

是可以动态发现服务,因为弹性伸缩,重新调度等场景会导致IP地址变化。一个简单的方式是利用DNS进行容器发现,上文中示例是容器名,应用可以用DNS解析到sentinel或者redis容器。

但是我的应用还是起不起来。我是先按你的方式布了 redis-cluster 到三台 ecs,然后再起一个自己的服务如下,但是报依赖错误,已经起来的 sentinel 或者 redis 集群找不到

version: '2'
services:
  yontact:
    image: xxxx.aliyuncs.com/yontact/yontact
    links:
      - redis-cluster_sentinel_1:sentinel_1
    ports:
      - "3001:3001"
    restart: always
    labels:
      aliyun.scale: "3"

在一个应用中引用其他应用的容器,你需要external_links,请参见
https://docs.docker.com/compose/compose-file/#/external-links

jwxa commented

你好
我也是遇到了这个问题
我在docker中启动了该redis集群 把master映射宿主机6379端口 sentinel映射26379端口
宿主机启动java项目去连接127.0.0.1:26379 连接成功
但是 他告诉我的可用的master 为172.17.0.2:6379 于是jedis尝试去连接该master 由于ip地址的关系 连接失败
请问下这种情况如何解决

我现在是将\redis-cluster\sentinel\sentinel.conf 下的命令修改
sentinel monitor mymaster 127.0.0.1 6379 $SENTINEL_QUORUM 来达到这个效果的
有什么更好的建议么