Yank a Server from NLB when it fails?
It's about 30 minutes from the start of my session on H/A at the SPC. One of the things I talk about in the session is how easy it is to monitor your web servers for failure and yank them from NLB when they do. I've posted the example code below. It's slimmed down greatly to fit in the presentation so I will try to update this later with more robust logic. I'll try to get this in a code block just as soon as I find that the code gadget again.
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
HttpStatusCode code = response.StatusCode;
if(code.ToString() != “200”)
{
ManagementScope NLBScope = new ManagementScope("\\\\" + server + "\\root\\MicrosoftNLB");
ManagementClass NLBClass = new ManagementClass(NLBScope, new ManagementPath("MicrosoftNLB_Node"), null);
NLBClass.Get();
foreach (ManagementObject node in NLBClass.GetInstances())
{
node.Get();
node.InvokeMethod("Stop", null);
}
}
Comments
Anonymous
March 05, 2008
  It's about 30 minutes from the start of my session on H/A at the SPC. One of the things IAnonymous
March 05, 2008
The comment has been removedAnonymous
March 26, 2008
Interesting info - thanks for posting it. Our developers have been very happy since we signed on with Server Intellect. They're technicians can log into the server once a month on the date and time that specified, to prform security updates and software upgrades proactively, which is very helpful to us.Anonymous
October 15, 2008
I am having some strange error when executing the above code.. node.InvokeMethod("Stop", null); is generating a not supported error message. up till the get() is fine cause I can see the path of the node. any clues ? any help is greatly appreciated.Anonymous
October 15, 2008
What is the actual exception message and stack? I haven't seen this error before using the following code: public enum NLBAction { Start, Stop, Resume }; private EventLog log = new EventLog(); public void ControlNode(NLBAction action) { ManagementScope NLBScope = new ManagementScope("\localhost\root\MicrosoftNLB"); ManagementClass NLBClass = new ManagementClass(NLBScope, new ManagementPath("MicrosoftNLB_Node"), null); NLBClass.Get(); foreach (ManagementObject node in NLBClass.GetInstances()) { node.Get(); Console.WriteLine(node.GetPropertyValue("Name")); if (action == NLBAction.Start) { try { node.InvokeMethod("Start", null); } catch (Exception e) { log.LogEvent(e.Message, System.Diagnostics.EventLogEntryType.Error, 1004); throw; } } else if (action == NLBAction.Stop) { try { node.InvokeMethod("Stop", null); } catch (Exception e) { log.LogEvent(e.Message, System.Diagnostics.EventLogEntryType.Error, 1004); throw; } } else if (action == NLBAction.Resume) { try { node.InvokeMethod("Resume", null); } catch (Exception e) { log.LogEvent(e.Message, System.Diagnostics.EventLogEntryType.Error, 1004); throw; } } } } public int GetNodeStatus() { ManagementScope NLBScope = new ManagementScope("\localhost\root\MicrosoftNLB"); ManagementClass NLBClass = new ManagementClass(NLBScope, new ManagementPath("MicrosoftNLB_Node"), null); try { NLBClass.Get(); object status = null; foreach (ManagementObject node in NLBClass.GetInstances()) { node.Get(); status = node.GetPropertyValue("StatusCode"); } return Convert.ToInt32(status); } catch (Exception e) { log.LogEvent(e.Message, System.Diagnostics.EventLogEntryType.Error, 1004); return 0; }Anonymous
August 08, 2010
Hi. I am also getting a "Not Supported" error message when running the code you provided. The getting of node status works, but for the stop, start and resume methods i get a "Not Supported"Anonymous
August 08, 2010
Hi. I found out the problem. The code above cycles through all the nodes. In my case the frist node encountered was not the local node and so the stop/start/resume methods were being called on a remote node, which is not supported.