Redis报错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// r e d i s − > c o n n e c t ( i ˊ n s t − n a m e . r e d i s . r d s . a l i y u n c s . c o m , ˊ 6379 ) ; redis->connect(\'inst-name.redis.rds.aliyuncs.com\', 6379); redis>connect(iˊnstname.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错误。

查看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 = 262144net.ipv4.ip_local_port_range = 32768 61000

修改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上已经被弃用)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"Cannot assign requested address"是一个常见的错误信息,通常在连接Redis服务器时出现。这个错误提示表明客户端无法为新的连接分配一个可用的端口。有几种可能的原因导致这个错误出现。 一种可能的原因是并发访问量较大,处于TIME-WAIT状态下的TCP连接较多。在这种情况下,可以尝试使用pconnect替换connect来解决问题。pconnect是一个基于连接池的方法,可以重用已经建立的连接,而不需要频繁地创建和关闭连接。这将减少新连接的需求,从而避免了"Cannot assign requested address"错误的发生。 另一种可能的解决方案是调整操作系统的网络配置。通过增加系统的可用端口范围,可以提供更多的可用端口给新的连接。具体的配置方法取决于操作系统的类型和版本,可以参考相关的文档或者咨询系统管理员进行配置。 总结起来,解决"Cannot assign requested address"错误的方法有两种:一是使用pconnect来重用已经建立的连接,二是调整操作系统的网络配置以提供更多的可用端口。根据具体的情况选择合适的解决方案来解决该错误。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [TIME_WAIT引起Cannot assign requested address报错](https://blog.csdn.net/weixin_30266885/article/details/96400831)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Redis报错Cannot assign requested address解决方案](https://blog.csdn.net/SakuraLLj/article/details/131690549)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值