HASingletonElectionPolicy
smeng1 Jan 8, 2008 1:03 PMI have setup 2 nodes (say Node A and B) in a cluster using Jboss 4.2.2 GA.
My requirement is:
1. Node A is set as the preferred master. If both nodes are running, Node A will always become the master i.e. in the event Node B was started before Node A, it will stop the service and Node A will take over running as the master.
2. If the master node goes down, then the next available node in the cluster becomes the master.
My problem is:
When Nodes A & B are running, Node A as master, and Node A is properly shutdown, Node B still detects Node A in the cluster view and continues to elect Node A as the master rather than taking over.
Here is my HASingletonElectionPolicy implementation:
package com.unique.ha.singleton; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jboss.ha.framework.interfaces.ClusterNode; import org.jboss.ha.framework.interfaces.HAPartition; import org.jboss.ha.singleton.HASingletonElectionPolicySimple; public class HASingletonElectionPolicyUnique extends HASingletonElectionPolicySimple implements HASingletonElectionPolicyUniqueMBean { private String preferredMasterAddress; private static final Log log = LogFactory.getLog(HASingletonElectionPolicyUnique.class); public void setPreferredMasterAddress(String preferredMasterAddress) { this.preferredMasterAddress = preferredMasterAddress; } public String getPreferredMasterAddress() { return this.preferredMasterAddress; } public ClusterNode pickSingleton() { return pickSingleton(getHAPartition()); } public ClusterNode pickSingleton(HAPartition partition) { log.info( "Running HASingletonElectionPolicyUnique..." ); ClusterNode[] nodes = partition.getClusterNodes(); log.info( "CurrentView for " + partition.getPartitionName() + " is " + partition.getCurrentView().toString() ); if( this.preferredMasterAddress != null ) { for ( int x=0; x < nodes.length; x++ ) { ClusterNode node = nodes[x]; if ( node.getIpAddress().getHostAddress().equals( this.preferredMasterAddress ) ) { log.info("Set Master Status to preferred master address " + this.preferredMasterAddress); return node; } } } log.warn("Unable to select preferred Master at address " + this.preferredMasterAddress + ". Will select next available node."); return super.pickSingleton(partition); } }
jboss-service.xml
<server> <mbean code="com.unique.ha.singleton.HASingletonElectionPolicyUnique" name="com.unique.ha:name=HASingletonElectionPolicyUnique"> <attribute name="PreferredMasterAddress">${unique.ha.preferred_master_address}</attribute> </mbean> <mbean code="com.unique.system.mbean.MyService" name="com.unique.system.mbean:name=MyService"> </mbean> <mbean code="org.jboss.ha.singleton.HASingletonController" name="com.unique.system.mbean:service=MyService-HASingletonController"> <depends>jboss:service=${jboss.partition.name}</depends> <depends optional-attribute-name="ElectionPolicy" proxy-type="attribute">com.unique.ha:name=HASingletonElectionPolicyUnique</depends> <depends optional-attribute-name="TargetName">com.unique.system.mbean:name=MyService</depends> <attribute name="PartitionName">${jboss.partition.name}</attribute> <attribute name="TargetStartMethod">startSingleton</attribute> <attribute name="TargetStopMethod">stopSingleton</attribute> </mbean> </server>
Thanks
Meng