Решения для восстановления после сбоя Redis - PullRequest
2 голосов
/ 13 октября 2011

Поскольку кластеризованный Redis все еще находится в разработке, есть ли в Resque механизмы, которые автоматически переключатся на подчиненное устройство Redis, если мастер когда-нибудь выйдет из строя?

Ответы [ 2 ]

1 голос
/ 14 октября 2011

Я так не думаю.Тем не менее, вы можете реализовать механизм основного выбора самостоятельно довольно легко, используя Apache Zookeeper :

require "rubygems"
require "zookeeper"

def log(msg)
  puts "[#{Process.pid}] #{msg}"
end

def debug(obj)
  log(obj.inspect)
end

def on_master_changed(&block)
  loop do
    wcb = Zookeeper::WatcherCallback.new
    resp = @zookeeper.get_children(:path => @base_path, :watcher => wcb, :watcher_context => @base_path)
    children = resp[:children].map{|name| "#{@base_path}/#{name}"}
    new_master = children.sort.first

    block.call(new_master)

    while !wcb.completed?
      sleep(0.1)
    end
  end
end

@zookeeper = Zookeeper.new("localhost:2181")

if @zookeeper.state != Zookeeper::ZOO_CONNECTED_STATE
  log 'Unable to connect to Zookeeper!'
  exit(1)
end

@base_path = "/nodes"

@zookeeper.create(:path => @base_path)
resp = @zookeeper.create(:path => "#{@base_path}/node-", :ephemeral => true, :sequence => true, :data => Process.pid.to_s)
my_node = resp[:path]
is_master = false

log "My node is: #{my_node}"

on_master_changed do |new_master|
  if new_master == my_node
    if is_master
      log "I am still the master. Bow before me or die!"
    else
      log "I am the new master. Behold!"
    end
    is_master = true
  else
    pid = @zookeeper.get(:path => new_master)[:data]
    log "New master is process #{pid}"
  end
end

Вы можете изменить приведенный выше скрипт так:

  1. Использовать IP / порт сервера redis вместо PID процесса
  2. Использовать redis-cli вместе с командой SLAVEOF для обработки "стал мастером", "мастер изменен"и "больше не мастер" сценариев.
0 голосов
/ 18 апреля 2012

Я выпустил гем redis_failover, который обеспечивает отработку отказа Redis для Ruby с ZooKeeper:

https://github.com/ryanlecompte/redis_failover

...