我有三个实例的redis集群,这个集群是由redis sentinel驱动的,它们以[master,slave,slave]的身份运行。
另外,haproxy实例正在运行以将流量传输到主节点,而这两个从节点是只读的,将由其他应用程序使用。
当对所有实例使用相同的auth密钥时,很容易将haproxy配置为选择主节点,但是现在我们对每个实例都有不同的auth密钥。

#listen redis-16
 bind ip_address:6379 name redis
  mode    tcp
 default_backend bk_redis_16

backend bk_redis_16
# mode    tcp
 option tcp-check
 tcp-check connect
 tcp-check send AUTH\ auth_key\r\n
 tcp-check send PING\r\n
 tcp-check expect string +PONG
 tcp-check send info\ replication\r\n
 tcp-check expect string role:master
 tcp-check send QUIT\r\n
 tcp-check expect string +OK
 server R1 ip_address:6379  check inter 1s
 server R2 ip_address:6380 check inter 1s
 server R3 ip_address:6381 check inter 1s

所以上面的代码只在{r1,r2,r3}上有一个密码时才起作用,即如何为不同的密码配置haproxy。
我的意思是如何使haproxy为其服务器使用each auth密钥,如下所示:
R1:ABC公司
R2:荷兰皇家航空公司
R3:XYZ型

最佳答案

您有两个主要选项:
为具有不同密码的每组服务器设置ha代理配置。
将ha代理设置为不使用auth,而是透明地传递所有连接。
您列出的设置有其他问题。你的只读奴隶没有“主人”的角色。因此,即使您可以为每个用户分配不同的密码,您的检查也会拒绝连接。另外,如果是一个分割,你的支票将允许分裂的大脑条件。
在sentinel管理的redis pod[1]前使用ha proxy时,如果您试图让ha proxy找出连接的路由位置,则必须让ha proxy检查所有sentinel,以确保大多数sentinel确定的redis实例确实是主实例。否则,你可能会遭受分裂的大脑,其中两个或更多的实例报告自己为主人。实际上,在故障转移之后的某个时刻,您可以看到这种情况发生。
如果你的主设备坏了,一个从设备被提升,当主设备恢复运行时,它会报告自己为主设备,直到哨兵检测到主设备并将其重新配置为从设备。在此期间,您的ha代理检查将向原始主机发送写操作。当sentinel将其重新配置为从机时,这些写操作将丢失。
对于方案1:
可以运行单独配置的ha proxy实例,也可以设置前端和多个后端(成对)。就我个人而言,我会使用多个ha proxy实例,因为它允许您在互不干扰的情况下管理它们。
对于方案2:
您需要将sentinel的通知机制绑定到正在重新配置的ha代理。这可以使用sentinel上触发的脚本轻松完成,以便在switch master事件上伸手并重新配置ha代理。执行此操作的详细信息位于http://redis.io/topics/sentinel处,更直接地位于http://download.redis.io/redis-stable/sentinel.conf处的示例文件底部。
在具有直接连接的redis pod+sentinel设置中,客户机能够收集确定连接位置所需的信息。当您将一个非透明代理放在它们之间时,您的代理需要能够代表客户机做出这些决定—或者在拓扑发生更改时让他们做出这些决定。
注意:您所描述的不是redis集群,而是一个复制设置。redis集群完全不同。我使用术语“pod”来应用于基于复制的设置。

关于redis - 使用不同的Auth键为Redis配置HAproxy,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30507775/

10-10 04:39