1

语境

我正在尝试设置一个 redis 集群,以便它在 docker 集群上运行,以实现最大的自动修复。

更准确地说,我有一个 docker compose 文件,它定义了一个具有 3 个副本的服务。每个服务副本都有一个正在运行的 redis-server。然后我在每个副本中都有一个程序,它监听 docker 集群上的变化,并在满足条件时启动集群(每 3 个 redis 服务器相互认识)。

设置redis集群工作正常,集群形成,所有redis-servers通信良好,但redis-servers之间的通信是在docker集群内部。

问题

当我尝试从 docker 集群外部进行通信时,由于入口模式,我能够与 redis-server 通信,但是当我尝试添加信息(例如:set foo bar)并且客户端被移动到另一个 redis-服务器通信挂起并最终超时。

代码

这是 docker-compose 文件。

version: "3.3"
services:
    redis-cluster:
      image: redis-srv-instance
      volumes:
       - /var/run/:/var/run
      deploy:
        mode: replicated
        #endpoint_mode: dnsrr
        replicas: 3
        resources:
           limits:
             cpus: '0.5'
             memory: 512M
      ports:
        - target: 6379
          published: 30000
          protocol: tcp
          mode: ingress

显示问题的命令流。

客户

~ ./redis-cli -c -p 30000
127.0.0.1:30000>

Redis 服务器

OK
1506533095.032738 [0 10.255.0.2:59700] "COMMAND"
1506533098.335858 [0 10.255.0.2:59700] "info"

客户

127.0.0.1:30000> set ghb fki
OK

Redis 服务器

1506533566.481334 [0 10.255.0.2:59718] "COMMAND"
1506533571.315238 [0 10.255.0.2:59718] "set" "ghb" "fki"

客户

127.0.0.1:30000> set rte fgh
-> Redirected to slot [3830] located at 10.0.0.3:6379
Could not connect to Redis at 10.0.0.3:6379: Operation timed out
Could not connect to Redis at 10.0.0.3:6379: Operation timed out
(150.31s)
not connected>

有任何想法吗?我也尝试过制作我的一个代理/负载平衡器,但没有奏效。

谢谢!祝你今天过得愉快。

4

2 回答 2

1

对于这个用例,哨兵可能会有所帮助。Redis 本身并不具备高可用性。另一方面,Sentinel 是一个分布式系统,可以为您执行以下操作:

  • 将入口流量路由到当前 Redis 主服务器。
  • 如果当前的 Redis 主服务器失败,请选择一个新的 Redis 主服务器。

虽然我之前已经对这个主题进行了研究,但我还没有设法获得一个可行的例子。

于 2017-09-27T18:01:51.447 回答
0

redis-cli 将获取入口网络内的 redis 服务器 ip,并尝试通过该 ip 直接访问远程 redis 服务器。这就是为什么 redis-cli 显示Redirected to slot [3830] located at 10.0.0.3:6379. 但是 redis-cli 无法访问这个内部 10.0.0.3。

一种解决方案是运行另一个代理服务,该服务与 redis 集群连接到同一网络。应用程序将所有请求发送到该代理服务,代理服务与 redis 集群进行对话。

或者您可以创建 3 个使用桥接网络并将 redis 端口公开给节点的 swarm 服务。你的内部程序需要相应地改变。

于 2017-09-27T19:44:53.560 回答