def start
      return unless running?
      setup_zk
      spawn_watchers
      wait_until_master
    rescue *ZK_ERRORS => ex
      logger.error("ZK error while attempting to manage nodes: #{ex.inspect}")
      reset
      sleep(TIMEOUT)
      retry
    rescue NoMasterError
      logger.error("Failed to promote a new master after #{MAX_PROMOTION_ATTEMPTS} attempts.")
      reset
      sleep(TIMEOUT)
      retry
    end
def start
      return unless running?
      setup_zk
      spawn_watchers
      wait_until_master
    rescue *ZK_ERRORS => ex
      logger.error("ZK error while attempting to manage nodes: #{ex.inspect}")
      reset
      sleep(TIMEOUT)
      retry
    rescue NoMasterError
      logger.error("Failed to promote a new master after #{MAX_PROMOTION_ATTEMPTS} attempts.")
      reset
      sleep(TIMEOUT)
      retry
    end
Creates a new instance.

 @param [Hash] options the options used to initialize the manager
 @option options [String] :zkservers comma-separated ZK host:port pairs
 @option options [String] :znode_path znode path override for redis nodes
 @option options [String] :password password for redis nodes
 @option options [Array<String>] :nodes the nodes to manage
 @option options [String] :max_failures the max failures for a node
 Starts the node manager.

 @note This method does not return until the manager terminates.