PowerShell ile Failover Cluster Durum İzleme ve Otomatik Bildirim Sistemi
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?
- Önkoşullar
- Temel Sağlık Kontrolleri
- 1) Küme ve Düğüm Durumu
- 2) Kaynak (Resource) Sağlığı
- 3) Quorum ve Witness Kontrolü
- 4) Temel Ağ (Cluster Network) Kapsamı
- Otomatik Bildirim: E-posta & Webhook
- E-posta Bildirimi (SMTP)
- Webhook (Teams/Slack) Bildirimi
- Tam Otomasyon Betiği (Örnek)
- Scheduled Task ile Düzenli Çalıştırma
- Gelişmiş Kontroller
- 1) Test-Cluster Doğrulaması (Bakım Penceresinde)
- 2) Rolling Yama & Bakım Otomasyonu
- 3) Event Tabanlı Alarm
- Performans ve Güvenlik İpuçları
- Sık Karşılaşılan Sorunlar ve Çözümler
- Sonuç
Neden PowerShell ile İzleme?
- Yerleşik modül:
FailoverClustersmodü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
FailoverClustersmodü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.