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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: “短连接访问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
目录
相关文章
|
1月前
|
NoSQL 关系型数据库 MySQL
2024Mysql And Redis基础与进阶操作系列(4-2)作者——LJS[含MySQL非空、唯一性、PRIMARY KEY、自增列/自增约束举例说明等详解步骤及常见报错问题对应的解决方法]
24MySQL非空、唯一性、PRIMARY KEY、自增列/自增约束举例说明等详解步骤及常见报错问题对应的解决方法(4-2) 学不会你来砍我!!!
|
1月前
|
消息中间件 监控 NoSQL
Redis脑裂问题详解及解决方案
Redis脑裂问题是分布式系统中常见的复杂问题,合理配置Redis Sentinel、使用保护模式、采用分布式锁机制以及优化网络和客户端连接策略等措施,可以有效预防和解决脑裂问题。通过深入理解Redis脑裂问题的成因和影响,采取相应的解决方案,能够提高系统的可用性和数据一致性,保障Redis集群的稳定运行。希望本文能帮助你更好地理解和应对Redis脑裂问题。
41 2
|
1月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
43 5
|
1月前
|
NoSQL 安全 关系型数据库
2024Mysql And Redis基础与进阶操作系列(6)作者——LJS[含MySQL 多表之一对一/多;多对多;多表联合查询等详解步骤及常见报错问题所对应的解决方法]
MySQL 多表之一对一/多;多对多;多表联合之交叉连接;内连接;左、右、外、满、连接;子查询及关键字;自连接查询等详解步骤及常见报错问题所对应的解决方法
|
1月前
|
SQL NoSQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(5)作者——LJS[含MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页等详解步骤及常见报错问题所对应的解决方法]
MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页、INSERT INTO SELECT / FROM查询结合精例等详解步骤及常见报错问题所对应的解决方法
|
1月前
|
SQL NoSQL 关系型数据库
|
1月前
|
存储 SQL NoSQL
|
1月前
|
NoSQL 编译器 Linux
【赵渝强老师】Redis的安装与访问
本文基于Redis 6.2版本,详细介绍了在CentOS 7 64位虚拟机环境中部署Redis的步骤。内容包括安装GCC编译器、创建安装目录、解压安装包、编译安装、配置文件修改、启动服务及验证等操作。视频讲解和相关图片帮助理解每一步骤。
|
1月前
|
NoSQL 关系型数据库 MySQL
2024Mysql And Redis基础与进阶操作系列(8)作者——LJS[含MySQL 创建、修改、跟新、重命名、删除视图等具体详步骤;注意点及常见报错问题所对应的解决方法]
MySQL 创建、修改、跟新、重命名、删除视图等具体详步骤;举例说明注意点及常见报错问题所对应的解决方法
|
1月前
|
SQL NoSQL 关系型数据库

相关产品

  • 云数据库 Tair(兼容 Redis)