内网无法连接定位指南

最近更新时间:2024-02-26 10:24:31

我的收藏

现象描述

现象1:使用云服务器 CVM 通过自动分配给云数据库的内网地址连接云数据库 Redis,连接失败。具体连接方式,请参见 连接 Redis 实例
现象2:登录 Redis 控制台,在实例列表,在目标实例的操作列,单击登录,跳转至数据库管理 DMC 平台,连接云数据库 Redis,连接失败,如下图所示。



可能原因

首次连接数据库失败时,可能原因如下:
端口问题。
网络配置问题或安全组配置错误。
密码问题。
实例运行过程中突发连接失败,可能原因如下:
连接数已满。
内存写满或者分片写满。
发生 HA 切换、服务不可用、只读副本切换、只读副本服务不可用等。
客户端问题,可能原因如下:
连接池参数设置不合理。
连接泄露。

处理步骤

步骤1:使用 telnet 确认 Redis 端口是否可正常访问

大部分客户遇到的连接失败、无法连接等问题,可以通过命令行工具以及 telnet 缩小问题范围。
[root@VM-4-10-centos ~]# telnet 10.x.x.34 6379
Trying 10.x.x.34...
Connected to 10.x.x.34.
Escape character is '^]'.
如上述所示,提示连接成功代表 Redis 实例端口正常可访问。如果出现异常,请继续 步骤2,排查网络问题。

步骤2:排查是否为网络配置问题

云服务器和数据库,务必在同一账号同一个 VPC 内,或同在基础网络内,才能内网直接互通。如下情况,都可能导致连接失败。
云服务器(CVM)采用私有网络(VPC),Redis 采用基础网络。建议将 Redis 从基础网络切换为 VPC 网络,请参见 配置网络
CVM 采用基础网络,Redis 采用 VPC。建议将 CVM 从基础网络切换为 VPC 网络,请参见 切换私有网络服务
CVM 与 Redis 在同一地域内,但属于不同的 VPC 网络。建议将 Redis 迁移到 CVM 所在的 VPC 网络,请参见 配置网络
CVM 与 Redis 不在同一地域内,属于不同的 VPC 网络。建议在两个 VPC 网络之间建立 云联网
CVM 与 Redis 账号不同,属于不同的 VPC 网络。建议在两个 VPC 网络之间建立 云联网

步骤3:确认是否为安全组问题

若 CVM 和 Redis 的安全组配置有误,则会导致 CVM 无法连接 Redis。

CVM 安全组配置有误

若想使用 CVM 连接 Redis,需在 CVM 安全组中配置出站规则当出站规则的目标配置不为0.0.0.0/0且协议端口不为 ALL 时,需要把 Redis 的 IP 及端口添加到出站规则中。
1. 登录 安全组控制台,在安全组列表中,找到 CVM 所绑定的安全组,单击安全组名,进入 CVM 绑定的安全组详情页。
2. 选择出站规则页签,单击添加规则
类型选择自定义。
目标填写您 Redis 的 IP 地址(段)。
协议端口填写 Redis 内网端口
策略选择允许

Redis 安全组配置有误

若想指定的 CVM 连接 Redis 实例,需要在 Redis 安全组中配置入站规则当入站规则的源端配置不为0.0.0.0/0且协议端口不为 ALL 时,需要把 CVM 的 IP 及端口添加到入站规则中。
1. 登录 安全组控制台,在安全组列表中,找到 Redis 实例所绑定的安全组,单击安全组名,进入 Redis 绑定的安全组详情页。
2. 选择入站规则页签,单击添加规则。 填写您允许连接的 IP 地址(段)及需要放通的端口信息(Redis 内网端口),选择允许放通。
类型选择自定义。
来源填写您 CVM 的 IP 地址(段)。
协议端口填写 Redis 内网端口。
策略选择允许
注意:
Redis 内网默认端口为6379,同时支持自定义端口,若修改过默认端口号,安全组中需放通 Redis 新端口信息。
安全组入站规则需要放通 Redis 实例的6379端口。

步骤4:确认是否为密码问题

执行 info 命令进行测试,如果执行提示如下,说明 Redis 密码没有问题。
[root@SNG-Qcloud /data/home/rickyu]# redis-cli -h 10.x.x.34 -p 6379 -a password
10.x.x.2:6379> info cpu
# CPU
used_cpu_sys:1623.176000
used_cpu_user:4649.572000
used_cpu_sys_children:0.000000
used_cpu_user_children:0.000000
如果执行提示NOAUTH Authentication required.代表密码错误。
10.x.x.31:6379> info memory
NOAUTH Authentication required.
10.x.x.31:6379>
登录 Redis 控制台,单击实例 ID 进入详情页,进行密码重置即可,具体操作,请参见 管理账号

步骤5:确认是否内存写满或分片写满导致连接失败

如果业务提示如下错误信息。
"-READONLY You can't write against a read only slave.\\r\\n"
登录 Redis 控制台,在实例列表找到目标实例,单击实例 ID 进入系统监控页面,指标下拉列表选择内存使用率,查看实例内存写满情况。

内存写满情况下,写入失败,需进行如下操作。
立即进行扩容。具体操作,请参见 变更实例规格
修改数据库驱逐策略。在参数配置中设置参数maxmemory-policy调整为allkeys-lru或者volatile-lru。具体操作,请参见 管理实例参数
注意:
驱逐策略调整为allkeys-lru,可能损坏业务数据,请根据实际需求评估。

步骤6:确认是否连接数配额不足

监控指标连接使用率指客户端连接到实例的 TCP 连接数量与实例最大连接数的占比,该指标持续偏高,说明当前数据库连接数配额不足,需调整最大连接数。

问题现象

错误提示信息如下所示:
ERR max number of clients reached

解决方法

1. 登录 Redis 控制台 在,右侧实例列表页面上方,选择地域。在实例列表中,到目标实例。单击蓝色字体的实例 ID,进入实例详情页面,单击系统监控页签,再选择监控指标页签,查看监控数据。在视图下拉列表选择实例监控,指标选择连接使用率,查看其监控视图是否持续偏高。
2. 连接使用率持续偏高,调整最大连接数,修改连接数配置规格。具体操作,请参见 调整连接数数量

步骤7:确认是否发生 HA 切换、服务不可用、只读副本切换、只读副本服务不可用等

如果在某个确定的时间点发现连接异常或者有大量的访问报错及慢查询,同时接收到腾讯云可观测平台事件告警,发生了异常事件,请联系 在线客服 获取帮助。
腾讯云可观测平台事件告警配置方法,请参见 创建事件规则

步骤8:如果使用 Jedis 连接池,确认客户端连接池配置是否合理

问题现象

如果连接池可用连接数量耗尽,旧连接未及时释放,新创建连接会失败,客户端提示如下错误信息。
JedisConnectionException: Could not get a resource from the pool

解决方法

1. 在客户端使用如下指令,确认当前访问实例6379端口的连接数量,如果客户端连接数接近连接池配置的 maxTotal 值,将会出现连接失败的问题。
netstat -an | grep 6379 | grep ESTABLISHED | wc -l
2. 参考Java 连接示例,检查是否调用 jedis.close() 进行旧连接的释放,避免连接泄露。
3. 如果旧连接都已释放,业务并发量大的情况下,需增加 maxTotal 参数值。
说明:
每个客户端连接池 maxTotal 值 * 客户端数量 = 云数据库 Redis 的最大连接数。

更多参考

网络类型/ VPC 判断方法

使用内网地址连接云数据库时,CVM 和 Redis 须是同一账号,且同一个 VPC 内,或同在基础网络。
说明:
如果实例列表的网络处,均显示为基础网络或均显示为 VPC,则表示 CVM 和 Redis 是同一网络类型。
如果实例列表的网络处,均显示为同一个 VPC(保障同一个地域),则表示 CVM 和 Redis 是同一 VPC。

查看 CVM 网络类型

登录 CVM 控制台,在实例列表查看网络


查看 Redis 网络类型

登录 Redis 控制台,在实例列表查看网络


通过开启外网地址实现外网访问

云数据库 Redis 现已支持在控制台手动开启外网地址,实现外网访问 Redis 实例。具体操作,请参见 配置外网地址