PowerShell ile Failover Cluster Durum İzleme ve Otomatik Bildirim Sistemi

PowerShell ile Failover Cluster Durum İzleme ve Otomatik Bildirim Sistemi
Yazı Özetini Göster

PowerShell ile Failover Cluster Durum İzleme ve Otomatik Bildirim Sistemi

Windows Failover Cluster, yüksek erişilebilirlik gereken dosya sunucuları, SQL/Hyper-V kümeleri ve kurumsal uygulamalar için kritik bir bileşendir. Ancak kümedeki düğümler (nodes), roller (roles) ve kaynaklar (resources) üzerindeki sorunlar anında fark edilmezse kesinti süreleri uzar. Bu rehberde, PowerShell ile küme sağlığını izleyen, hataları tespit eden ve otomatik uyarı gönderen pratik bir izleme/bildirim çözümünü adım adım kuracağız. Yüksek erişilebilirlik için yapılandırmalarınızı ölçeklenebilir VDS veya kurumsal Sunucu Barındırma altyapıları üzerinde uygulamanız önerilir.

Neden PowerShell ile İzleme?

  • Yerleşik modül: FailoverClusters modülü kümeyi ayrıntılı sorgular.
  • Esneklik: Özel eşikler ve koşullar tanımlanabilir.
  • Otomasyon: Görev Zamanlayıcı ile düzenli sağlık kontrolü ve e-posta/Teams/Slack uyarıları.

Önkoşullar

  • İzleme betiğini çalıştıracak yetkili bir servis hesabı
  • Küme düğümlerine erişim ve PowerShell Remoting (WinRM) açık
  • FailoverClusters modülü yüklü: Add-WindowsFeature RSAT-Clustering-PowerShell

Temel Sağlık Kontrolleri

1) Küme ve Düğüm Durumu

Import-Module FailoverClusters
$Cluster = "PROD-CLUSTER"
$nodes   = Get-ClusterNode -Cluster $Cluster | Select-Object Name, State
$groups  = Get-ClusterGroup -Cluster $Cluster | Select-Object Name, State, OwnerNode
$errors  = @()

if (($nodes | Where-Object { $_.State -ne 'Up' }).Count -gt 0) {
  $errors += "Down node(s): " + (($nodes | Where-Object State -ne 'Up').Name -join ', ')
}

if (($groups | Where-Object { $_.State -ne 'Online' }).Count -gt 0) {
  $errors += "Failed group(s): " + (($groups | Where-Object State -ne 'Online').Name -join ', ')
}

2) Kaynak (Resource) Sağlığı

$resources = Get-ClusterResource -Cluster $Cluster
$failedRes = $resources | Where-Object State -in @('Failed','Offline')
if ($failedRes) { $errors += "Problem resources: " + ($failedRes.Name -join ', ') }

3) Quorum ve Witness Kontrolü

$quorum = Get-ClusterQuorum -Cluster $Cluster
if ($quorum.QuorumResource -eq $null) { $errors += "Quorum not properly configured!" }

4) Temel Ağ (Cluster Network) Kapsamı

$nets = Get-ClusterNetwork -Cluster $Cluster
if (($nets | Where-Object State -ne 'Up')) { $errors += "Cluster network issues detected." }

Otomatik Bildirim: E-posta & Webhook

Bildirim yöntemleri ortamınıza göre değişebilir. Aşağıda iki pratik seçenek bulunuyor.

E-posta Bildirimi (SMTP)

function Send-AlertMail($subject, $body) {
  $smtp = "smtp.domain.com"
  $from = "cluster-monitor@domain.com"
  $to   = "ops@domain.com"
  Send-MailMessage -SmtpServer $smtp -From $from -To $to -Subject $subject -Body $body
}

Webhook (Teams/Slack) Bildirimi

function Send-Webhook($url, $text) {
  Invoke-RestMethod -Method Post -Uri $url -Body (@{text=$text} | ConvertTo-Json) -ContentType "application/json"
}
# Örnek: $teamsUrl = "https://outlook.office.com/webhook/..."

Tam Otomasyon Betiği (Örnek)

Aşağıdaki tek dosyalık betik, tüm kontrolleri yapar; sorun varsa uyarı yollar, yoksa sessizce biter.

# File: Check-FailoverCluster.ps1
param(
  [string]$Cluster = "PROD-CLUSTER",
  [string]$Mode    = "Mail",                 # Mail | Webhook
  [string]$Webhook = ""                      # Teams/Slack URL (Mode=Webhook ise)
)

Import-Module FailoverClusters -ErrorAction Stop
$errors = @()

try {
  $nodes = Get-ClusterNode -Cluster $Cluster
  $groups = Get-ClusterGroup -Cluster $Cluster
  $res = Get-ClusterResource -Cluster $Cluster
  $quorum = Get-ClusterQuorum -Cluster $Cluster
  $nets = Get-ClusterNetwork -Cluster $Cluster
} catch {
  $errors += "Cluster query failed: $($_.Exception.Message)"
}

$downNodes = $nodes | Where-Object State -ne 'Up'
if ($downNodes) { $errors += "Down nodes: " + ($downNodes.Name -join ', ') }

$badGroups = $groups | Where-Object State -ne 'Online'
if ($badGroups) { $errors += "Groups not Online: " + ($badGroups.Name -join ', ') }

$badRes = $res | Where-Object State -in @('Failed','Offline')
if ($badRes) { $errors += "Failed/Offline resources: " + ($badRes.Name -join ', ') }

if (-not $quorum.QuorumResource) { $errors += "Quorum misconfigured or missing witness." }

$netIssues = $nets | Where-Object State -ne 'Up'
if ($netIssues) { $errors += "Cluster network issues: " + ($netIssues.Name -join ', ') }

if ($errors.Count -gt 0) {
  $subject = "[ALERT] $Cluster cluster issues detected"
  $body    = ($errors -join "`r`n")

  if ($Mode -eq "Webhook" -and $Webhook) {
    Invoke-RestMethod -Method Post -Uri $Webhook -Body (@{text=$subject + "`n" + $body} | ConvertTo-Json) -ContentType "application/json"
  } else {
    Send-MailMessage -SmtpServer "smtp.domain.com" -From "cluster-monitor@domain.com" -To "ops@domain.com" -Subject $subject -Body $body
  }
} else {
  # Opsiyonel: Sağlık OK bildirimi göndermek istiyorsanız buraya ekleyin.
  Write-Host "Cluster OK"
}

Scheduled Task ile Düzenli Çalıştırma

Sunucuda Yönetici PowerShell ile aşağıdaki komutları çalıştırın:

$action  = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-NoProfile -File C:\Scripts\Check-FailoverCluster.ps1 -Cluster PROD-CLUSTER -Mode Mail"
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date).AddMinutes(5) -RepetitionInterval (New-TimeSpan -Minutes 5) -RepetitionDuration ([TimeSpan]::MaxValue)
Register-ScheduledTask -TaskName "FailoverClusterMonitor" -Action $action -Trigger $trigger -RunLevel Highest -Description "Cluster health check & alerts"

Bu görev her 5 dakikada bir küme sağlığını kontrol eder ve sorun varsa bildirim gönderir.

Gelişmiş Kontroller

1) Test-Cluster Doğrulaması (Bakım Penceresinde)

Test-Cluster -Node NODE1,NODE2 -Include "System Configuration","Network","Storage" -Verbose

2) Rolling Yama & Bakım Otomasyonu

Kümelenmiş rollerin kesintisiz taşınması için Move-ClusterGroup ve Suspend-ClusterNode kullanarak adım adım güncelleme senaryosu kurgulayın.

3) Event Tabanlı Alarm

# Kaynak Failure eventlerini toplayıp raporla
Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-FailoverClustering/Operational'; Level=2} -MaxEvents 50

Performans ve Güvenlik İpuçları

  • SMTP kimlik bilgileri: Güvenli kasada (Credential Manager / SecretStore) saklayın.
  • Network ayrımı: Cluster ve Live Migration ağlarını ayırın; QoS ile öncelik verin.
  • WAF & kenar güvenlik: Uygulama katmanı için WAF Koruma kullanın.
  • Kaynak paylaştırma: Yük artışlarında ölçeklenebilir Premium VDS veya Kurumsal Hosting planlarına geçişi değerlendirin.

Sık Karşılaşılan Sorunlar ve Çözümler

  • SMTP gönderilemiyor: Güvenlik duvarında 25/587/465 portlarını ve TLS’i doğrulayın.
  • Yetki hatası: Görevi çalıştıran hesabın küme sorgulama ve log okuma yetkilerini kontrol edin.
  • Yanlış pozitifler: Kısa kesintiler için “tekrarlı hata” mantığı ekleyin (ör. son 2 ölçümde de hata varsa bildir).

Sonuç

PowerShell ile Failover Cluster izleme ve otomatik bildirim kurgusu; kesinti sürelerini azaltır, kök sebep analizini hızlandırır ve operasyonel görünürlüğü artırır. Betikleri zamanlayıcıyla periyodik çalıştırıp e-posta veya webhook üzerinden uyarılar alarak kümelerinizi proaktif biçimde yönetin. Daha ileri optimizasyon ve 7/24 operasyon için HostLigo’nun Optimizasyon Hizmeti ile birlikte ölçeklenebilir VDS ve kurumsal Sunucu Barındırma altyapılarından yararlanabilirsiniz.

Bir Yorum Yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Benzer Yazılar