2015-08-03 171 views
0

我有一个Redis集群,客户端通过虚拟IP通过HAPRoxy连接到。 Redis群集有三个节点(每个节点与正在运行的sentinel实例共享相同的服务器)。Redis集群通过HAProxy

我的问题是,当我的客户端在发送请求时从群集节点收到“MOVED”错误/消息时,它是否在连接时第二次绕过HAProxy,因为它已经提供了IP:端口MOVEd消息已发布?如果不是,HAProxy如何第二次知道将其发送到正确的节点?

我只需要了解这是如何工作的。

回答

0

如果你想在Redis的集群节点前使用HAProxy的,你将需要:

  1. 建立一个HAProxy的每个主/从设备对,及导线上的东西时,更新HAProxy的故障发生,以及可能拦截拓扑相关的命令以插入虚拟IP而不是节点本身具有的IP并通过拓扑命令/响应报告。

  2. 自定义HAProxy教它如何成为群集感知的Redis客户端,因此实际的客户端根本不知道群集。这意味着教会它Redis协议,存储群集的拓扑信息,并根据消费者代码访问的密钥选择要查询的节点。

随着Redis的集群客户端必须能够访问每个节点的群集。选项2中的两个选项是“更容易”的选项,但在这一点上我不会推荐。

可以想象,您可以使用VIP作为“获取拓扑信息的第一位”IP,但我怀疑您会遇到严重的问题,因为原始IP不会被正确报告为点头处理数据。为此,您可以简单地使用循环DNS并避免该问题,或者使用内置的“这里是集群IP列表(或名称?)”来初始化连接配置。

最简单且最不可能成为问题的路线是“完全原生”,只需将群集中的每个节点完全直接访问给客户端,而不使用HAProxy。

+0

真正的比尔(不是克林顿),我已经配置HAProxy,并且它与redis集群工作正常。我唯一需要知道的是 - 当客户端在发送请求时从集群节点获取“MOVED”错误/消息时,是否在连接时第二次绕过HAProxy,因为它已提供IP:端口当MOVEd消息发布时? –

+0

正如我所说HAProxy不知道有关Redis的任何信息,因此它只会代理数据,除非您教授它,否则无法在API级别与Redis群集进行交互。我可以保证,您的HAProxy不能“与Redis Cluster一起正常工作”,但您尚未看到问题。 –

+0

真正的Bill,所以当Redis集群中的一个节点收到来自客户端的请求后,发送一个“MOVED”消息,该请求用于驻留在另一个节点上的散列槽时,客户端如何发送知道如何将其发送到右侧第二次节点为相同的请求吗?在第二个请求(在MOVED消息之后),请求是否仍然需要通过代理? –