Redis Sentinel 中 `sentinel resolve-hostnames yes` 的必要性解析

发布于:2025-08-13 ⋅ 阅读:(13) ⋅ 点赞:(0)

📌 Redis Sentinel 中 sentinel resolve-hostnames yes 的必要性解析

在使用 Docker 或 Kubernetes 部署 Redis Sentinel 时,你可能会遇到 哨兵无法解析主节点或从节点的主机名 的问题。
这时,sentinel resolve-hostnames yes 这个配置项就显得非常关键。


📚 目录

  1. 📖 什么是 Redis Sentinel
  2. 🌐 为什么需要 resolve-hostnames
  3. 默认行为与问题
  4. 🔍 开启 resolve-hostnames 的作用
  5. 🛠 配置示例
  6. 📌 最佳实践
  7. 🧩 总结

📖 什么是 Redis Sentinel

Redis Sentinel 是 Redis 官方提供的高可用管理工具,它主要负责:

  • 监控(Monitoring):持续监控 Redis 主从实例是否可用。
  • 通知(Notification):当节点异常时,向管理员或其他应用发送告警。
  • 自动故障转移(Failover):当主节点宕机时自动切换到从节点。
  • 配置提供(Configuration provider):客户端可向 Sentinel 查询当前的主节点信息。

🌐 为什么需要 resolve-hostnames

在哨兵配置文件中,我们常用以下语句声明主节点:

sentinel monitor mymaster redis-master 6379 2

这里的 redis-master 不是 IP 地址,而是一个主机名
在本地或物理机环境中,主机名可以直接解析为 IP,但在 Docker Compose / Kubernetes 环境中:

  • 主机名解析需要通过 内部 DNS
  • Redis Sentinel 默认 不会解析主机名,而是直接尝试用字符串当 IP 连接
  • 导致 Sentinel 启动时报错:

在这里插入图片描述

Error resolving hostname 'redis-master'

⚙ 默认行为与问题

如果没有显式开启:

sentinel resolve-hostnames yes

那么:

  • 默认值是 no(不解析主机名)
  • Sentinel 会直接把 redis-master 当成 IP 处理 → 无法解析
  • 这种情况在 Docker bridge 网络、Kubernetes Service 名称、跨主机部署 中极易出现
  • 哨兵无法识别主节点,导致监控、故障转移全部失效

🔍 开启 resolve-hostnames 的作用

当配置为:

sentinel resolve-hostnames yes

作用如下:

  1. 允许 Sentinel 解析主机名
    支持通过 DNS 获取 redis-master 对应的 IP 地址
  2. 🌐 支持动态 IP 环境
    适配 Docker、K8s、云环境中容器 IP 变化的情况
  3. 🔄 在故障转移时自动解析新 IP
    即使节点 IP 变了,只要主机名不变,哨兵依然能识别

🛠 配置示例

一个典型的 sentinel.conf 配置:

port 26379
bind 0.0.0.0

# 监控主节点,quorum=2
sentinel monitor mymaster redis-master 6379 2

# 主节点宕机 5 秒后认为不可用
sentinel down-after-milliseconds mymaster 5000

# 故障转移超时
sentinel failover-timeout mymaster 10000

# 同步数量
sentinel parallel-syncs mymaster 1

# 允许解析主机名(必须开启)
sentinel resolve-hostnames yes

📌 最佳实践

  • Docker Compose 中使用服务名(如 redis-master)代替固定 IP

  • Kubernetes 中使用 Service 名称(如 redis-master.default.svc.cluster.local

  • 永远开启:

    sentinel resolve-hostnames yes
    
  • 搭配 sentinel announce-hostnames yes,让 Sentinel 广播时也使用主机名而不是 IP


🧩 总结

sentinel resolve-hostnames yes 不是可选配置,在现代云原生环境中几乎是 必需的

  • 解决主机名无法解析问题
  • 适配动态 IP 环境
  • 提高故障转移的稳定性

一句话总结

如果你的 Redis Sentinel 部署在 Docker/K8s/云环境中,必须开启 resolve-hostnames,否则主从切换可能直接失效。