我有以下Redis / Sentinel配置:
A
+ N
奴隶M
哨兵正在观看A
,名为masterA
masterA
的标记,然后查询和修改A
现在说A
已过时,我希望将其替换为名为B
的新Redis主机(最短停机时间/数据丢失)。在操作结束时,我想要这个:
B
+ N
奴隶B
我可以按照以下步骤进行:
B
,名为masterB
A
的每个奴隶成为B
从那里开始,我被卡住了,因为客户端应用程序在与哨兵交谈时仍然要求masterA
。我有两个问题:
B
被称为masterA
的哨兵,因此也被称为客户端应用程序?答案 0 :(得分:1)
实现目标的一种方法是遵循“增加另一层间接”的古老解决方案。
一种特别有效的方法是让您的客户端与TCP代理(例如HAProxy)通信并让它将流量传递给当前主服务器。
为了保持TCP代理同步,您可以执行与http://blog.haproxy.com/2014/01/02/haproxy-advanced-redis-health-check/类似的操作,这使HAProxy Sentinel可以识别。
此解决方案的主要优点是它使您的客户端非常简单 - 它们只连接到一个地方,流量始终转发到正确的Redis实例。
此解决方案的一个问题是HAProxy的配置DSL无法处理Redis服务器重新启动的时间段,并且在哨兵成为从属服务器之前最初宣布自己为主服务器。这将导致错过写入和不一致状态,这取决于您的应用程序可能是好的或可能不是。
为了解决这个问题,我已经开始开发一个“更智能”的守护进程,以使HAProxy与当前主服务器保持同步。我的解决方案是https://github.com/mdevilliers/redishappy。