Heroku上RedisToGo连接失败求助:Sidekiq启动报Redis::CannotConnectError
问题:Heroku + RedisToGo + Sidekiq 连接拒绝错误
我在Heroku上用RedisToGo作为Sidekiq的后端存储,但每次执行heroku run bundle exec sidekiq都会碰到Redis连接拒绝的错误。已经试过网上能找到的所有方案都没用,求各位大佬给点新思路!
当前配置
执行heroku config的输出:
REDISTOGO_URL: redis://redistogo:....@albacore.redistogo.com:11539/ REDIS_PROVIDER: REDISTOGO_URL REDIS_URL: redis://....@albacore.redistogo.com:11539/
错误日志
运行Sidekiq时的错误信息:
4 TID-81oc0 INFO: Booting Sidekiq 4.1.2 with redis options {:size=>2, :url=>"redis://redistogo:REDACTED@albacore.redistogo.com:11539/"} Error connecting to Redis on albacore.redistogo.com:11539 (Errno::ECONNREFUSED) /app/vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis/client.rb:345:in `rescue in establish_connection' /app/vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis/client.rb:331:in `establish_connection' /app/vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis/client.rb:101:in `block in connect' /app/vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis/client.rb:293:in `with_reconnect' /app/vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis/client.rb:100:in `connect' /app/vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis/client.rb:364:in `ensure_connected' /app/vendor/bundle/ruby/2.2.0/gems/redis-3.3.0/lib/redis/client.rb:221:in `block in process' /app/bin/bundle:3:in `load' /app/bin/bundle:3:in `<main>' 4 TID-lvm10 INFO: [Sidetiq] Sidetiq::Actor::Clock id: 36749520 shutting down ... 4 TID-lrfno INFO: [Sidetiq] Sidetiq::Actor::Handler id: 36587080 shutting down ... 4 TID-znma0 INFO: [Sidetiq] Sidetiq::Actor::Handler id: 59890980 shutting down ... 4 TID-lrbco INFO: [Sidetiq] Sidetiq::Actor::Handler id: 36548460 shutting down ... 4 TID-zm5yo INFO: [Sidetiq] Sidetiq::Actor::Handler id: 59822760 shutting down ... 4 TID-zmyrw INFO: [Sidetiq] Sidetiq::Actor::Handler id: 59884740 shutting down ... 4 TID-zog78 INFO: [Sidetiq] Sidetiq::Actor::Handler id: 59929360 shutting down ... 4 TID-zm9y0 INFO: [Sidetiq] Sidetiq::Actor::Handler id: 59853240 shutting down ... 4 TID-zlj9g INFO: [Sidetiq] Sidetiq::Actor::Handler id: 59793140 shutting down ...
尝试过的方案(均无效)
- 检查环境变量是否正确设置
- 重启Heroku dyno
- 重新安装Redis gem
- 确认Sidekiq配置读取环境变量
求新的排查方向/解决方案
可能的解决思路
我整理了几个可能的排查点,你可以试试:
检查RedisToGo实例状态
登录Heroku的RedisToGo管理面板,看看你的实例是不是正常运行状态。免费或基础套餐有时候会因为资源不足被临时暂停,或者遇到维护,这种情况下重启实例可能有用。验证Redis URL的有效性
直接用redis-cli测试连接,看看是不是URL本身有问题:
heroku run redis-cli -u $REDISTOGO_URL
如果连接失败,可能是URL里的密码有特殊字符没转义,或者实例信息有误。可以去RedisToGo控制台重新生成实例URL,然后更新Heroku配置:
heroku config:set REDISTOGO_URL="新生成的完整URL"
检查IP白名单限制
部分RedisToGo套餐会有IP白名单,Heroku的出站IP是动态的,如果你的套餐要求白名单,要么换不需要白名单的套餐,要么联系RedisToGo支持调整规则。升级Redis gem版本
你用的Redis 3.3.0是比较旧的版本,和Sidekiq 4.1.2虽然兼容,但可能存在已知的连接bug。试试升级到3.5.x版本:
修改Gemfile:
gem 'redis', '~> 3.5.0'
然后重新部署:
bundle install git add Gemfile.lock git commit -m "Update redis gem to 3.5.x" git push heroku master
- 确认Sidekiq配置没有硬编码
检查config/initializers/sidekiq.rb,确保配置是读取环境变量,而不是硬编码的地址:
Sidekiq.configure_client do |config| config.redis = { url: ENV['REDISTOGO_URL'], size: 2 } end Sidekiq.configure_server do |config| config.redis = { url: ENV['REDISTOGO_URL'], size: 12 } end
如果之前有硬编码的Redis地址,改成上面的配置试试。
- 重新创建Sidekiq worker dyno
有时候dyno的网络会出问题,试试先关掉再重新启动:
heroku ps:scale worker=0 heroku ps:scale worker=1
内容的提问来源于stack exchange,提问作者Bibek Sharma
相关产品推荐
相关产品推荐

