Add Scripts/Powershell/Hyper-V/Failover Cluster/Replication Bumper.md
This commit is contained in:
@ -0,0 +1,69 @@
|
|||||||
|
**Purpose**:
|
||||||
|
This script *bumps* any replication that has entered a paused state due to a replication error. The script will record failed attempts at restarting the replication. The logs will rotate out every 5-days.
|
||||||
|
|
||||||
|
``` powershell
|
||||||
|
# Define the directory to store the log files
|
||||||
|
$logDir = "C:\ClusterStorage\Volume1\Scripts\Logs"
|
||||||
|
if (-not (Test-Path $logDir)) {
|
||||||
|
New-Item -Path $logDir -ItemType Directory
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get today's date and format it for the log file name
|
||||||
|
$today = Get-Date -Format "yyyyMMdd"
|
||||||
|
$logFile = Join-Path -Path $logDir -ChildPath "ReplicationLog_$today.txt"
|
||||||
|
|
||||||
|
# Manually create the log file if it doesn't exist
|
||||||
|
if (-not (Test-Path $logFile)) {
|
||||||
|
Write-Host "Log file does not exist. Attempting creation..."
|
||||||
|
try {
|
||||||
|
New-Item -Path $logFile -ItemType File
|
||||||
|
Write-Host "Log file $logFile created successfully."
|
||||||
|
} catch {
|
||||||
|
Write-Error "Failed to create log file. Error: $_"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Delete log files older than 5 days
|
||||||
|
Get-ChildItem -Path $logDir -Filter "ReplicationLog_*.txt" | Where-Object {
|
||||||
|
$_.CreationTime -lt (Get-Date).AddDays(-5)
|
||||||
|
} | Remove-Item
|
||||||
|
|
||||||
|
# Get a list of all nodes in the cluster
|
||||||
|
$clusterNodes = Get-ClusterNode
|
||||||
|
|
||||||
|
# Iterate over each cluster node
|
||||||
|
foreach ($node in $clusterNodes) {
|
||||||
|
try {
|
||||||
|
# Get VMs with Critical ReplicationHealth from the current node
|
||||||
|
$vmsInCriticalState = Get-VMReplication -ComputerName $node.Name | Where-Object { $_.ReplicationHealth -eq 'Critical' }
|
||||||
|
} catch {
|
||||||
|
Write-Error "Failed to retrieve VMs from Node: $($node.Name). Error: $_"
|
||||||
|
# Log the error and continue to the next node
|
||||||
|
Add-Content -Path $logFile -Value "Failed to retrieve VMs from Node: $($node.Name) at $(Get-Date)"
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($vm in $vmsInCriticalState) {
|
||||||
|
Write-Host "Checking VM: $($vm.Name) on Node: $($node.Name) for replication issues."
|
||||||
|
Write-Host "Replication State for VM: $($vm.Name) is $($vm.ReplicationState)"
|
||||||
|
|
||||||
|
# Check if the replication state is valid to resume
|
||||||
|
if ($vm.ReplicationState -eq 'Resynchronization required' -or $vm.ReplicationState -eq 'WaitingForStartResynchronize') {
|
||||||
|
Write-Warning "Replication for VM: $($vm.Name) on Node: $($node.Name) is in '$($vm.ReplicationState)' state. Skipping..."
|
||||||
|
# Log the VM that is in 'Resynchronization required' or 'WaitingForStartResynchronize' state
|
||||||
|
Add-Content -Path $logFile -Value "Replication for VM: $($vm.Name) on Node: $($node.Name) is in '$($vm.ReplicationState)' state at $(Get-Date)"
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
# Try to resume replication for the VM
|
||||||
|
Resume-VMReplication -VMName $vm.Name -ComputerName $node.Name
|
||||||
|
Write-Host "Resumed replication for VM: $($vm.Name) on Node: $($node.Name)"
|
||||||
|
} catch {
|
||||||
|
Write-Error "Failed to resume replication for VM: $($vm.Name) on Node: $($node.Name) - $_"
|
||||||
|
# Write the failed VM name to the log file
|
||||||
|
Add-Content -Path $logFile -Value "Failed to resume replication for VM: $($vm.Name) on Node: $($node.Name) at $(Get-Date)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
Reference in New Issue
Block a user