You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by Apache Wiki <wi...@apache.org> on 2008/10/30 16:54:37 UTC

[Hadoop Wiki] Update of "ZabProtocol" by BenjaminReed

Dear Wiki user,

You have subscribed to a wiki page or wiki category on "Hadoop Wiki" for change notification.

The following page has been changed by BenjaminReed:
http://wiki.apache.org/hadoop/ZabProtocol

New page:
= Zab: Atomic Broadcast for ZooKeeper =

We would like to modularize the Atomic Broadcast layer of ZooKeeper so that it can be used independently. It also help to be able to test more effectively.

Zab is a standard atomic broadcast layer, but there are somethings that ZooKeeper uses from Zab that is specific to its implementation:

 1. ZooKeeper forwards change requests to a leader. It uses the same leader that Zab uses for simplicity and efficiency, so we need a method to get the leader.
 1. ZooKeeper uses Zab's write-ahead logging for atomic broadcast to also do the write-ahead logging for database changes.
 1. Most applications of atomic broadcast involves a state transfer if a process gets too far behind, so we have merged state transfer into Zab.

Zab is currently buried into Zab. Here is a proposed interface for the extracted Zab:

{{{
class Zab {
    // This constructor takes a ZabCallback that will receive events from Zab.
    // After Zab is constructed cb, will get called with setState() and deliver() for
    // any state and transactions that have been logged locally
    Zab(ZabCallback cb);
    // This method propose the message and returns a zxid (Zab transaction identifier)
    long propose(byte message[]);
}

enum ZabStatus { LOOKING, FOLLOWING, LEADING };

interface ZabCallback {
    // This method is called when a message has been delivered by Zab
    void deliver(long zxid, byte message[]);
    // This method is called when Zab's status changes. If this instance
    // of Zab is FOLLOWING, leader will have the name of the leader.
    void status(ZabStatus status, String leader);
    // This method is called by Zab to get the current state of ZooKeeper.
    // It may be called to sync with leaders who are behind (a state transfer), or it
    // may be used to periodically get the state of ZooKeeper for recovery.
    void getState(OutputStream os);
    // This method is called by Zab to push a state transfer to ZooKeeper.
    void setState(InputStream is);
}
}}}