Я так не думаю.Тем не менее, вы можете реализовать механизм основного выбора самостоятельно довольно легко, используя 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
Вы можете изменить приведенный выше скрипт так:
- Использовать IP / порт сервера redis вместо PID процесса
- Использовать redis-cli вместе с командой SLAVEOF для обработки "стал мастером", "мастер изменен"и "больше не мастер" сценариев.