当前位置:首页 > 问答 > 正文

Redis连接不上哨兵了?教你几招快速排查和解决办法

最近是不是遇到了应用突然报错,说连不上Redis了?而且你明明配置了哨兵(Sentinel)模式来保证高可用,结果还是出了问题,别急,这种情况很常见,多半是哨兵那边出了岔子,下面我就用大白话给你梳理一下,怎么一步步把问题找出来并解决掉。

第一步:先别乱动,看看日志说了什么

日志就像是系统的病历,哪里不舒服它最先知道,遇到连接不上的第一反应,应该是去翻日志。

  1. 看应用日志:你的应用程序(比如Java应用)在尝试连接哨兵失败时,肯定会抛出错误信息,仔细看这个错误,它会告诉你具体是哪个哨兵地址连接超时,还是认证失败,或者是它从哨兵那里获取不到主节点的信息,这能帮你快速缩小排查范围。
  2. 看哨兵日志:这是最关键的一步,你需要登录到部署了Redis哨兵的机器上,找到哨兵的日志文件,哨兵默认会在日志里记录它自己和其他哨兵节点、Redis主从节点之间的“心跳”检测情况,重点关注有没有“+switch-master”(主从切换)、“+sdown”(主观下线)、“+odown”(客观下线)、“-sdown”(主观上线)这类事件记录,如果发现哨兵认为主节点已经挂了(odown),但却迟迟没有触发切换,或者几个哨兵之间吵起来了(投票没达成一致),那问题就出在哨兵集群本身。

第二步:检查哨兵集群的“健康状况”

Redis连接不上哨兵了?教你几招快速排查和解决办法

光看日志还不够,你得亲自问问哨兵:“你们现在觉得谁是老大?你们几个之间还联系得上吗?”

  1. 连接任意一个哨兵节点:用redis-cli命令工具,连接上一个你认为应该正常的哨兵端口(默认是26379)。
  2. 执行检查命令
    • 查主节点信息:输入命令 sentinel master mymaster(这里的mymaster是你配置的监控主节点的名称),这个命令会返回一大段信息,你要重点关注ipport,看看它指出的主节点地址是不是你期望的那个,有时候可能已经切换了,但你的应用配置没更新。
    • 查哨兵们是否团结:输入命令 sentinel sentinels mymaster,这个命令会列出所有监控同一个主节点的其他哨兵节点,你看看返回的列表数量对不对,是不是你部署的所有哨兵都在里面,如果少了某个哨兵,说明哨兵集群内部网络可能有问题,或者那个哨兵进程挂掉了。
    • 查哨兵自己认不认识伙伴:输入命令 info sentinel,这会显示这个哨兵视角下,集群里总共有多少个哨兵(sentinel_masters等统计信息),可以辅助判断。

第三步:揪出常见“元凶”

Redis连接不上哨兵了?教你几招快速排查和解决办法

根据上面的检查,大概率能锁定问题方向,下面是一些常见的罪魁祸首:

  1. 网络问题(最常见):防火墙是头号杀手!确保你的应用服务器和所有哨兵服务器之间的哨兵端口(如26379) 以及Redis服务端口(如6379) 是互通的,可以用telnet哨兵IP 26379这样的命令简单测试一下,安全组规则(云服务器)或者网络策略(Kubernetes环境)也要仔细检查。
  2. 配置不一致的坑:哨兵的配置文件sentinel.conf里的几个参数必须保证所有哨兵节点一致:
    • sentinel monitor mymaster [主库IP] [主库端口] [法定票数]:这一行里的主库IP、端口、法定票数必须一样。
    • sentinel auth-pass mymaster [密码]:如果Redis主从节点有密码,这里一定要配置正确且一致。
    • 配置不一致会导致哨兵对集群状态的认知分裂。
  3. 时间不同步惹的祸:哨兵节点之间的系统时间如果相差太大,可能会影响心跳判断的准确性,确保所有服务器的时间基本同步(可以使用NTP服务)。
  4. 权限问题:如果Redis设置了requirepass密码,哨兵配置中必须用sentinel auth-pass指令正确配置,如果哨兵本身配置了密码(requirepass in sentinel.conf),那么应用连接哨兵时也需要提供这个密码。
  5. 脑裂问题(比较棘手):当网络发生严重分区时,可能会导致哨兵集群被分割成两派,各自选出了不同的主节点,这时候需要人工介入,根据数据的新旧程度,强制指定一个主节点,并重启其他节点以重新同步。

第四步:解决办法与总结

找到原因后,解决办法就相对直接了:

  • 网络问题:放开防火墙/安全组规则。
  • 配置问题:统一所有哨兵节点的配置文件,然后逐个重启哨兵服务(注意不要同时全部重启)。
  • 进程挂掉:重启挂掉的Redis或哨兵进程。
  • 脑裂问题:谨慎操作,优先选择数据可能更新的那个分区,将其提升为主节点,并处理数据不一致的问题。

Redis哨兵连接不上,别慌,按照“应用日志 -> 哨兵日志 -> 哨兵状态命令 -> 检查网络/配置”这个流程来,一步步排查,绝大多数问题都能迎刃而解,平时做好监控,把哨兵部署在稳定的网络环境中,就能大大减少这类故障的发生。 综合参考了Redis官方文档关于哨兵的说明以及常见的运维实践经验)