我正在一个redis作业中重新生成一个Sidekiq数据库。事情是,它需要很多时间(2-3分钟)来完成,而且工作经常安静地进行。
此外,这个redis实例是许多从实例的主实例。但我再生的方法基本上是先冲洗然后再生。当发生这种情况时,所有从机实例都会复制刷新的数据库。所以在2-3分钟的窗口中,从机显示的数据什么都没有。
当需要在rails中重新生成redis db以便从服务器不会复制刷新的db时,我如何保存它?
下面的代码是我当前使用的方法:

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

最佳答案

我假设您正在刷新,因为从头开始重新生成比尝试找出转换要容易得多。显然,最好可以通过更新进行转换,但如果不能,则可以在重新生成转储后传输它。这将让您保持数据库在线的整个时间,只是一个小时间的只读访问。
IE:
停止复制
以只读模式将实时客户端(如Web服务器)指向从属服务器
刷新并重新生成主控形状(脱机时)
转储主机
将实时客户端指向主客户端
把垃圾转移到奴隶身上并恢复
打开复制,从服务器很快就会赶上主服务器

关于ruby-on-rails - 如何在Rails中重新生成redis数据库时保留它?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42503538/

10-10 03:42