Redis Sentinel大师没有立即降级为奴隶

时间:2016-01-23 21:41:58

标签: redis sentinel redis-sentinel

我有一个包含三个Redis实例(一个主服务器和两个从服务器)和三个Sentinel实例的体系结构。在它前面有一个HaProxy。 一切正常,直到主Redis实例发生故障。 Sentinel正确选择了新的主人。但是,旧主站(现在已关闭)未重新配置为从站。结果,当该实例再次出现时,我有两个主人短时间(约11秒)。在那段时间之后,提出的实例被正确地降级为奴隶。

不应该那样工作,当主人倒下时它会立即降级为奴隶吗?拥有它,当它再次上升时,它将立即成为奴隶。 我知道(因为Redis 2.8?)有CONFIG REWRITE功能,因此当Redis实例关闭时无法修改配置。

有两个主人一段时间对我来说是一个问题,因为HaProxy在这么短的时间内没有向一个主Redis发送请求,而是在这两个主人之间进行负载平衡。

有没有办法立即将失败的主服务器降级为从服务器?

显然,我改变了Sentinel超时。

以下是Master关闭后来自Sentinel和Redis实例的一些日志:

哨兵

81358:X 23 Jan 22:12:03.088 # +sdown master redis-ha 127.0.0.1                       63797.0.0.1 26381 @ redis-ha 127.0.0.1 6379
81358:X 23 Jan 22:12:03.149 # +new-epoch 1
81358:X 23 Jan 22:12:03.149 # +vote-for-leader 6b5b5882443a1d738ab6849ecf4bc6b9b32ec142 1
81358:X 23 Jan 22:12:03.174 # +odown master redis-ha 127.0.0.1 6379 #quorum 3/2
81358:X 23 Jan 22:12:03.174 # Next failover delay: I will not start a failover before Sat Jan 23 22:12:09 2016
81358:X 23 Jan 22:12:04.265 # +config-update-from sentinel 127.0.0.1:26381 127.0.0.1 26381 @ redis-ha 127.0.0.1 6379
81358:X 23 Jan 22:12:04.265 # +switch-master redis-ha 127.0.0.1 6379 127.0.0.1 6381
81358:X 23 Jan 22:12:04.266 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ redis-ha 127.0.0.1 6381
81358:X 23 Jan 22:12:04.266 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ redis-ha 127.0.0.1 6381
81358:X 23 Jan 22:12:06.297 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ redis-ha 127.0.0.1 6381

Redis的

81354:S 23 Jan 22:12:03.341 * MASTER <-> SLAVE sync started
81354:S 23 Jan 22:12:03.341 # Error condition on socket for SYNC: Connection refused
81354:S 23 Jan 22:12:04.265 * Discarding previously cached master state.
81354:S 23 Jan 22:12:04.265 * SLAVE OF 127.0.0.1:6381 enabled (user request from 'id=7 addr=127.0.0.1:57784 fd=10 name=sentinel-6b5b5882-cmd age=425 idle=0 flags=x db=0 sub=0 psub=0 multi=3 qbuf=14 qbuf-free=32754 obl=36 oll=0 omem=0 events=rw cmd=exec')
81354:S 23 Jan 22:12:04.265 # CONFIG REWRITE executed with success.
81354:S 23 Jan 22:12:04.371 * Connecting to MASTER 127.0.0.1:6381
81354:S 23 Jan 22:12:04.371 * MASTER <-> SLAVE sync started
81354:S 23 Jan 22:12:04.371 * Non blocking connect for SYNC fired the event.
81354:S 23 Jan 22:12:04.371 * Master replied to PING, replication can continue...
81354:S 23 Jan 22:12:04.371 * Partial resynchronization not possible (no cached master)
81354:S 23 Jan 22:12:04.372 * Full resync from master: 07b3c8f64bbb9076d7e97799a53b8b290ecf470b:1
81354:S 23 Jan 22:12:04.467 * MASTER <-> SLAVE sync: receiving 860 bytes from master
81354:S 23 Jan 22:12:04.467 * MASTER <-> SLAVE sync: Flushing old data
81354:S 23 Jan 22:12:04.467 * MASTER <-> SLAVE sync: Loading DB in memory
81354:S 23 Jan 22:12:04.467 * MASTER <-> SLAVE sync: Finished with success

3 个答案:

答案 0 :(得分:1)

当我想使用哨兵在redis-cluster中切换master时,我也遇到了同样的错误。

  

+领导投票xxxxxxxxxxxxxxxxxxxxxxxx8989 10495
   下一次故障转移延迟:我不会在2019年8月2日星期五23:23:44之前开始故障转移

重设哨兵后。集群正常工作

SENTINEL RESET *

SENTINEL RESET mymaster

在所有哨兵服务器中运行以上命令。

答案 1 :(得分:0)

如果Redis节点发生故障,当/如果它恢复时,它将恢复与之前相同的role。如果节点无法对其进行ping操作,则Sentinel无法重新配置该节点。因此,节点重新启动和Sentinel确认并重新配置之间会有一段短暂的时间。这解释了多主状态。

如果您已开始使用Haproxy,则一种解决方法是在启动流程之前重新配置Redis节点的角色。只要redis.conf中有SLAVEOF条目,Redis就会作为奴隶启动。此解决方法的主要问题是它无法解决网络分区方案。

希望有所帮助。

答案 2 :(得分:0)

如果使用 HAProxy,您可以尝试像这样查询 uptime_in_seconds

backend redis
    mode tcp
    balance first
    timeout queue 5s
    default-server check inter 1s fall 2 rise 2 maxconn 100
    option tcp-check
    tcp-check connect
    tcp-check send AUTH\ <secret>\r\n
    tcp-check expect string +OK
    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 info\ server\r\n
    tcp-check expect rstring uptime_in_seconds:\d{2,}
    tcp-check send QUIT\r\n
    tcp-check expect string +OK
    server redis-1 10.0.0.10:9736
    server redis-2 10.0.0.20:9736
    server redis-3 10.0.0.30:9736

注意:

  tcp-check expect rstring uptime_in_seconds:\d{2,}

如果正常运行时间不大于 10 秒,则不会添加节点