短连接访问Redis报错Cannot assign requested address解决方案

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: “短连接访问Redis报错Cannot assign requested address”,出现这种错误的应用程序使用的架构基本都是php-fpm+phpredis。并发较大的情况下,处于TIME-WAIT状态下的TCP连接较多,客户端无法分配出新的端口,报错Cannot assign requested address。下文针对这种情况给出两种解决方案。

“短连接访问Redis报错Cannot assign requested address”,出现这种错误的应用程序使用的架构基本都是php-fpm+phpredis。并发较大的情况下,处于TIME-WAIT状态下的TCP连接较多,客户端无法分配出新的端口,报错Cannot assign requested address。下面针对这种情况给解决方案,有两种解决方案,适用于不同的场景:

一劳永逸-使用pconnect替换connect

这种方案的思路是用长连接替代短连接,减少TCP连接,同时可以避免每次请求建连,减少延时。

之前连接Redis的代码是:

$redis->connect('inst-name.redis.rds.aliyuncs.com', 6379);
$redis->auth('inst-password');

修改为pconnect,使用persistent connection:

// phpredis >= 5.3.0, 强烈建议这种pconnect初始化方式,避免断连时出现no auth
// timeout,persistent_id,retry_interval,read_timeout等参数根据业务实现情况修改
// 官方文档:https://github.com/phpredis/phpredis#pconnect-popen
// $redis->connect('inst-name.redis.rds.aliyuncs.com', 6379);
$redis->pconnect('inst-name.redis.rds.aliyuncs.com', 6379, 0, NULL, 0, 0, ['auth' => ['inst-password']]);

无奈之选-修改客户端所在ECS内核参数tcp_max_tw_buckets

这种方案的思路是直接复用处于TIME-WAIT状态的端口,但是如果服务端因为重传对应五元组仍然处于LAST-ACK状态时,建连会失败,所以强烈建议pconnect的方案

对于一些场景(比如说业务代码牵涉过多组件不易变更等),需要更快的方式来满足高并发的场景,可以选择修改内核参数tcp_max_tw_buckets,避免出现Cannot assign requested address错误。

  1. 查看ip_local_port_range和tcp_max_tw_buckets

    $sysctl net.ipv4.tcp_max_tw_buckets net.ipv4.ip_local_port_range
    net.ipv4.tcp_max_tw_buckets = 262144
    net.ipv4.ip_local_port_range = 32768    61000
  2. 修改tcp_max_tw_buckets,保证tcp_max_tw_buckets比ip_local_port_range小

    sysctl -w net.ipv4.tcp_max_tw_buckets=10000

请忽略所有修改tcp_tw_reuse、tcp_tw_recycle的方法,这些方法对于使用了nat/lvs的服务均不适用(tcp_tw_recycle在Linux 4.12上已经被弃用)。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
10天前
|
NoSQL 关系型数据库 Redis
Docker的通俗理解和通过宿主机端口访问Redis容器的实例
本文目标:引导初学者入门Docker,理解镜像、容器和宿主机概念,学习常用Docker命令,特别是如何创建并从Redis容器通过宿主机端口访问。 关键点: - Docker核心:镜像(类)、容器(实例)、宿主机(运行环境)。 - `docker pull` 拉取镜像,如 `redis:3.0`。 - `docker run -d --name` 后台运行容器,如 `my-redis`。 - `-p` 参数做端口映射,如 `6379:6379`。 - `docker exec -it` 交互式进入容器,如 `bash` 或执行命令。
|
1天前
|
NoSQL Java 应用服务中间件
蓝易云 - Spring redis使用报错Read timed out排查解决
以上都是可能的解决方案,具体的解决方案可能会因具体情况而异。
7 2
|
2天前
|
NoSQL Redis
蓝易云 - redis报错WRONGTYPE Operation against a key holding the wrong kind of value
解决这个问题的方法是检查你的代码,确保你对每个键使用的命令与该键的类型匹配。你可以使用 `TYPE`命令来确定一个键的类型。例如,`TYPE mykey`将返回 `mykey`的类型。
10 3
|
8天前
|
存储 缓存 NoSQL
Redis是一种高性能的内存数据库,常用于高并发环境下的缓存解决方案
【6月更文挑战第18天】**Redis摘要:** 高性能内存数据库,擅长高并发缓存。数据存内存,访问迅速;支持字符串、列表等多元数据类型;具备持久化防止数据丢失;丰富命令集便于操作;通过节点集群实现数据分片与负载均衡,增强可用性和扩展性。理想的缓存解决方案。
22 1
|
13天前
|
存储 NoSQL Redis
多次访问redis造成redis连接断开的解决方案
多次访问redis造成redis连接断开的解决方案
16 2
|
15天前
|
NoSQL 数据管理 关系型数据库
数据管理DMS操作报错合集之控制台查看Redis时出现乱码是什么导致的
数据管理DMS(Data Management Service)是阿里云提供的数据库管理和运维服务,它支持多种数据库类型,包括RDS、PolarDB、MongoDB等。在使用DMS进行数据库操作时,可能会遇到各种报错情况。以下是一些常见的DMS操作报错及其可能的原因与解决措施的合集。
|
1天前
|
存储 监控 NoSQL
35个Redis企业级性能优化点与解决方案
Redis作为企业级应用中广泛使用的高性能键值存储数据库,其性能优化是一个复杂且多面的话题。以下是V 哥整理的一些关键的优化点和相应的解决方案,提供给兄弟们参考。
|
2天前
|
NoSQL Java 关系型数据库
非关系型数据库NoSQL数据层解决方案 之 redis springboot整合与读写操作 2024详解以及window版redis5.0.14下载
非关系型数据库NoSQL数据层解决方案 之 redis springboot整合与读写操作 2024详解以及window版redis5.0.14下载
5 0
|
7天前
|
NoSQL 网络安全 Redis
redis未授权访问利用汇总
redis未授权访问利用汇总
|
8天前
|
NoSQL Redis Windows
win10下Redis安装、启动教程
win10下Redis安装、启动教程
17 2

相关产品

  • 云数据库 Redis 版