现象描述
现象1:使用云服务器 CVM 通过自动分配给云数据库的内网地址连接云数据库 Redis,连接失败。具体连接方式,请参见 连接 Redis 实例。
可能原因
首次连接数据库失败时,可能原因如下:
端口问题。
网络配置问题或安全组配置错误。
密码问题。
实例运行过程中突发连接失败,可能原因如下:
连接数已满。
内存写满或者分片写满。
发生 HA 切换、服务不可用、只读副本切换、只读副本服务不可用等。
客户端问题,可能原因如下:
连接池参数设置不合理。
连接泄露。
处理步骤
步骤1:使用 telnet 确认 Redis 端口是否可正常访问
大部分客户遇到的连接失败、无法连接等问题,可以通过命令行工具以及 telnet 缩小问题范围。
[root@VM-4-10-centos ~]# telnet 10.x.x.34 6379Trying 10.x.x.34...Connected to 10.x.x.34.Escape character is '^]'.
步骤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 password10.x.x.2:6379> info cpu# CPUused_cpu_sys:1623.176000used_cpu_user:4649.572000used_cpu_sys_children:0.000000used_cpu_user_children:0.000000
如果执行提示
NOAUTH Authentication required.
代表密码错误。10.x.x.31:6379> info memoryNOAUTH Authentication required.10.x.x.31:6379>
步骤5:确认是否内存写满或分片写满导致连接失败
如果业务提示如下错误信息。
"-READONLY You can't write against a read only slave.\\r\\n"
内存写满情况下,写入失败,需进行如下操作。
注意:
驱逐策略调整为
allkeys-lru
,可能损坏业务数据,请根据实际需求评估。步骤6:确认是否连接数配额不足
监控指标连接使用率指客户端连接到实例的 TCP 连接数量与实例最大连接数的占比,该指标持续偏高,说明当前数据库连接数配额不足,需调整最大连接数。
问题现象
错误提示信息如下所示:
ERR max number of clients reached
解决方法
1. 登录 Redis 控制台 在,右侧实例列表页面上方,选择地域。在实例列表中,到目标实例。单击蓝色字体的实例 ID,进入实例详情页面,单击系统监控页签,再选择监控指标页签,查看监控数据。在视图下拉列表选择实例监控,指标选择连接使用率,查看其监控视图是否持续偏高。
步骤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 网络类型
查看 Redis 网络类型