redis - 如何配置 redis sentinels 将恢复的节点作为主节点带回?
问题描述
设置
我有一个故障转移 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 哨兵以自动将恢复的主节点提升为组中的主节点?
解决方案
我也想知道这个问题,但我不认为哨兵会自动掌握它。
但是我们可以通过强制故障转移来实现这个目标:
- R1(您图中的 Redis Server1)死亡,R2(Redis Server2)被提升为 master。
- R1 恢复后返回,哨兵将其设置为 R2 的从机。
- 执行
SENTINEL failover <master name>
命令使 R1 再次成为 master。
推荐阅读
- php - 如何在 Woocommerce 中的价格之前添加自定义文本
- json - 将推荐引擎集成到基于 TYPO3 的网站中
- javascript - 如何在基于类的组件上使用 ownProps (react-redux)
- node.js - 没有 DeviceId 的 Microsoft Azure IoT Hub 和 connectionString
- powershell - 按文件夹分组对象文件夹以进行删除
- javascript - 将方法添加到父范围以测试在父范围的上下文中执行表达式
- docker - 无法连接到 CitusData - SQLSTATE[08006] 错误
- java - 将符号转换为字符串中的不同符号
- bash - 从读取输入 grep 多个模式
- prestashop - 如何在 Prestashop 1.7 的自定义模块模板中获取 $product 变量