| Obvyklý problém s NLB (Network Load Balancing) je jak sledovat jeho životnost. Máte třeba dva a více web serverů a potřebujete se dívat, jestli žijí a pokud jeden z nich nevrací to, co byste od něho očekávali, chtěli byste danou nodu vyřadit z clusteru.
Já mám k tomu svůj mustr skript v PowerShellu, který si upravuju podle potřeby. Zde je.
Jen poznámečky:
- funkce Control-NLBNode umi Start, Stop, Suspend, Resume a dělá to na tom počítače, na kterém běží tento skript. Mělo by tedy být zřejmé, že skript bude muset běžet na každém ze sledovaných členů NLB klastru.
- no a potom už jenom v cyklu zkouším stáhnout nějakou webovou stránku a v jejím obsahu se dívám, jestli to obsahuje například nějaký HTML element tak, jak bych si představoval. Pokud tam není, nebo se ta stránka nestáhne, tak stopnu tanto člen NLB clusteru. Naopak, pokud to vrací v pořádku, tak ho zase nastartuju. Pro více možností stahování stránky se můžete mrknout sem.
- když dělám ve skriptu Start a Stop, tak to znamená, že jakmile se web zase rozjede, tak se to bude každých pět sekund pokoušet nodu nahodit. Pokud tedy potřebujete nodu z klastru vyřadit ručně, nemusíte skript vypínat, ale stačí přes konzoli NLB použít příkaz Suspend. Ten způsobí, že další příkazy Start a Stop jsou bez efektu, dokud se nerozhodnete z konzole udělat Resume.
- k tomu, aby skript fungoval, je potřeba, aby se URL a jeho FQDN "intranet" nepřekládalo na tu virtuální společnou NLB klastrovou IP adresu, kterou používají klienti, ale aby se to překládalo přímo na adresu této každé konkrétní nody. Toho dosahuju jednoduše v HOSTS souboru na všech nodách.
function Control-NLBNode ([string] $operation)
{
$compSys = Get-WmiObject win32_computersystem
$computerName = '{0}.{1}' -f $compSys.DNSHostName, $compSys.domain
$clusterManager = $compSys.DNSHostName
$suspendNode = $computerName
Write-Host ('Going to change node state: {0} | {1}' -f $clusterManager, $suspendNode)
$nodes = Get-WmiObject -ComputerName $clusterManager -Namespace root\MicrosoftNLB -Query "SELECT * FROM MicrosoftNLB_Node"
$node = $nodes | ? { $_.ComputerName -eq $suspendNode }
if ($operation -eq 'Stop') { $node.Stop() | Out-Null }
if ($operation -eq 'Start') { $node.Resume() | Out-Null; $node.Start() | Out-Null }
if ($operation -eq 'Suspend') { $node.Suspend() | Out-Null }
if ($operation -eq 'Resume') { $node.Resume() | Out-Null }
Write-Host ('Node state changed to: {0}' -f $operation)
}
while ($true) {
$zijeTo = $false
[string] $html = ''
$webClient = New-Object System.Net.WebClient
$webClient.Headers.Add("user-agent", "sevecek-nlb-testing")
$webClient.Credentials = [System.Net.CredentialCache]::DefaultCredentials
$ErrorActionPreference = 'SilentlyContinue'
[string] $html = $webClient.DownloadString("http://intranet/default.aspx")
$ErrorActionPreference = 'Continue'
$zijeTo = $html -like '**'
Write-Host 'Web zije: ' $zijeTo
if (-not $zijeTo) {
Control-NLBNode 'Stop'
}
else {
Control-NLBNode 'Start'
}
Start-Sleep 5
}
|