1

我有以下 Redis/Sentinel 配置:

  • Redis 主A+N
  • M哨兵监视A,命名masterA
  • 客户端应用程序查询哨兵masterA,然后查询和修改A

现在说A已经过时了,我想用一个新的 Redis 主服务器替换它B(停机时间/数据丢失最少。)。在操作结束时,我想要这个:

  • Redis 主B+N
  • 客户端应用程序查询和修改B

我可以进行如下操作:

  1. 让哨兵开始监视B,命名masterB
  2. 让每个奴隶A成为B

从那里开始,我被卡住了,因为客户端应用程序masterA在与哨兵交谈时仍然要求。我有两个问题:

  • 有没有办法切换主人的名字,这样B就被称为masterA哨兵,因此也被客户端应用程序所熟知?
  • 修改客户端应用程序代码以处理从旧主机到新主机的切换是否更好?
4

1 回答 1

1

实现目标的一种方法是遵循“添加另一个间接级别”的古老解决方案。

一种特别有效的方法是让您的客户端与 TCP 代理(例如 HAProxy)通信,并将流量传递给当前的主服务器。

要保持 TCP 代理同步,您可以执行类似于http://blog.haproxy.com/2014/01/02/haproxy-advanced-redis-health-check/的操作,这会使 HAProxy Sentinel 感知。

这个解决方案的主要优点是它使您的客户端非常简单——它们只连接到一个地方,并且流量总是被转发到正确的 Redis 实例。

此解决方案的一个问题是 HAProxy 的配置 DSL 无法处理 Redis 服务器重新启动并在哨兵使其成为从属之前最初宣布自己为主服务器的时期。这将导致丢失的写入和不一致的状态,这取决于您的应用程序可能会好也可能不会。

为了解决这个问题,我已经开始开发一个“更智能”的守护进程来保持 HAProxy 与当前的 master 同步。我的解决方案位于https://github.com/mdevilliers/redishappy

于 2014-12-19T09:17:44.497 回答