【问题标题】:Solutions for resque failover redisresque故障转移redis的解决方案
【发布时间】:2011-10-13 19:42:20
【问题描述】:

由于集群 Redis 仍在开发中,Resque 中是否有机制可以在主服务器出现故障时自动故障转移到 Redis 从服务器?

【问题讨论】:

    标签: ruby redis resque


    【解决方案1】:

    我不这么认为。但是,您可以很容易地使用Apache Zookeeper implement the master election mechanism yourself

    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. 使用redis服务器的IP/端口代替进程的PID
    2. 使用 redis-cli 和 SLAVEOF 命令来处理“成为主人”、“主人改变”和“不再主人”的场景。

    【讨论】:

      【解决方案2】:

      我发布了一个 redis_failover gem,它通过 ZooKeeper 为 Ruby 提供 Redis 故障转移:

      https://github.com/ryanlecompte/redis_failover

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-27
        • 1970-01-01
        • 2014-10-05
        • 1970-01-01
        相关资源
        最近更新 更多