华为云 DCS Redis 连不上/频繁超时:网络、白名单到连接池的分层排查清单

举报
yd_294423728 发表于 2026/11/02 11:40:40 2026/11/02
【摘要】 DCS Redis 报 Connection refused、Read timed out、拿不到池连接时,按「网络→访问控制→连接方式→实例资源→客户端」五层排查:先用 nc 判断端口通不通,按版本核对安全组或白名单,再看流控次数、活跃连接数、大 Key 和 KEYS 慢命令,最后检查 Jedis 连接池与重连重试,附速查表。

应用连分布式缓存服务 DCS 的 Redis 实例时,报错五花八门:Connection refused、Connection reset by peer、Read timed out、Could not get a resource from the pool、NOAUTH、unexpected end of stream……常见的情况是,大家先怀疑密码或者客户端版本,折腾半天才发现其实是白名单没加,或者是带宽被打满了。这篇把排查顺序整理成「网络 → 访问控制 → 认证与连接方式 → 实例资源 → 客户端」五层,从下往上逐层排除。

一、先分清是「完全连不上」还是「时好时坏」

这一步决定后面往哪个方向查:

  • 一直连不上(每次都失败):多半是网络不通、访问控制拦截、地址或端口写错、认证方式不对,重点看第二、三节。
  • 大部分正常、偶发超时或断开:多半是资源瓶颈(带宽、CPU、内存、连接数)、慢命令、客户端连接池配置,或者实例正在做规格变更、主备切换,重点看第四、五节。

在客户端所在的 ECS 上先做两个最小验证:

# 1. 域名能否解析(连接地址用的是域名时)
nslookup <实例连接地址>

# 2. 端口是否可达(DCS Redis 默认端口 6379)
nc -zv <实例连接地址> 6379
# 没有 nc 的话可以用:timeout 3 bash -c '</dev/tcp/<IP>/6379' && echo ok

端口通但命令报认证失败,说明网络这一层没问题,直接跳到第三节;端口不通,从第二节开始查。

二、网络与访问控制:最常见的「一直连不上」

按下面顺序逐条核对:

  1. Region 是否一致。DCS 实例和客户端不在同一个 Region 时,同 VPC 内网直连这条路走不通。官方的做法有两种:用云专线打通网络;或者在客户端所在 Region 新建实例,再把数据迁移过去。跨 Region 时实例域名无法解析,需要改用 IP,或者在 hosts 里手动绑定域名与 IP。
  2. VPC 是否一致。不同 VPC 的网络默认不通,同 Region 跨 VPC 需要先建 VPC 对等连接。官方也建议客户端 ECS 和实例放在同一 VPC、同一子网,以减少时延。
  3. 安全组还是白名单——先看实例版本。这是最容易搞混的一点:
    • Redis 3.0 / Redis 6.0 企业版(以及 Memcached):用安全组控制访问,不支持白名单。ECS 所在安全组的出方向要能访问实例端口;实例所在安全组的入方向要放通客户端。两者用同一个安全组时,组内默认互通。入方向源地址尽量写具体 IP 或安全组,慎用 0.0.0.0/0。
    • Redis 4.0 及以上基础版:不支持安全组,只支持白名单(这类实例基于 VPC Endpoint)。没有添加任何白名单或停用白名单时,与实例所在 VPC 互通的 IP 都能访问;一旦启用白名单,只有名单内的 IP 才能新建连接。
  4. 白名单的几个细节(Redis 4.0 及以上基础版):
    • 入口在实例详情页的「实例配置 > 白名单配置」,点「创建白名单分组」。
    • 每个实例最多 4 个分组,共 100 个 IP / 地址段,多个之间用英文逗号分隔,不支持 0.0.0.0 和 0.0.0.0/0。
    • 新建白名单后,已有的长连接要重连才生效,所以经常出现「老进程正常、新扩容的机器连不上」:新机器的 IP 没加进去。
    • 客户端 IP 有变化(弹性伸缩、换机器)时,要同步更新白名单。
  5. 子网网络 ACL。实例所在子网如果关联了网络 ACL,并且限制了出方向,连接也会失败或被重置,需要放开相应规则。

三、地址、端口与连接方式

网络通了仍然连不上,就核对连接方式本身:

  1. Cluster 集群要带 -c。用 redis-cli 连 Cluster 集群时必须加 -c,否则遇到 MOVED 重定向就会报错;单机、主备、Proxy 集群不需要:

    # Cluster 集群
    ./redis-cli -h <实例地址> -p 6379 -a <密码> -c
    # 单机 / 主备 / Proxy 集群
    ./redis-cli -h <实例地址> -p 6379 -a <密码>
    

    注意 -a 会把密码暴露在 ps 进程列表里,官方的安全加固建议里也提到了这一点。生产机上排查完记得清理 shell 历史。

  2. 密码错误的特征:端口能连上,但鉴权失败。忘了密码可以在控制台重置。

  3. 公网访问要分版本看:

    • Redis 4.0 及以上:不支持直接绑定弹性公网 IP。开启了密码访问的单机、主备、读写分离、Proxy 集群实例可以通过 ELB 实现公网访问;Cluster 集群实例不支持公网访问。
    • Redis 3.0(已停售,适用于存量实例):开启密码模式的实例可以绑定弹性公网 IP 进行公网访问。安全组入方向在 SSL 关闭时放通 6379,SSL 开启时放通 36379。开了 SSL 就必须在客户端安装配置 Stunnel,连接命令里填 Stunnel 客户端的地址和端口,而不是控制台显示的公网地址。另外,弹性公网 IP 被解绑后公网访问会关闭,需要在控制台重新开启。
    • Redis 4.0 / 5.0 不支持 SSL 加密传输。

四、实例侧资源:偶发超时的主要来源

「时好时坏」的问题,优先看实例监控:

  1. 连接数上限。出现拒绝连接时,查看监控指标「活跃的客户端数量」是否接近实例参数 maxclients。可以在控制台修改配置参数调整 maxclients,但更要查清楚连接为什么这么多(见第五节)。
  2. 带宽打满。实例已用带宽达到规格上限时,部分连接会超时。查看监控指标「流控次数」,统计周期内有流控就说明撞到了带宽上限。Redis 4.0 及之后版本支持在控制台对实例做带宽扩容。
  3. 大 Key / 热 Key。单个 Key 过大或访问过热,会占用大量带宽和 CPU。DCS 控制台自带大 Key 和热 Key 分析,先用它找出问题 Key 再拆分或加本地缓存。
  4. 慢命令阻塞。KEYS 这类全量命令会让 Redis 阻塞,导致其他请求排队超时,出现 Read timed out 或 Could not get a resource from the pool。改用 SCAN 分批遍历,并避免频繁执行。
  5. 内存过高。Key 没有设置过期时间、过期数据长期堆积,会让内存利用率持续走高、访问变慢。结合「内存利用率」「已用内存」两个指标看趋势。
  6. Redis 3.0 + AOF。Redis 3.0 实例开启 AOF 持久化时,可能出现偶发的磁盘性能问题,导致连接异常。可以考虑换到 4.0 及以上版本;如果业务确实不需要持久化,也可以关闭 AOF。
  7. 变更与切换期间的正常闪断:
    • 规格变更:单机、主备、读写分离实例扩容时可能有秒级连接中断和大约 1 分钟的只读(缩容不中断);Redis 3.0 实例则是秒级中断加 5~30 分钟只读;集群实例减少分片时删除节点也会闪断。具体以官方「变更 DCS 实例规格」中的影响说明为准。
    • 主备实例主节点故障:备节点会在 15~30 秒内自动接管,期间连接中断。
    • 这类时段出现的报错,应该由客户端重连机制兜住,而不是靠人工重启应用。

五、客户端:连接池与重连重试

实例指标都正常,问题就多半出在客户端。以 Java 的 Jedis 为例:

  1. 数一下实际连接数,确认连接池有没有泄漏:

    netstat -an | grep 6379 | grep ESTABLISHED | wc -l
    

    连接数随时间只增不减,通常是借出的连接没有归还。Jedis 用完要调用 jedis.close(),我习惯统一用 try-with-resources 写,避免漏掉。

  2. 看 TIME_WAIT 是否异常多:

    ss -s
    

    TIME_WAIT 很多,往往说明连接在频繁新建和关闭,没有真正被池化复用。

  3. 抓包确认是谁先断开:

    tcpdump -i eth0 tcp and port 6379 -n -nn -s 74 -w dump.pcap
    

    eth0 换成实际网卡名。用 Wireshark 看 FIN / RST 是由哪一端发出的,就能区分是服务端断开、中间网络断开,还是客户端自己超时关闭。

  4. 空闲连接检测。长时间空闲的连接可能已经失效,借出去就报 unexpected end of stream。开启 testWhileIdle 这类空闲检测,并参照官方的「连接池选择及 Jedis 连接池参数配置建议」调整连接池参数(如 timeBetweenEvictionRunsMillis、maxWaitMillis、maxTotal)。

  5. 重连与重试分开看:

    • 自动重连是必需的。主流 SDK 的连接池都会在连接断开后重建连接。不用连接池的话,要自己保证下次访问时能新建连接。用 Jedis 时,连接断开后需要重新从池里获取连接。
    • 自动重试是可选的,而且只重试幂等操作。SET 重试多少次结果都一样;LPUSH 重试可能导致列表里多出重复元素。
    • 重试要有次数上限和退避间隔(固定、指数或随机),避免嵌套重试,重试过程中打 WARN 日志。
    • Cluster 集群做扩缩容或副本变更时,客户端要开启集群拓扑自动刷新,否则变更后可能需要重启客户端。

六、预防配置

  • 把访问控制写进上线清单:新机器上线时,同步检查白名单(4.0 及以上基础版)或安全组(3.0 / 6.0 企业版)。
  • 告警前置:至少给内存利用率、活跃的客户端数量、流控次数配置告警,不要等业务报错才发现。
  • 禁用全量命令:代码评审时把 KEYS 列为禁用项,用 SCAN 代替。
  • 给 Key 设过期时间,定期跑大 Key / 热 Key 分析。
  • 演练一次主备切换:在测试实例上手动触发主备切换,验证应用能不能自动恢复。这是检验重连机制最直接的办法。
  • 变更放在低峰期:规格变更会带来闪断和只读,提前通知业务方。

七、速查表

现象 可能原因 怎么确认
端口完全不通 不同 Region / VPC、安全组或白名单拦截、网络 ACL nc -zv,核对 VPC、安全组/白名单、子网 ACL
老机器正常、新机器连不上 新 IP 未加入白名单 白名单配置页核对 IP
端口通但鉴权失败 密码错误 redis-cli 用正确密码重试,必要时重置
Cluster 集群报 MOVED redis-cli 没加 -c 或客户端不支持集群模式 加 -c 重连
公网 SSL 连接被重置 没有经过 Stunnel,直连控制台地址 检查连接地址是否为 Stunnel 客户端地址
偶发超时,流控次数 > 0 带宽打满 「流控次数」指标 + 大 Key / 热 Key 分析
Read timed out / 拿不到池连接 KEYS 等慢命令、连接泄漏 排查慢命令;netstat 统计连接数
unexpected end of stream 空闲连接失效、大 Key 开启空闲检测,做大 Key 分析
某个时间点集中闪断 规格变更或主备切换 对照实例后台任务和变更记录

小结

遇到 DCS Redis 连接问题,我习惯先用 nc 判断端口通不通,把问题分成「网络/访问控制」和「资源/客户端」两大类:前者重点核对版本对应的安全组或白名单;后者先看流控次数和活跃连接数,再查连接池和慢命令。最后,给客户端配好重连、给监控配好告警,大部分连接问题都能在影响业务之前暴露出来。

参考文档:

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。