配置多台服务器支持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的主要内容,如果未能解决你的问题,请参考以下文章