Redis故障转移引发部分IIS实例响应缓慢问题排查
问题解答
一、排查Redis故障转移原因
1. 检查Redis Sentinel日志
- 登录运行Sentinel的CentOS节点,执行
docker logs <sentinel-container-id>查看容器内日志,重点关注:- 主观下线(SDOWN)、客观下线(ODOWN)的触发时间与触发条件
- 主节点选举过程的日志细节,是否存在选举超时、节点通信失败等异常
- 日志中是否记录了节点失联、网络波动、内存超限、CPU负载过高的情况
2. 分析Redis主节点故障前状态
- 执行
docker logs <redis-master-container-id>查看主节点故障前的Redis日志,检查:- 是否有OOM(内存不足)导致进程被kill的记录
- RDB/AOF持久化过程是否引发性能骤降或进程挂起
- 是否出现
maxclients超限导致的连接拒绝日志
3. 验证集群网络与节点资源
- 在CentOS节点上用
ping、traceroute检测Redis节点间的网络连通性,排查是否有丢包、延迟突增问题 - 通过
top、free、iostat查看节点的CPU、内存、磁盘IO数据,确认故障时是否存在资源耗尽情况 - 检查HAProxy的运行日志,确认健康检查、流量转发是否正常
二、IIS侧排查线程数升高与响应缓慢问题
1. 实时监控关键性能指标
- 打开Windows性能监视器,添加以下计数器:
.NET CLR Threads-># of Threads:跟踪应用池总线程数变化ASP.NET->Requests Current:查看活跃请求数量ASP.NET->Requests Queued:检查请求排队情况
- 故障转移发生时,观察这些指标是否突增,判断是否因线程池耗尽导致响应变慢
2. 抓取应用线程快照
- 使用
dotnet-dump或Visual Studio诊断工具,在应用响应缓慢时抓取线程快照:- 排查是否有大量线程阻塞在
Microsoft.Web.Redis.RedisSessionStateProvider相关的调用上 - 检查是否存在死锁、长时间等待的线程
- 排查是否有大量线程阻塞在
3. 分析应用与系统日志
- 查看Web应用的自定义日志,确认故障转移时是否有大量Redis连接超时、重试的记录
- 打开Windows事件查看器,检查
Windows Logs -> Application中是否有.NET运行时、IIS的错误/警告,比如线程池耗尽的提示
4. 验证Redis会话提供器配置
- 当前使用的
Microsoft.Web.Redis.RedisSessionStateProvider版本为4.0.1,需确认该版本是否存在故障转移时的连接泄漏或重试逻辑缺陷 - 检查web.config中的连接字符串配置:
确认<sessionState mode="Custom" customProvider="SessionStateStore" timeout="50"> <providers> <add name="SessionStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider" connectionString="10.40.50.50:26379,10.40.50.51:26379,10.40.50.52:26379,10.40.50.53:26379,ssl=false,password=aPassword,serviceName=master" throwOnError="False" /> </providers> </sessionState>serviceName=master配置是否能让Sentinel正确解析主节点切换,是否存在旧主节点地址缓存的问题
内容的提问来源于stack exchange,提问作者Confounder
相关产品推荐
相关产品推荐

