Redis Sentinel 中 `sentinel resolve-hostnames yes` 的必要性解析
📌 Redis Sentinel 中 sentinel resolve-hostnames yes
的必要性解析
在使用 Docker 或 Kubernetes 部署 Redis Sentinel 时,你可能会遇到 哨兵无法解析主节点或从节点的主机名 的问题。
这时,sentinel resolve-hostnames yes
这个配置项就显得非常关键。
📚 目录
- 📖 什么是 Redis Sentinel
- 🌐 为什么需要
resolve-hostnames
- ⚙ 默认行为与问题
- 🔍 开启
resolve-hostnames
的作用 - 🛠 配置示例
- 📌 最佳实践
- 🧩 总结
📖 什么是 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
作用如下:
- ✅ 允许 Sentinel 解析主机名
支持通过 DNS 获取redis-master
对应的 IP 地址 - 🌐 支持动态 IP 环境
适配 Docker、K8s、云环境中容器 IP 变化的情况 - 🔄 在故障转移时自动解析新 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
,否则主从切换可能直接失效。