【问题标题】:How to run a redis cluster on a docker cluster?如何在 docker 集群上运行 redis 集群?
【发布时间】:2018-03-09 07:26:45
【问题描述】:

上下文

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

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

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

问题

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

代码

这是 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>

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

谢谢!祝你有美好的一天。

【问题讨论】:

    标签: docker docker-compose docker-swarm redis-cluster redis-cli


    【解决方案1】:

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

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

    虽然我之前对此主题进行过研究,但我还没有设法找到一个可行的示例。

    【讨论】:

      【解决方案2】:

      redis-cli 会在 ingress 网络中获取 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 服务。你的内部程序需要相应地改变。

      【讨论】:

        猜你喜欢
        • 2018-09-09
        • 1970-01-01
        • 1970-01-01
        • 2018-05-03
        • 2016-06-01
        • 1970-01-01
        • 2015-10-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多