如何在Rails中重新生成redis数据库时保留它?

时间:2017-02-28 08:22:35

标签: ruby-on-rails ruby redis

我在redis作业中重新生成Sidekiq数据库。事情是,这需要花费很多时间(2-3分钟)才能完成,而且工作经常安静。

此外,此redis实例是许多从属实例的主服务器。但是我重新生成它的方式基本上是冲洗然后再生。发生这种情况时,所有从属实例都会复制刷新的数据库。因此,在2-3分钟的窗口中,从站显示的数据没有任何内容。

如果需要在Rails中重新生成redis数据库,以便奴隶不会复制刷新的数据库,我该如何坚持使用?

以下代码是我目前使用的方法:

class PlacementsGeneratorJob < ApplicationJob
  queue_as :high_priority

      def perform(*args)
        redis = Redis.new url: ENV['PLACEMENTS_STORE_URL']
        redis.flushdb
        redis.hset '_default_', 'excluded_ua', Settings.default.excluded_ua.to_json
        Campaign.all.each do |campaign|
          redis.hset '_campaigns_', campaign.id, campaign.settings['search_engines'].to_json
        end
      end
    end

1 个答案:

答案 0 :(得分:1)

我认为你正在刷新,因为从头开始重新生成比试图找出转换更容易。显然,如果您可以通过更新进行转换,那将是最好的,但如果您不能,则可以在重新生成后转移转储。这样您就可以让数据库保持在线状态,只需一小段时间进行只读访问即可。

即:

  • 停止复制
  • 将实时客户端(例如Web服务器)指向只读模式的从属服务器
  • 刷新并重新生成主(当它处于脱机状态时)
  • 转储大师
  • 将实时客户端指向主人
  • 在奴隶上转移转储并将其恢复
  • 启用复制,奴隶很快就会赶上主人