代码之家  ›  专栏  ›  技术社区  ›  Ivan Drinchev

如何配置redis sentinels将恢复的节点作为主节点带回?

  •  2
  • Ivan Drinchev  · 技术社区  · 6 年前

    设置

    我有一个故障切换redis设置,由三个Sentinel和两个redis服务器组成,它们都位于不同的框中。

    设置如下所示:

    -------------------
    | Sentinel1 - AMS |\
    ------------------- \  ---------------------------
             |           -/| Redis Server1 (M) - FRA |
    -------------------  / ---------------------------
    | Sentinel2 - FRA |--
    -------------------  \ ---------------------------
             |           -\| Redis Server2 (S) - AMS |
    ------------------- /  ---------------------------
    | Sentinel3 - LON |/
    -------------------
    

    所有哨兵和服务器都可以通过VPN相互查看。

    哨兵的配置为:

    # Ansible managed
    
    daemonize yes
    pidfile "/var/run/redis/redis-sentinel.pid"
    logfile "/var/log/redis/redis-sentinel.log"
    
    # Note the ip changes for each sentinel  - 12,13,14
    
    bind 192.168.1.14
    port 26379
    dir "/var/lib/redis"
    
    sentinel monitor q-redis-01 192.168.1.10 6379 2
    sentinel down-after-milliseconds q-redis-01 10000
    sentinel auth-pass q-redis-01 XXX
    

    以及 节选 redis服务器的配置为:

    # Ansible managed
    
    daemonize yes
    pidfile "/var/run/redis/redis-server.pid"
    port 6379
    tcp-backlog 511
    
    # Note the ip changes for each server  - 10, 11
    bind 192.168.1.10
    
    timeout 0
    tcp-keepalive 0
    loglevel notice
    logfile "/var/log/redis/redis-server.log"
    databases 10
    
    save 900 1
    save 300 10
    save 60 10000
    stop-writes-on-bgsave-error yes
    rdbcompression yes
    rdbchecksum yes
    dbfilename "dump.rdb"
    dir "/var/lib/redis"
    
    masterauth "XXX"
    
    slave-serve-stale-data yes
    slave-read-only yes
    repl-diskless-sync no
    repl-diskless-sync-delay 5
    repl-disable-tcp-nodelay no
    
    # Note Server 1 has priority 10 and Server 2 has 20
    slave-priority 10
    
    requirepass "XXX"
    
    ...
    

    作为Server2中的配置,我还有以下几行:

    slaveof 192.168.1.10 6379
    

    问题所在

    设置工作以及何时 服务器1 无法访问, 服务器2 被提升为大师级。

    但我想要实现的是 服务器1 恢复后,我想自动再次成为大师。

    我需要这样做,因为FRA的数据中心更接近基础设施的其余部分,整个设置用于故障切换,而不是用于可扩展性。

    问题是

    是否可以将redis Sentinel配置为自动将恢复的主节点提升回组中的主节点?

    2 回复  |  直到 6 年前
        1
  •  2
  •   whatacold    5 年前

    我也很想知道这个问题,但我不认为哨兵会自动掌握它。

    但我们可以通过强制故障切换来实现这一目标:

    1. R1(图中的Redis Server1)死亡,R2(Redis Server2)升级为master。
    2. R1在恢复后返回,哨兵将其设置为R2的从属。
    3. 处决 SENTINEL failover <master name> 命令使R1再次主控。
        2
  •  0
  •   a11smiles    5 年前

    我想你是走错了路。

    首先,我会 非常 考虑使用三台服务器(1台主服务器,2台从服务器),而不是您当前的配置。请记住,您可以在相同的服务器上运行sentinel和缓存。因此,不再需要6台服务器,您仍然只需要3台。查看文档: Example 2: basic setup with three boxes

    其次,我将在中复制此3服务器配置 每个 每个数据中心管理自己的复制的数据中心。这有很多原因:1)更新之间的延迟。我们知道REDIS被考虑 最终一致 ,但您不需要这么长的延迟。2) 您不希望数据中心之间有这么多传出带宽。3) GDPR和EU等合规性。

    相反,您的应用程序驻留在LON REDIS实例的LON pull缓存中。同样,从FRA中的REDIS实例中提取FRA应用程序实例。

    如果你 必须 有了你设计的设置,我强烈建议你建立一个完整的REDIS集群,而不是仅仅使用Sentinel。或者,更好的是,只需使用Microsoft Azure版本的REDIS,它可以为您完全管理(以及 非常 便宜)。

    希望这有帮助。