如何配置 redis sentinels 将恢复的节点带回为主节点?
How to configure redis sentinels to bring back a recovered node as a master?
设置
我有一个故障转移 Redis 设置,它由三个哨兵和两个 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 自动将恢复的master 节点提升为组中的master?
我也想知道这个问题,但是我觉得sentinel不会让它自动master。
但我们可以通过强制故障转移来实现该目标:
- R1(图中的 Redis Server1)死亡,R2(Redis Server2)被提升为 master。
- R1恢复后回来,sentinel会将其设置为R2的slave
- 执行
SENTINEL failover <master name>
命令使R1重新成为master。
我认为你的做法是错误的。
首先,我会 高度 考虑拥有三台服务器(1 台主服务器,2 台从服务器)而不是您当前的配置。请记住,您可以 运行 在同一台服务器上进行标记和缓存。因此,您仍然只需要 3 台服务器,而不是需要 6 台服务器。看看文档:Example 2: basic setup with three boxes.
其次,我将在 每个 数据中心复制这个 3 服务器配置,每个数据中心管理它自己的复制。这是出于多种原因:1) 更新之间的延迟。我们知道 REDIS 被认为是最终一致,但您不一定想要这么长的延迟。 2)您不希望数据中心之间有这么多的传出带宽。 3) GDPR 和 EU 等合规性。
相反,您的应用程序是否驻留在 LON REDIS 实例的 LON 拉取缓存中。同样,让您的 FRA 应用程序实例从 FRA 中的 REDIS 实例中提取。
如果您必须拥有您设计的设置,我强烈建议您建立一个完整的 REDIS 集群,而不是只使用 Sentinel。或者,更好的是,只使用 Microsoft Azure 的 REDIS 版本,它完全为您管理(而且 非常 便宜)。
希望对您有所帮助。
设置
我有一个故障转移 Redis 设置,它由三个哨兵和两个 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 自动将恢复的master 节点提升为组中的master?
我也想知道这个问题,但是我觉得sentinel不会让它自动master。
但我们可以通过强制故障转移来实现该目标:
- R1(图中的 Redis Server1)死亡,R2(Redis Server2)被提升为 master。
- R1恢复后回来,sentinel会将其设置为R2的slave
- 执行
SENTINEL failover <master name>
命令使R1重新成为master。
我认为你的做法是错误的。
首先,我会 高度 考虑拥有三台服务器(1 台主服务器,2 台从服务器)而不是您当前的配置。请记住,您可以 运行 在同一台服务器上进行标记和缓存。因此,您仍然只需要 3 台服务器,而不是需要 6 台服务器。看看文档:Example 2: basic setup with three boxes.
其次,我将在 每个 数据中心复制这个 3 服务器配置,每个数据中心管理它自己的复制。这是出于多种原因:1) 更新之间的延迟。我们知道 REDIS 被认为是最终一致,但您不一定想要这么长的延迟。 2)您不希望数据中心之间有这么多的传出带宽。 3) GDPR 和 EU 等合规性。
相反,您的应用程序是否驻留在 LON REDIS 实例的 LON 拉取缓存中。同样,让您的 FRA 应用程序实例从 FRA 中的 REDIS 实例中提取。
如果您必须拥有您设计的设置,我强烈建议您建立一个完整的 REDIS 集群,而不是只使用 Sentinel。或者,更好的是,只使用 Microsoft Azure 的 REDIS 版本,它完全为您管理(而且 非常 便宜)。
希望对您有所帮助。