使用不同的Auth密钥为Redis配置HAproxy

时间:2015-05-28 13:20:15

标签: redis haproxy node-redis

我有三个实例的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使用其服务器的每个auth密钥,如下所示:

R1:abc

R2:klm

R3:xyz

1 个答案:

答案 0 :(得分:0)

您有两个主要选项:

  1. 为每组具有不同密码的服务器设置HA代理配置。
  2. 将HA代理设置为不使用auth,而是通过透明方式传递所有连接。
  3. 您列出的设置存在其他问题。您的只读从站将不具有“主”角色。因此,即使您可以为每个密码分配不同的密码,您的支票也会拒绝连接。此外,在分区的情况下,您的检查将允许裂脑条件。

    在Sentinel托管的Redis窗格[1]前面使用HA代理时,如果您尝试让HA代理找出将连接路由到的位置,则必须让HA代理检查所有 Sentinels以确保大多数哨兵决定的Redis实例确实是主人。否则,您可能会遭受裂脑,其中两个或更多实例将自己报告为主人。在故障转移后实际上有一段时间你可以看到这种情况发生。

    如果主服务器出现故障并且从服务器升级,则当主服务器重新启动时,它将自我报告为主服务器,直到Sentinel检测到主服务器并将其重新配置为从服务器。在此期间,HA代理检查将向原始主服务器发送写入。当Sentinel将其重新配置为从属时,这些写入将丢失。

    对于选项1的情况: 您可以运行单独配置的HA Proxy实例,也可以设置前端和多个后端(配对)。就个人而言,我会选择HA Proxy的多个实例,因为它允许您管理它们而不会相互干扰。

    对于选项2的情况: 您需要将Sentinel的通知机制粘贴到正在重新配置的HA代理上。这可以使用在Sentinel上触发的脚本轻松完成,以在switch-master事件上伸出并重新配置HA Proxy。有关执行此操作的详细信息位于http://redis.io/topics/sentinel,更直接位于http://download.redis.io/redis-stable/sentinel.conf

    上找到的示例文件的底部

    在具有直接连接功能的Redis Pod + Sentinel设置中,客户端可以收集确定连接位置所需的信息。当您在它们之间放置一个非透明代理时,您的代理需要能够代表客户做出这些决定 - 或者在发生拓扑更改时为其做出决定。

    1. 注意:您描述的不是Redis群集,而是复制设置。 Redis集群完全不同。我使用术语“pod”来应用于基于复制的设置。