sun.com | docs.sun.com | How To Buy | My Sun | Worldwide Sites |  |

| Previous Contents Index Next
Chapter 5 # Manipulating the Cluster Using the NMA The Node Management Agent (NMA) exposes methods for causing a switchover and manipulating the retry count for processes and process groups monitored by the Daemon Monitor. This chapter contains the following sections: Using the NMA to Initiate a Switchover Manipulating Daemon Monitor Retry Settings ## Using the NMA to Initiate a Switchover Methods of the `CmmMasterNodeMBean` can be used to check whether a switchover is possible, initiate the switchover, and then gauge the success of the switchover. The switchover is performed by the Cluster Membership Manager (CMM). Because it is possible to set a timeout value for CMM operations, it is also possible that CMM operations might not be completed during the time allowed. If the timeout value is too short, some or all CMM operations will fail. For more information about this CMM behavior, see `cmm_connect`(3CMM). Note - To disable the ability to perform remote operations on a cluster, set the `com.sun.nhas.ma.operation.flag` property in `nma.properties` to `false`. ### Checking Whether the Foundation Services Are Ready for Switchover To check whether a switchover is possible, invoke the `isSwitchOverReady` method. The `isSwitchOverReady` method takes no parameters, and returns a `boolean`. Note - Even if the `isSwitchOverReady` method returns `true`, this does not guarantee that switchover will succeed. Switchover may not succeed, for example, if cluster readiness changes between the time when the `isSwitchOverReady` is invoked and the `switchOver` method is invoked. ### Initiating a Switchover To initiate a switchover, invoke the `switchOver` method. The `switchOver` method takes no parameters, and returns a `void`. Note that if this method is invoked using the floating external address the connection to the NMA might be broken prematurely and the `switchOver` method will never finish executing. Write code to detect and handle this eventuality. ### Example of Switchover Using an HTTP Connector Client The `NmaSwitchover` class, the code of which is listed below, can be used to provoke a switchover of the current master node. The mechanism used below (the `invoke()` method of the `HTTPConnectorClient` class) can be used to invoke the methods of the NMA MBeans. Example 5-1 `NmaSwitchover.java`
    // java import
    //
    import java.net.InetAddress;

    // jmx import
    //
    import javax.management.ObjectName;
    import javax.management.MBeanException;

    // jdmk import
    //
    import com.sun.jdmk.TraceManager;
    import com.sun.jdmk.comm.HttpConnectorClient;
    import com.sun.jdmk.comm.HttpConnectorAddress;
    import com.sun.jdmk.comm.CommunicationException;
    import com.sun.jdmk.comm.UnauthorizedSecurityException;

    /**
     * This java client uses an HTTP connector client to establish a connection
     * to the NMA and perform a mastership switchover.
     *
     * To compile the client:
     *
     * javac NmaSwitchover.java
     *
     * Note: First ensure that the jar files specified in the chapter
     * 'Configuration Files, Dependencies and Requirements' of the
     * "Netra High Availability Suite Foundation Services 2.1 6/03
     * NMA Programming Guide" are in your CLASSPATH.
     *
     * To run the client:
     *
     * java NmaSwitchover <domain_name> <master_IP_address>
     * <HttpConnectorServer_port>
     *
     * For example:  java NmaSwitchover cluster_8 10.8.1.18 8081
     *
     * Note: This example must be run on a machine with access to the
     * cluster, for example, the cluster install server.
     *
     */
    public class NmaSwitchover {

      public static void main(String argv[]) {

    	try {

    	    /**
    	    * Debug
    	    * To activate the debug or trace mechanism from the command
    	    * line, use the syntax: java -DLEVEL_DEBUG NmaSwitchover
    	    * <arguments> or  java -DLEVEL_TRACE NmaSwitchover <arguments>
    	    *
    	    * For example:
    	    * java -DLEVEL_DEBUG NmaSwitchover cluster_6 10.6.1.1 8081
    	    *
    	    */

    	    TraceManager.parseTraceProperties();

    	    // Set the domain name of the cluster
    	    //
    	    String domain = "DefaultDomain";
    	    if (argv.length >=1) domain = argv[0];

    	    // Set the host name of the remote MBean server.
    	    //
    	    String agentHost = InetAddress.getLocalHost().getHostName();
    	    if (argv.length >= 2) agentHost = argv[1];

    	    // Set the port number of the remote connector server.
    	    //
    	    int agentPort = 8081;
    	    if (argv.length >= 3)
    	        agentPort = Integer.decode(argv[2]).intValue();

    	    System.out.println(">>> Connecting to " + agentHost +
    			       " using port number " + agentPort);

    	    // Set up the HTTP Connector Client.
    	    //
    	    HttpConnectorClient connector = new HttpConnectorClient();
    	    try {
    	      // Initialize communication with the remote MBean server.
    	      //
           HttpConnectorAddress hca =
           	     new HttpConnectorAddress(agentHost,agentPort);
           connector.connect(hca);
           } catch (IllegalArgumentException e)
    	     {
    	     System.out.println("Connection exception! " +
    	           e.getMessage());
    	     } catch (CommunicationException e)
    	     {
    	       System.out.println("Connection exception! " +
    	           e.getMessage());
    	     } catch (UnauthorizedSecurityException e)
    	     {
    	       System.out.println("Connection exception! " +
    	           e.getMessage());
    	     }

    	     String[] iargs = {};
    	     String[] isig = {};

    	     String instanceName = domain +
    	        ".master:nhas-object=cluster_node";
    	     ObjectName node = new ObjectName(instanceName);
          // Invoke the isSwitchOverReady() method to check that the
          // cluster is in a condition to support switchover successfully.
          // If this method returns true, invoke the switchover method.
          // Note that this does not guarantee that the switchover operation
          // will be successfully invoked, because the readiness of the
          // cluster may change before the switchover can be performed.
          //
    	    try {
    	      if (connector.invoke(node, "isSwitchOverReady",
    	          	iargs, isig).equals(new Boolean(true)))
    	      {
             System.out.println("Performing switchover");
    	        // Switchover
    	        //
    	        connector.invoke(node, "switchOver", iargs, isig);
            } else
    	      {
    	        System.out.println("Cluster not ready for switchover");
    	      }
    	    } catch (MBeanException e)
    	    {
    	      System.out.println("Got an exception invoking switchover! " +
    	      e.getTargetException().getMessage());
    	    }

    	    // Terminate communication with the remote MBean server.
    	    //
    	    connector.disconnect();

    	    // Exit program
    	    //
    	    System.exit(0);

    	} catch (Exception e) {
    	    System.out.println("Got an exception !" + e.getMessage());
    	    e.printStackTrace();
    	    System.exit(1);
    	    }
       }
     }
Previous Contents Index Next

Copyright 1994-2004 Sun Microsystems