通过 HAProxy 的 Redis 集群

标签 redis haproxy sentinel

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

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

我只需要了解它在幕后是如何工作的。

最佳答案

如果您想在 Redis 集群节点之前使用 HAProxy,则需要:

  1. 为每个主/从对设置一个 HAProxy,并在发生故障时连接一些东西来更新 HAProxy,以及可能拦截与拓扑相关的命令以插入虚拟 IP 而不是节点本身的 IP通过拓扑命令/响应进行报告。

  2. 自定义 HAProxy 以教会它如何成为集群感知的 Redis 客户端,这样实际客户端就根本不了解集群。这意味着向其教授 Redis 协议(protocol),存储集群的拓扑信息,并根据消费者代码访问的键选择要查询的节点。

使用 Redis 集群,客户端必须能够访问集群中的每个节点。在上面的两个选项中,选项 2 是“更简单”的一个,但目前我也不推荐。

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

最简单且最不可能出现问题的路线是“完全原生”,只需向客户端提供对集群中每个节点的完全且直接的访问权限,而根本不使用 HAProxy。

关于通过 HAProxy 的 Redis 集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31785184/

相关文章:

docker - redis.conf 在官方 docker 镜像中的位置是什么?

node.js - EXPIRE Redis key (如果未修改)

linux - Haproxy 不使用 rsyslog 记录

c - C中的哨兵循环执行

php - 如何使用 'subscribe' 通过 predis 接收更多消息?

node.js - 带有 kue 的 NodeJS 应用程序从不从 0 开始

centos - 在 RPM 中配置依赖项

mysql - session 变量不同于 MariaDB 中的全局变量

java - 如何告诉客户端新的 Redis master 在哪里使用 Sentinel

redis - 哨兵配置文件