我正在一个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/