69 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| **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)"
 | |
|         }
 | |
|     }
 | |
| }
 | |
| ``` |