Redis Sentinel和fix-slave-config:当Redis节点不应该是

时间:2015-10-22 01:48:45

标签: redis redis-sentinel

我正在尝试使用Sentinel进行大型redis舰队的故障转移(12个哨兵,500个一个主人的碎片和一个奴隶)。我遇到了一个非常奇怪的问题,我的哨兵反复向某些redis节点发出命令+ fix-slave-config。我没有注意到这种情况发生在较小的范围内,这是值得的。

我注意到两个具体问题:

  1. + fix-slave-config消息,如上所述
  2. sentinel.conf显示某些奴隶有两个主人(他们应该只有一个)
  3. 处于启动状态的机群有一个特定的从节点XXX.XXX.XXX.177,主机XXX.XXX.XXX.244(它们共同包括机队中的分片188)。在没有任何节点中断的情况下,从站的主站切换到XXX.XXX.XXX.96(shard 188的主站)然后返回,然后再转发。通过sshing到从节点和主节点并检查redis-cli信息来验证这一点。所有Redis节点都以正确的配置启动。所有Sentinel节点在其sentinel.conf中都具有正确的配置。每个Sentinel在我们在每个slave->主服务器更改后查询主服务器时都有完全相同的主服务器列表。

    在我的12个哨兵中,记录下列内容。每分钟都有一个+ fix-slave-config消息发送:

    Sentinel #8: 20096:X 22 Oct 01:41:49.793 * +fix-slave-config slave XXX.XXX.XXX.177:6379 XXX.XXX.XXX.177 6379 @ shard-188 XXX.XXX.XXX.96 6379
    Sentinel #1: 9832:X 22 Oct 01:42:50.795 * +fix-slave-config slave XXX.XXX.XXX.177:6379 XXX.XXX.XXX.177 6379 @ shard-172 XXX.XXX.XXX.244 6379
    Sentinel #6: 20528:X 22 Oct 01:43:52.458 * +fix-slave-config slave XXX.XXX.XXX.177:6379 XXX.XXX.XXX.177 6379 @ shard-188 XXX.XXX.XXX.96 6379
    Sentinel #10: 20650:X 22 Oct 01:43:52.464 * +fix-slave-config slave XXX.XXX.XXX.177:6379 XXX.XXX.XXX.177 6379 @ shard-188 XXX.XXX.XXX.96 6379
    Sentinel #2: 20838:X 22 Oct 01:44:53.489 * +fix-slave-config slave XXX.XXX.XXX.177:6379 XXX.XXX.XXX.177 6379 @ shard-172 XXX.XXX.XXX.244 6379
    

    这是SENTINEL MASTERS命令的输出。奇怪的是,shard-188有两个从属,实际上它应该只有1.当XXX.XXX.XXX.177在shard-172和shard-182下时,输出看起来相同。

    案例1)XXX.XXX.XXX.244是XXX.XXX.XXX.177的主人

    183)  1) "name"
          2) "shard-172"
          3) "ip"
          4) "XXX.XXX.XXX.244"
          5) "port"
          6) "6379"
          7) "runid"
          8) "ca02da1f0002a25a880e6765aed306b1857ae2f7"
          9) "flags"
         10) "master"
         11) "pending-commands"
         12) "0"
         13) "last-ping-sent"
         14) "0"
         15) "last-ok-ping-reply"
         16) "14"
         17) "last-ping-reply"
         18) "14"
         19) "down-after-milliseconds"
         20) "30000"
         21) "info-refresh"
         22) "5636"
         23) "role-reported"
         24) "master"
         25) "role-reported-time"
         26) "17154406"
         27) "config-epoch"
         28) "0"
         29) "num-slaves"
         30) "1"
         31) "num-other-sentinels"
         32) "12"
         33) "quorum"
         34) "7"
         35) "failover-timeout"
         36) "60000"
         37) "parallel-syncs"
         38) "1"
    72)  1) "name"
          2) "shard-188"
          3) "ip"
          4) "XXX.XXX.XXX.96"
          5) "port"
          6) "6379"
          7) "runid"
          8) "95cd3a457ef71fc91ff1a1c5a6d5d4496b266167"
          9) "flags"
         10) "master"
         11) "pending-commands"
         12) "0"
         13) "last-ping-sent"
         14) "0"
         15) "last-ok-ping-reply"
         16) "927"
         17) "last-ping-reply"
         18) "927"
         19) "down-after-milliseconds"
         20) "30000"
         21) "info-refresh"
         22) "5333"
         23) "role-reported"
         24) "master"
         25) "role-reported-time"
         26) "17154312"
         27) "config-epoch"
         28) "0"
         29) "num-slaves"
         30) "2"
         31) "num-other-sentinels"
         32) "12"
         33) "quorum"
         34) "7"
         35) "failover-timeout"
         36) "60000"
         37) "parallel-syncs"
         38) "1"
    

    案例2)XXX.XXX.XXX.96是XXX.XXX.XXX.177的主人

    79)  1) "name"
          2) "shard-172"
          3) "ip"
          4) "XXX.XXX.XXX.244"
          5) "port"
          6) "6379"
          7) "runid"
          8) "ca02da1f0002a25a880e6765aed306b1857ae2f7"
          9) "flags"
         10) "master"
         11) "pending-commands"
         12) "0"
         13) "last-ping-sent"
         14) "0"
         15) "last-ok-ping-reply"
         16) "1012"
         17) "last-ping-reply"
         18) "1012"
         19) "down-after-milliseconds"
         20) "30000"
         21) "info-refresh"
         22) "1261"
         23) "role-reported"
         24) "master"
         25) "role-reported-time"
         26) "17059720"
         27) "config-epoch"
         28) "0"
         29) "num-slaves"
         30) "1"
         31) "num-other-sentinels"
         32) "12"
         33) "quorum"
         34) "7"
         35) "failover-timeout"
         36) "60000"
         37) "parallel-syncs"
         38) "1"
    273)  1) "name"
          2) "shard-188"
          3) "ip"
          4) "XXX.XXX.XXX.96"
          5) "port"
          6) "6379"
          7) "runid"
          8) "95cd3a457ef71fc91ff1a1c5a6d5d4496b266167"
          9) "flags"
         10) "master"
         11) "pending-commands"
         12) "0"
         13) "last-ping-sent"
         14) "0"
         15) "last-ok-ping-reply"
         16) "886"
         17) "last-ping-reply"
         18) "886"
         19) "down-after-milliseconds"
         20) "30000"
         21) "info-refresh"
         22) "5762"
         23) "role-reported"
         24) "master"
         25) "role-reported-time"
         26) "17059758"
         27) "config-epoch"
         28) "0"
         29) "num-slaves"
         30) "2"
         31) "num-other-sentinels"
         32) "12"
         33) "quorum"
         34) "7"
         35) "failover-timeout"
         36) "60000"
         37) "parallel-syncs"
         38) "1"
    

    我为每个哨兵开始的sentinel.conf是

    maxclients 20000
    loglevel notice
    logfile "/home/redis/logs/sentinel.log"
    sentinel monitor shard-172 redis-b-172  7
    sentinel down-after-milliseconds shard-172 30000
    sentinel failover-timeout shard-172 60000
    sentinel parallel-syncs shard-172 1
    ....
    sentinel monitor shard-188 redis-b-188  7
    sentinel down-after-milliseconds shard-188 30000
    sentinel failover-timeout shard-188 60000
    sentinel parallel-syncs shard-188 1
    

    这是几分钟后产生的sentinel.conf(适用于所有哨兵) - 注意两个奴隶:

    sentinel monitor shard-172 XXX.XXX.XXX.244 6379 7
    sentinel failover-timeout shard-172 60000
    sentinel config-epoch shard-172 0
    sentinel leader-epoch shard-172 0
    sentinel known-slave shard-172 XXX.XXX.XXX.177 6379 <--- True slave of shard-172
    sentinel known-sentinel shard-172 ...
    ...
    sentinel monitor shard-188 XXX.XXX.XXX.96 6379 7
    sentinel failover-timeout shard-188 60000
    sentinel config-epoch shard-188 0
    sentinel leader-epoch shard-188 0
    sentinel known-slave shard-188 XXX.XXX.XXX.194 6379 <--- True slave of shard-188
    sentinel known-slave shard-188 XXX.XXX.XXX.177 6379
    sentinel known-sentinel shard-188 ... 
    

1 个答案:

答案 0 :(得分:0)

这就是我所谓的“蚂蚁问题”:你有两个(或更多)豆荚(主人+奴隶)混合在一起。当您显示其中一个pod有多个从属时,请指明这一点。

具体做法是:

  

这是SENTINEL MASTERS命令的输出。奇怪的是   是什么shard-188有两个奴隶,实际上它应该只有1。

您需要做的是:

  1. 通过sentinel remove shard-NNN
  2. 从所有哨兵中删除这些部分(碎片188和碎片 - ???)
  3. 将那些奴隶所在的豆荚带下来
  4. 正确配置(正确的slaveof命令/配置)
  5. 将他们带回网上
  6. 确保每个人只有一个正确的奴隶
  7. 通过sentinel monitor ...
  8. 将它们添加回Sentinels

    从技术上讲,你现在可以使用sentinel reset命令但是你将面临潜在的时间问题,因此从Sentinel中移除它们是可靠的路线。您可以选择让主/从设备启动,并简单地重新配置从设备。如果你走这条路线等待几分钟并检查奴隶清单,然后再进入第6步。