当前位置: 首页 > 知识库问答 >
问题:

Redis连接超时错误,当在弹性豆茎中运行助手时

石俊雄
2023-03-14

我正在尝试设置sidekiq,以便从我的AWS elastic beanstalk(Amazon Linux 2)实例连接到redis elasticache(支持在途加密)。我关注过这样的链接,但当我这么做时,我得到了一个“Redis::TimeoutError:Connection timed out”。因此,现在我没有部署运行“bundle exec sidekiq-e production”命令的脚本,而是以root权限在ec2实例的/var/app/current目录中运行该命令。不幸的是,这个错误仍然在出现,我不确定为什么。我的安全组都配置正确,我可以确认endpoint是否正确。

奇怪的是,我可以通过运行以下命令在elasticache上连接到我的redisendpoint:openssl s_client-quiet-connect my_redis_endpoint:6379,它可以正常工作。但sidekiq会启动,然后在我运行时超时。以下是输出:

[root@ip-10-0-2-138当前]#bundle exec sidekiq-e production 2020-12-04T05:30:39.930Z pid=2910 tid=2xygu信息:使用redis选项启动sidekiq 6.0.0=

2020-12-04T05:31:04.271Z pid=2910 tid=1e7u1a class=MessageBroadcastJob jid=82dd4217186de283e9d9bb70运行时间=10.251信息:失败

2020-12-04T06:10:30.391Z pid=2910 tid=1e7wm6警告:{“上下文”:“作业引发的异常”,“作业”:{“类”:“活动作业::队列适配器::SidekiqAdapter::作业包装器”,“包装”:“MessageBroadcastJob”,“队列”:“默认”,“参数”:[{“作业类”:“MessageBroadcastJob”,“作业id”:“4d7d5195-7444-44c9-81c7-7f9a0c6b1f75”,“提供程序作业id”:“null”,“队列名称”:“默认”,“priority”:null,“arguments”:[{“_aj_globalid”:”gid://e-wagers/Message/57bed09a-ef2d-4963-8288-65fe733347ba“}],“executions”:0,“locale”:“en”}],“retry”:true,“jid”:“a8f258e1feeecbf8c40a21a5”,“created_at:1607059284.1670992”,“enqueued_at:1607062220.2854364”,“error_message:“Connection Timeout”,“error_class:“Redis::TimeoutError”,“failed_at:1607059284.1989071”,“retry_count”:6,“retried_at:1607060724.9108222”,“jobstr”:”

下面是我的配置文件

# config/initializers/sidekiq.rb

require 'sidekiq'
require 'sidekiq/web'

rails_root = Rails.root || File.dirname(__FILE__) + '/../..'
rails_env = Rails.env || 'development'
redis_config = YAML.load_file(rails_root.to_s + '/config/redis.yml')
redis_config.merge! redis_config.fetch(Rails.env, {})
redis_config.symbolize_keys!

Sidekiq.configure_server do |config|
 config.redis = { url: "redis://#{redis_config[:host]}:#{redis_config[:port]}/12", ssl: true, network_timeout: 5 }
end

Sidekiq.configure_client do |config|
 config.redis = { url: "redis://#{redis_config[:host]}:#{redis_config[:port]}/12", ssl: true, network_timeout: 5 }
end
development:
  host: 'localhost'
  port: 6379
  db: 5
production:
  host: 'master.my_redis_endpoint.bmxvqz.use2.cache.amazonaws.com'
  port: 6379
  db: 5
# config/sidekiq.yml

:concurrency: 25
:queues:
  - [mailers, 3]
  - ["priority", 2]
  - ["default", 1]

有什么想法会导致这种情况吗?不幸的是,网上没有太多关于弹性粉刺、弹性豆茎和较新的亚马逊Linux2平台的资源。

共有2个答案

赵明亮
2023-03-14

由于Sidekiq进程正在从服务器接收作业,因此它能够连接到Redis。你可能看到的是,另一个gem与Redis的连接由于过度激进的超时而失败。在我的例子中,这个gem是Redlock,它设置了100毫秒的超时(对于Elasticache连接来说有点太慢了,它有大约120毫秒的延迟):https://github.com/leandromoreira/redlock-rb/blob/40756981932ca53c3e32bf3c68aa5ea9b772ef16/lib/redlock/client.rb#L9

田冥夜
2023-03-14

你试过用rediss://代替redis://吗?

 类似资料:
  • 我试图增加Amazon弹性Beanstalk的超时,但我仍然得到504网关超时。 以下是我目前所做的工作: 尽管如此,我仍然得到一个“504网关超时”后正好60.1秒。 我错过了什么能让它发挥作用的?

  • 我有一个VPC,在不同的可用性区域(公共子网-2a和公共子网-2b)有两个公共子网(私有2a-EB-Instance,私有2b-EB-Instance),以及Elasticache的另外两个私有子网(私有2a-EB-Instance,私有2b-EB-Instance),这两个elasticache子网是我创建Elasticache集群时使用的子网组的一部分。 我已经为我的ElastiCache(r

  • 配置验证异常:AWS Elastic Beanstatk无法与Amazon EC2通信以确定是否为Elastic Load均衡创建自定义安全组。 在创建AWS Elastic Beanstalk应用程序时,我在尝试继续“查看和启动”时遇到了这个错误。我是新手。请帮忙。

  • 有人知道是否有可能将现有的AWS弹性豆茎环境更改为应用程序负载平衡器(而不是经典的负载平衡器)。 据我所知,只有应用程序ELB可以被AWS WAF和DDOS“屏蔽”保护,所以任何现有的EB应用程序都不能利用这些特性,因为他们有经典的ELB。

  • 我是AWS的新手,这个问题似乎很基本。然而,我需要看看我是否能找到解决方案。 我首先创建并启动了一个 EC2 实例,然后创建了一个弹性 Beanstalk 实例,并在该实例上部署了一个示例应用程序。默认情况下,弹性 Beanstalk 会将“默认环境”附加到此实例,我无法将其更改为我的 EC2 实例。如何将我的 EC2 实例(我之前创建的实例)附加到此弹性豆茎实例?我正在使用亚马逊免费套餐来学习。