2011-10-13 95 views

回答

1

我不這麼認爲。但是,您可以implement the master election mechanism yourself很容易使用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 

您可以修改上面的腳本:Redis的服務器,而不是PID過程的

  1. 使用IP /端口
  2. 使用Redis的-cli以及SLAVEOF命令來處理「成爲主人」,「主人變更」和「不再主人」的情景。