You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2010/08/10 18:54:41 UTC

svn commit: r984116 - in /hbase/trunk: ./ bin/ src/main/java/org/apache/hadoop/hbase/ src/main/java/org/apache/hadoop/hbase/master/ src/main/java/org/apache/hadoop/hbase/zookeeper/

Author: stack
Date: Tue Aug 10 16:54:40 2010
New Revision: 984116

URL: http://svn.apache.org/viewvc?rev=984116&view=rev
Log:
HBASE-2870: Add Backup CLI Option to HMaster

Modified:
    hbase/trunk/CHANGES.txt
    hbase/trunk/bin/hbase-config.sh
    hbase/trunk/bin/hbase-daemons.sh
    hbase/trunk/bin/local-master-backup.sh
    hbase/trunk/bin/start-hbase.sh
    hbase/trunk/bin/stop-hbase.sh
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/HConstants.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWrapper.java

Modified: hbase/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hbase/trunk/CHANGES.txt?rev=984116&r1=984115&r2=984116&view=diff
==============================================================================
--- hbase/trunk/CHANGES.txt (original)
+++ hbase/trunk/CHANGES.txt Tue Aug 10 16:54:40 2010
@@ -831,6 +831,7 @@ Release 0.21.0 - Unreleased
    HBASE-2792  Create a better way to chain log cleaners
                (Chongxin Li via Stack)
    HBASE-2844  Capping the number of regions (Pranav Khaitan via Stack)
+   HBASE-2870  Add Backup CLI Option to HMaster (Nicolas Spiegelberg via Stack)
 
   NEW FEATURES
    HBASE-1961  HBase EC2 scripts

Modified: hbase/trunk/bin/hbase-config.sh
URL: http://svn.apache.org/viewvc/hbase/trunk/bin/hbase-config.sh?rev=984116&r1=984115&r2=984116&view=diff
==============================================================================
--- hbase/trunk/bin/hbase-config.sh (original)
+++ hbase/trunk/bin/hbase-config.sh Tue Aug 10 16:54:40 2010
@@ -73,6 +73,8 @@ done
 HBASE_CONF_DIR="${HBASE_CONF_DIR:-$HBASE_HOME/conf}"
 # List of hbase regions servers.
 HBASE_REGIONSERVERS="${HBASE_REGIONSERVERS:-$HBASE_CONF_DIR/regionservers}"
+# List of hbase secondary masters.
+HBASE_BACKUP_MASTERS="${HBASE_BACKUP_MASTERS:-$HBASE_CONF_DIR/backup-masters}"
 
 # Source the hbase-env.sh.  Will have JAVA_HOME defined.
 if [ -f "${HBASE_CONF_DIR}/hbase-env.sh" ]; then

Modified: hbase/trunk/bin/hbase-daemons.sh
URL: http://svn.apache.org/viewvc/hbase/trunk/bin/hbase-daemons.sh?rev=984116&r1=984115&r2=984116&view=diff
==============================================================================
--- hbase/trunk/bin/hbase-daemons.sh (original)
+++ hbase/trunk/bin/hbase-daemons.sh Tue Aug 10 16:54:40 2010
@@ -45,6 +45,9 @@ case $command in
   (zookeeper)
     exec "$bin/zookeepers.sh" $args
     ;;
+  (master-backup)
+    exec "$bin/master-backup.sh" $args
+    ;;
   (*)
     exec "$bin/regionservers.sh" $args
     ;;

Modified: hbase/trunk/bin/local-master-backup.sh
URL: http://svn.apache.org/viewvc/hbase/trunk/bin/local-master-backup.sh?rev=984116&r1=984115&r2=984116&view=diff
==============================================================================
--- hbase/trunk/bin/local-master-backup.sh (original)
+++ hbase/trunk/bin/local-master-backup.sh Tue Aug 10 16:54:40 2010
@@ -21,6 +21,7 @@ run_master () {
   DN=$2
   export HBASE_IDENT_STRING="$USER-$DN"
   HBASE_MASTER_ARGS="\
+    --backup \
     -D hbase.master.port=`expr 60000 + $DN` \
     -D hbase.master.info.port=`expr 60010 + $DN`"
   "$bin"/hbase-daemon.sh $1 master $HBASE_MASTER_ARGS

Modified: hbase/trunk/bin/start-hbase.sh
URL: http://svn.apache.org/viewvc/hbase/trunk/bin/start-hbase.sh?rev=984116&r1=984115&r2=984116&view=diff
==============================================================================
--- hbase/trunk/bin/start-hbase.sh (original)
+++ hbase/trunk/bin/start-hbase.sh Tue Aug 10 16:54:40 2010
@@ -49,4 +49,6 @@ else
   "$bin"/hbase-daemon.sh --config "${HBASE_CONF_DIR}" start master 
   "$bin"/hbase-daemons.sh --config "${HBASE_CONF_DIR}" \
     --hosts "${HBASE_REGIONSERVERS}" start regionserver
+  "$bin"/hbase-daemons.sh --config "${HBASE_CONF_DIR}" \
+    --hosts "${HBASE_BACKUP_MASTERS}" start master-backup
 fi

Modified: hbase/trunk/bin/stop-hbase.sh
URL: http://svn.apache.org/viewvc/hbase/trunk/bin/stop-hbase.sh?rev=984116&r1=984115&r2=984116&view=diff
==============================================================================
--- hbase/trunk/bin/stop-hbase.sh (original)
+++ hbase/trunk/bin/stop-hbase.sh Tue Aug 10 16:54:40 2010
@@ -60,5 +60,10 @@ done
 distMode=`$bin/hbase org.apache.hadoop.hbase.HBaseConfTool hbase.cluster.distributed`
 if [ "$distMode" == 'true' ] 
 then
+  # TODO: store backup masters in ZooKeeper and have the primary send them a shutdown message
+  # stop any backup masters
+  "$bin"/hbase-daemons.sh --config "${HBASE_CONF_DIR}" \
+    --hosts "${HBASE_BACKUP_MASTERS}" stop master-backup
+
   "$bin"/hbase-daemons.sh --config "${HBASE_CONF_DIR}" stop zookeeper
 fi

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/HConstants.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/HConstants.java?rev=984116&r1=984115&r2=984116&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/HConstants.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/HConstants.java Tue Aug 10 16:54:40 2010
@@ -81,6 +81,12 @@ public final class HConstants {
   /** default port for master web api */
   public static final int DEFAULT_MASTER_INFOPORT = 60010;
 
+  /** Parameter name for the master type being backup (waits for primary to go inactive). */
+  public static final String MASTER_TYPE_BACKUP = "hbase.master.backup";
+
+  /** by default every master is a possible primary master unless the conf explicitly overrides it */
+  public static final boolean DEFAULT_MASTER_TYPE_BACKUP = false;
+
   /** Name of ZooKeeper quorum configuration parameter. */
   public static final String ZOOKEEPER_QUORUM = "hbase.zookeeper.quorum";
 

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/HMaster.java?rev=984116&r1=984115&r2=984116&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/HMaster.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/HMaster.java Tue Aug 10 16:54:40 2010
@@ -230,6 +230,22 @@ public class HMaster extends Thread impl
     this.zkMasterAddressWatcher =
       new ZKMasterAddressWatcher(this.zooKeeperWrapper, this.shutdownRequested);
     zooKeeperWrapper.registerListener(zkMasterAddressWatcher);
+
+    // if we're a backup master, stall until a primary to writes his address
+    if(conf.getBoolean(HConstants.MASTER_TYPE_BACKUP, HConstants.DEFAULT_MASTER_TYPE_BACKUP)) {
+      // this will only be a minute or so while the cluster starts up,
+      // so don't worry about setting watches on the parent znode
+      while (!zooKeeperWrapper.masterAddressExists()) {
+        try {
+          LOG.debug("Waiting for master address ZNode to be written " +
+            "(Also watching cluster state node)");
+          Thread.sleep(conf.getInt("zookeeper.session.timeout", 60 * 1000));
+        } catch (InterruptedException e) {
+          // interrupted = user wants to kill us.  Don't continue
+          throw new IOException("Interrupted waiting for master address");
+        }
+      }
+    }
     this.zkMasterAddressWatcher.writeAddressToZooKeeper(this.address, true);
     this.regionServerOperationQueue =
       new RegionServerOperationQueue(this.conf, this.closed);
@@ -1265,6 +1281,7 @@ public class HMaster extends Thread impl
     Options opt = new Options();
     opt.addOption("minServers", true, "Minimum RegionServers needed to host user tables");
     opt.addOption("D", true, "Override HBase Configuration Settings");
+    opt.addOption("backup", false, "Do not try to become HMaster until the primary fails");
     try {
       CommandLine cmd = new GnuParser().parse(opt, args);
 
@@ -1286,6 +1303,11 @@ public class HMaster extends Thread impl
           }
         }
       }
+      
+      // check if we are the backup master - override the conf if so
+      if (cmd.hasOption("backup")) {
+        conf.setBoolean(HConstants.MASTER_TYPE_BACKUP, true);
+      }
 
       if (cmd.getArgList().contains("start")) {
         try {

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWrapper.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWrapper.java?rev=984116&r1=984115&r2=984116&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWrapper.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWrapper.java Tue Aug 10 16:54:40 2010
@@ -464,6 +464,13 @@ public class ZooKeeperWrapper implements
     LOG.debug("<" + instanceName + ">" + "Set watcher on master address ZNode " + masterElectionZNode);
     return true;
   }
+  
+  /**
+   * @return true if zookeeper has a master address.
+   */
+  public boolean masterAddressExists() {
+    return checkExistenceOf(masterElectionZNode);
+  }
 
   private HServerAddress readAddress(String znode, Watcher watcher) {
     try {