Redis Sentinel 手动故障转移命令超时
我有一个 Redis 主机、一个从机和一个 Sentinel 监控它们。一切似乎都在正常工作,包括当主人被杀死时的故障转移。但是当我发出 SENTINEL FAILVER 命令时,Sentinel 会卡在 +failover-state-wait-promotion 状态几分钟。似乎奴隶没有得到提升命令。这没有任何意义,因为从 Sentinel 主机到任一 Redis 主机的网络通信似乎没有任何问题。我在 Docker 容器中运行所有 3 个过程,但我不确定这会如何导致问题。我可以从 Sentinel 主机(即从 Docker 容器内部)运行 redis-cli,并且可以远程执行 slaveof 命令。我还可以监控两个 Redis 实例并查看 SENTINEL ping 和信息请求。我查看了 master 和 slave 的日志,没有发现任何异常。看着这篇文章似乎没有任何理由让 Sentinel 认为 Redis 实例无效。
我对 Sentinel 相当有经验,但对 Docker 却很陌生。不确定如何继续确定问题所在。有任何想法吗?
哨兵日志
[8] 01 Jul 01:36:57.317 # Sentinel runid 是 c337f6f0dfa1d41357338591cd0181c07cb026d0
[8] 01 Jul 01:38:13.135 # +monitor master redis-holt-overflow 10.19.8.2 6380 quorum 1
[8] 13.11 Jul 013:88 # +set master redis-holt-overflow 10.19.8.2 6380 down-after-milliseconds 3100
[8] 01 Jul 01:38:13.199 * +slave slave 10.19.8.3:6381 10.19.8.3 6381 @ redis-holt-overflow 10.19。 8.2 6380
[8] 01 Jul 01:38:42.288 # 执行用户请求 'redis-holt-overflow' 的故障转移
[8] 7 月 1 日 01:38:42.288 # +new-epoch 1
[8] 7 月 1 日 01:38:42.288 # +try-failover master redis-holt-overflow 10.19.8.2 6380
[8] 7 月 1 日 01:38: 42.352 # +vote-for-leader c337f6f0dfa1d41357338591cd0181c07cb026d0 1
[8] 01 Jul 01:38:42.352 # +elected-leader master redis-holt-overflow 10.19.8.2 6380
[8] 01 Jul 01:38:42.5+failover-state -select-slave master redis-holt-overflow 10.19.8.2 6380
[8] 7 月 1 日 01:38:42.404 # +selected-slave 从站 10.19.8.3:6381 10.19.8.3 6381 @ redis-holt-overflow 10.19.8.2 6380
[8] 7 月 1 日 01:38:42.404 * +故障转移状态-send-slaveof-noone slave 10.19.8.3:6381 10.19.8.3 6381 @ redis-holt-overflow 10.19.8.2 6380
[8] 01 Jul 01:38:42.488 * +failover-state-wait-promotion slave 10.19.8.3: 6381 10.19.8.3 6381 @ redis-holt-overflow 10.19.8.2 6380
[8] 01 Jul 01:41:42.565 #-failover-abort-slave-timeout master redis-holt-overflow 10.19.8.2 6380
Redis 主日志
[17] 01 Jul 01:13:58.251 # 服务器已启动,Redis 版本 2.8.21
[17] 01 Jul 01:13:58.252 # 警告 overcommit_memory 设置为 0!在内存不足的情况下,后台保存可能会失败。要解决此问题,请将“vm.overcommit_memory = 1”添加到 /etc/sysctl.conf,然后重新启动或运行命令“sysctl vm.overcommit_memory=1”以使其生效。
[17] 01 Jul 01:13:58.252 # 警告你的内核中启用了透明大页面 (THP) 支持。这将在 Redis 中产生延迟和内存使用问题。要解决此问题,请以 root 身份运行命令“echo never > /sys/kernel/mm/transparent_hugepage/enabled”,并将其添加到您的 /etc/rc.local 以便在重新启动后保留设置。禁用 THP 后必须重新启动 Redis。
[17] 01 Jul 01:13:58.252 # WARNING: TCP backlog 设置无法强制执行 511,因为 /proc/sys/net/core/somaxconn 设置为较低的值 128。
[17] 7 月 1 日 01:13:58.252 * 从磁盘加载的数据库:0.000 秒
[17] 7 月 1 日 01:13:58.252 * 服务器现在已准备好接受端口 6380 上的连接
[17] 7 月 1 日 01:34:45.796 * 从站 10.196.88.30:6381 请求同步
[17] 7 月 1 日 01:34:45.796 * 从站 10.196.88.30:6381 请求完全重新同步
[17] 7 月 1 日 01:34:45.796 * 启动 BGSAVE for SYNC 与目标:磁盘
[17] 7 月 1 日 01:34:45.797 * 由 pid 20 开始后台保存
[20] 7 月 1 日 01:34:45.798 * DB 保存在磁盘上
[20] 7 月 1 日 01:34:45.799 * RDB:写时复制使用的内存为 0 MB
[17] 7 月 1 日 01:34:45.808 * 后台保存成功终止
[17] 7 月 1 日 01:34:45.808 * 与从属设备 10.196.88.30:6381 同步成功
[17] 01 Jul 01:38:42.343 # 与从站 10.196.88.30:6381 的连接丢失。
[17] 7 月 1 日 01:38:43.275 * 从站 10.196.88.30:6381 请求同步
[17] 7 月 1 日 01:38:43.275 * 从站 10.196.88.30:6381 请求完全重新同步
[17] 7 月 1 日 01:38:43.275 * 启动 BGSAVE for SYNC 与目标:磁盘
[17] 7 月 1 日 01:38:43.275 * pid 21 开始后台保存
[21] 7 月 1 日 01:38:43.277 * 数据库保存在磁盘上
[21] 7 月 1 日 01:38:43.277 * RDB:写入时复制使用的 0 MB 内存
[17] 7 月 1 日 01:38:43.368 * 后台保存成功终止
[17] 01 Jul 01:38:43.368 * 与从站 10.196.88.30:6381 同步成功
Redis 从属日志
[14] 01 Jul 01:15:51.435 # 服务器已启动,Redis 版本 2.8.21
[14] 01 Jul 01:15:51.435 # 警告 overcommit_memory 设置为 0!在内存不足的情况下,后台保存可能会失败。要解决此问题,请将“vm.overcommit_memory = 1”添加到 /etc/sysctl.conf,然后重新启动或运行命令“sysctl vm.overcommit_memory=1”以使其生效。
[14] 01 Jul 01:15:51.435 # 警告您的内核中启用了透明大页面 (THP) 支持。这将在 Redis 中产生延迟和内存使用问题。要解决此问题,请以 root 身份运行命令“echo never > /sys/kernel/mm/transparent_hugepage/enabled”,并将其添加到您的 /etc/rc.local 以便在重新启动后保留设置。禁用 THP 后必须重新启动 Redis。
[14] 01 Jul 01:15:51.435 # WARNING: TCP backlog 设置无法强制执行 511,因为 /proc/sys/net/core/somaxconn 设置为较低的值 128。
[14] 7 月 1 日 01:15:51.435 * 从磁盘加载的数据库:0.000 秒
[14] 7 月 1 日 01:15:51.435 * 服务器现在准备好接受端口 6381 上的连接
[14] 7 月 1 日 01:34:45.088 * 10.196.88.29:6380 的 SLAVE 已启用(用户请求)
[14] 7 月 1 日 01:34:45.947 * 连接到 MASTER 10.196.88.29:6380
[14] 7 月 1 日 01:34:45.947 * MASTER <-> SLAVE 同步开始
[14] 7 月 1 日 01:34:45.948 * SYNC 的非阻塞连接触发了事件。
[14] 7 月 1 日 01:34:45.948 * 主服务器回复 PING,复制可以继续...
[14] 7 月 1 日 01:34:45.948 * 部分重新同步不可能(没有缓存的主服务器)
[14] 7 月 1 日 01:34:45.948 * 从主站完全重新同步:b912b647401917d52742c0eac3ae2f795f59f48f:1
[14] 7 月 1 日 01:34:45.960 * 主站 <-> 从站同步:从主站接收 18 个字节
[14] 7 月 1 日 01:34:45.960 * MASTER <-> SLAVE 同步:刷新旧数据
[14] 7 月 1 日 01:34:45.960 * MASTER <-> SLAVE 同步:将 DB 加载到内存中
[14] 7 月 1 日 01:34:45.960 * MASTER <-> SLAVE 同步:成功完成
[14] 7 月 1 日 01:38:42.495 # 与主设备的连接丢失。
[14] 01 Jul 01:38:42.495 * 缓存断开连接的主状态。
[14] 01 Jul 01:38:42.495 * 丢弃以前缓存的主状态。
[14] 7 月 1 日 01:38:42.495 * 启用主模式(用户请求)
[14] 7 月 1 日 01:38:42.495 # CONFIG REWRITE 成功执行。
[14] 7 月 1 日 01:38:42.506 * 10.196.88.29:6380 的 SLAVE 已启用(用户请求)
[14] 7 月 1 日 01:38:43.425 * 连接到 MASTER 10.196.88.29:6380
[14] 7 月 1 日 01:38:43.426 * MASTER <-> SLAVE 同步开始
[14] 7 月 1 日 01:38:43.426 * SYNC 的非阻塞连接触发了事件。
[14] 7 月 1 日 01:38:43.427 * 主服务器回复 PING,复制可以继续...
[14] 7 月 1 日 01:38:43.427 * 部分重新同步不可能(没有缓存的主服务器)
[14] 7 月 1 日 01:38:43.427 * 从主站完全重新同步:b912b647401917d52742c0eac3ae2f795f59f48f:10930
[14] 7 月 1 日 01:38:43.520 * 主站 <-> 从站同步:从主站接收 18 个字节
[14] 7 月 1 日 01:38:43.520 * MASTER <-> SLAVE 同步:刷新旧数据
[14] 7 月 1 日 01:38:43.520 * MASTER <-> SLAVE 同步:将 DB 加载到内存中
[14] 01 Jul 01:38:43.520 * MASTER <-> SLAVE 同步:成功完成
哨兵配置
端口 26379
pidfile "/var/run/redis-sentinel.pid"
logfile ""
daemonize no
由 CONFIG REWRITE 生成
dir "/data"
sentinel monitor redis-holt-overflow 10.19.8.2 6380 1
sentinel down-after-milliseconds redis-holt-overflow 3100
sentinel config-epoch redis-holt-overflow 0
sentinel leader-epoch redis-holt-overflow 1
sentinel known-slave redis-holt-overflow 10.19.8.3 6381
sentinel current-epoch 1
Redis 和哨兵信息:
redis_version:2.8.21 redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:551c16ab9d912477
redis_mode:standalone
os:Linux 3.10.0-123.8.1.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.7.2
process_id:13
run_id:7e1a1b6c844a969424d16f3efa116707ea7a60bf
tcp_port :6380
uptime_in_seconds:1312
uptime_in_days:0
hz:10
lru_clock:9642428
config_file:/usr/local/etc/redis/redis.conf