如何在docker集群上运行redis集群?

上下文

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

更确切地说,我有一个docker撰写文件,它定义了一个有3个副本的服务。 每个服务副本都有一个运行的redis服务器。 然后,我在每个副本中都有一个程序,用于侦听Docker集群上的更改,并在满足条件(每个3个Redis服务器相互认识)时启动集群。

设置redis集群工作已经预料到,集群已经形成,所有redis服务器通信良好,但是redis-server之间的通信是在Docker集群内部。

问题

当我尝试从Docker集群外部进行通信时,由于入口模式,我可以与Redis服务器通信,但是当我尝试添加信息(例如: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 

显示问题的命令的stream量。

客户

 ~ ./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> 

有任何想法吗? 我也尝试使我的一个代理/负载均衡器,但没有工作。

谢谢! 祝你今天愉快。

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

  • 将入口stream量路由到当前的Redis主节点。
  • 如果当前的失败,请select新的Redis主人。

虽然我以前在这个话题上做过研究,但我还没有设法去吸取一个实际的例子。

redis-cli将在入口networking中获得redis服务器ip,并尝试通过该ip直接访问远程redis服务器。 这就是为什么redis-cli显示Redirected to slot [3830] located at 10.0.0.3:6379 。 但是这个内部10.0.0.3不能被redis-cli访问。

一个解决scheme是运行另一个代理服务,它使用redis集群连接到同一个networking。 应用程序将所有请求发送到该代理服务,并且代理服务与redis群集交谈。

或者你可以创build3个使用桥接networking的swarm服务,并将redis端口暴露给节点。 您的内部程序需要相应更改。