配置多台服务器支持sidekiq

Posted

技术标签:

【中文标题】配置多台服务器支持sidekiq【英文标题】:configure multiple server to support sidekiq 【发布时间】:2014-07-30 21:00:20 【问题描述】:

我计划将 redis 服务器迁移到运行 sidekiq 的新服务器,但不想停止当前应用程序的运行。而且我不想使用仍然是 alpha 版本的 redis 集群。 我的想法是让sidekiq写到新的redis服务器,但从他们两个拉,这样一旦旧redis中的工人完成,新的工人就可以完全接管所有工人。我认为这个解决方案是可行的,但我不知道如何实现。

这是我的 sidekiq.rb:

sidkiq_config = YAML.load(ERB.new(Rails.root.join('config/redis.yml').read).result)

Sidekiq.configure_server do |config|
  config.logger.level = Logger::ERROR
  config.redis =  :url => "redis://redis2.staging:6379", :namespace => "app_#Rails.env:sidekiq" 
  config.redis =  :url => "redis://redis.staging:6379", :namespace => "app_#Rails.env:sidekiq" 
end

Sidekiq.configure_client do |config|
  config.logger.level = Logger::ERROR
  config.redis =  :url => "redis://redis2.staging:6379", :namespace => "app_#Rails.env:sidekiq" 
end

【问题讨论】:

你找到解决这个问题的办法了吗? 【参考方案1】:

我认为最简单的解决方案是运行 两个实例 sidekiq - 一个从旧集群读取,一个从新集群读取

sidkiq_config = YAML.load(ERB.new(Rails.root.join('config/redis.yml').read).result)

Sidekiq.configure_server do |config|
  config.logger.level = Logger::ERROR
  if ENV['read_from_new']
    config.redis =  :url => "redis://redis2.staging:6379", :namespace => "app_#Rails.env:sidekiq" 
  else 
    config.redis =  :url => "redis://redis.staging:6379", :namespace => "app_#Rails.env:sidekiq" 
  end
end

Sidekiq.configure_client do |config|
  config.logger.level = Logger::ERROR
  config.redis =  :url => "redis://redis2.staging:6379", :namespace => "app_#Rails.env:sidekiq" 
end

【讨论】:

我也在寻找相同问题的解决方案。您建议的配置不会同时从两台服务器读取。你能建议怎么做吗?【参考方案2】:

您可以更新到最新版本的 sidekiq 并使用Sharding。

REDIS_A = ConnectionPool.new  Redis.new(...) 
REDIS_B = ConnectionPool.new  Redis.new(...) 

# To create a new connection pool for a namespaced Sidekiq worker:
ConnectionPool.new do
  client = Redis.new(:url => "Your Redis Url")
  Redis::Namespace.new("Your Namespace", :redis => client)
end

# Create a job in the default redis instance
SomeWorker.perform_async

# Push a job to REDIS_A using the low-level Client API
client = Sidekiq::Client.new(REDIS_A)
client.push(...)
client.push_bulk(...)

Sidekiq::Client.via(REDIS_B) do
  # All jobs defined within this block will go to B
  SomeWorker.perform_async
end

要相当 sidekiq,请单击 UI 中的相当按钮

【讨论】:

我正在寻找不同的配置。我的旧 Redis 服务器中已经有工作,我只会将新工作推送到新的 Redis 服务器。但是,当我切换到新服务器时,我的旧 Redis 服务器中可能仍有作业,我想确保这些作业可以由一些工作人员处理 启动新服务器后,您可以让旧服务器上的队列安静下来。这允许它完成它已经开始的工作,而不是接受任何新的工作。 我是 Sidekiq 的新手;那么您能否添加一些详细信息,例如要遵循的步骤。我的 Sidekiq.configure_server 应该是什么样子?在旧服务器上静默队列的步骤是什么? sidekiq UI 中有一个quiet 按钮。在忙碌的标签上。 我没有使用分片,但由于它不是文档中指定的任何内容,我认为Sidekiq.configure_server 在两台服务器上都是相同的,并且不会从您当前的配置更改

以上是关于配置多台服务器支持sidekiq的主要内容,如果未能解决你的问题,请参考以下文章

Sidekiq 作业已安排,没有运行,只是消失了

Ansible配置

如何迁移单台或多台服务器?

ruby sidekiq`requiret':无法加载这样的文件--pg(LoadError)

Sidekiq Worker 缓存未过期

在 AWS Elastic Beanstalk 上配置 Rails、Sidekiq、Redis 的可持续解决方案