【问题标题】:configure multiple server to support sidekiq配置多台服务器支持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

【问题讨论】:

  • 你找到解决这个问题的办法了吗?

标签: ruby-on-rails ruby redis sidekiq


【解决方案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 在两台服务器上都是相同的,并且不会从您当前的配置更改
猜你喜欢
  • 2014-10-13
  • 1970-01-01
  • 2014-05-14
  • 2021-07-11
  • 2017-11-08
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多