現在オフラインです。再接続するためにインターネットの接続を待っています

Hyper-V レプリカにてシャットダウン時にレプリケーションが一時停止となる

現象
Hyper-V レプリカにてプライマリサーバもしくはレプリカサーバをシャットダウン時にレプリケーションが一時停止となることがあります。この問題が発生した場合、Hyper-V VMMS のイベントログに Event 32086, 32022 のメッセージが連続して記録され、手動でレプリケーションを再開するまでレプリケーションが一時停止となります。特に Event ID 32022 にて「操作は中断されました (0x80004004)」となっている場合、本事象に該当致します。

ログの名前:  Microsoft-Windows-Hyper-V-VMMS/Admin
ソース:      Hyper-V-VMMS
イベント ID: 32086
レベル:      エラー
メッセージ:  
Hyper-V は、回復不可能なエラーにより、仮想マシン '<仮想マシン名>' のレプリケーションを中断しました。(仮想マシン ID <仮想マシン GUID>)。エラーを修正してからレプリケーションを再開してください。 

ログの名前:  Microsoft-Windows-Hyper-V-VMMS/Admin
ソース:      Hyper-V-VMMS
イベント ID: 32022
レベル:      エラー
Hyper-V は、仮想マシン '<仮想マシン名>' の変更をレプリケートできませんでした: 操作は中断されました (0x80004004)。(仮想マシン ID <仮想マシンの GUID>) 
原因
プライマリサーバおよびレプリカサーバではシャットダウンが実行されると Hyper-V 管理サービス(VMMS) 内で新規処理(タスク)の発行が停止されます。このタイミングで Hyper-V レプリカの差分データが到着もしくは送信される場合、その送信もしくは受信処理が発行できずレプリケーションが一時停止となる可能性があります。
解決方法
現時点では解決策としての修正モジュールは提供されておらず、Hyper-V マネージャより該当の仮想マシンを選択し右クリックにて [レプリケーション] -> [レプリケーションの再開] より手動でレプリケーションを再開させてください。また、本作業を自動化する場合は以下の手順にてレプリケーション自動再開スクリプトを設定し、システム起動時に自動再開させるようにしてください。 
回避策
タスクスケジューラにてレプリケーション自動再開スクリプトを設定し、再起動/シャットダウン時に一時停止したレプリケーションを自動再開させます。下記スクリプトは一時停止状態のレプリケーションを検出し自動再開させます。

[回避スクリプト設定手順]

下記設定をプライマリサーバおよびレプリカサーバの両サーバで実施してください。

1. 事前に後述の「レプリケーション自動再開スクリプト」 をコピーし "restartReplication.ps1" というファイル名で任意のフォルダに保存します。例では C:\Scripts 配下に保存したとします。

2. PowerShell を一度も実行した実績がないシステムでは既定で PowerShell の起動ができないようになっておりますので、PowerShell プロンプトを起動し以下のコマンドを実行します。

   PS > Set-ExecutionPolicy RemoteSigned

   ※ 上記を実行したことがあるシステムでは上記コマンドの実行は不要です。

3. 「Windows ロゴキー + X 」キーにて画面左下のメニューを表示させ、[コンピュータの管理] を起動します。

4. 左ペインの [タスク スケジューラ] 選択します。

5. タスクスケジューラ配下を展開し「タスク スケジューラ ライブラリ」を右クリックにて [タスクの作成] をクリックします。

6. タスク作成のウィンドウが表示されますので [全般] タブにて以下のように設定します。

    名前: XXX <-- 任意のタスク名を指定します。(例: Hyper-V レプリカ自動再開タスク)
    タスクの実行時に使うユーザアカウント: XXX\administrator  <--- 管理者権限のあるユーザを指定します。
    ユーザがログオンしているときのみ実行する:  チェックなし
    ユーザがログオンしているかどうかにかかわらず実行する: チェックあり

    最上位の特権で実行する: チェックあり

7. 次に[トリガ]タブをクリックし、[新規]ボタンをクリックします。

8. 以下のように設定します。

   ○ タスクの開始
      ・スタートアップ時

   ○ 詳細設定枠
      ・有効 => チェックあり
        ※ 「有効」以外はチェックなし

9. 以上にて [OK] ボタンをクリックし、[操作]タブをクリックします。

10. [新規]ボタンをクリックします。

11. 以下のように設定し [OK] ボタンをクリックします。

    操作: プログラムの開始
    プログラム / スクリプト : powershell.exe
    引数の追加(オプション): & '<自動再開スクリプトのフルパス>'
                      (例: & 'C:\Scripts\restartReplication.ps1' )
    開始(オプション): 空白

12. [条件]、[設定]タブは既定のまま [OK] ボタンをクリックし設定を完了します。

13. 認証ポップアップが表示されますので administrator のパスワードを入力します。

14. 上記作業をプライマリサーバおよびレプリカサーバの両サーバで実施します。

以上にて自動再開スクリプトの設定は完了となりますので以下の手順にて正常動作の確認をお願いします。

[動作試験方法]

動作試験は全てプライマリサーバで行います。

1. "プライマリサーバ" の Hyper-V マネージャよりレプリケーションを構成している仮想マシンを選択し、右クリックにて [レプリケーション] -> [レプリケーションの一時停止] をクリックし意図的に一時停止させます。

2. Hyper-V マネージャにて一時停止した仮想マシンを選択し、画面下部にある [レプリケーション] タブをクリックします。"レプリケーションの状態:" が「一時停止」となっていることを確認します。

2. "プライマリサーバ" を再起動してください。再起動できない場合にはプライマリサーバにてタスク スケジューラを起動し上記で作成したタスクを右クリックにて [実行する] を選択します。

3. システム起動時もしくは手動タスク実行にてスクリプトが実行されますので自動再開されるか確認します。確認はプライマリサーバの Hyper-V マネージャより一時停止した仮想マシンをまず選択します。

4. 次に Hyper-V マネージャの画面下部にある [レプリケーション] タブをクリックします。"レプリケーションの状態:" が「レプリケーション有効」となっていれば正常にレプリケーションが再開されております。

5. また、本スクリプトは「システム」のイベントログにも実行内容を記録します。そのため、システムのイベントログより以下のイベントを確認することでもスクリプトの動作状況を確認することができます。また、再開の失敗などエラーが発生した場合もシステムのイベントログに 「Hyper-V Replica script」というイベントソースでエラー内容が記録されます。
 
 スクリプト開始のイベント:
ログの名前:  システム
ソース:   Hyper-V Replica script  
イベント ID: 0
レベル:      情報
メッセージ:  
Starting script to restart replication.


レプリケーションを再開のイベント: 
ログの名前:  システム
ソース:   Hyper-V Replica script   
イベント ID: 4
レベル:      情報
メッセージ:  
Replication for <仮想マシン名> on <プライマリサーバ名> was in suspended and resumed successfully.


[レプリケーション自動再開スクリプト]

下記スクリプトをコピーし "restartReplication.ps1" というファイル名で任意のフォルダに保存します。

$EventSource = "Hyper-V Replica script"  ### Event source name recorded in system log.
$StartUpTimeout = 60                     ### Startup timout value for replication service in second.

New-EventLog -LogName System -Source $EventSource > $null  2>&1
Write-EventLog -LogName System -Source $EventSource -EntryType Information -EventID 0 -Message "Starting script to restart replication."

### Wait until VMMS starts up.
(Get-Service "vmms").WaitForStatus("Running")  ### No timeout.

### Wait until replication service in VMMS gets active.
$Count = 0
While((Get-VMReplication).count -eq 0)
{
    Start-Sleep -s 1
    $Count++  

    If ($Count -eq $StartUpTimeout)
    {
        Write-EventLog -LogName System -Source $EventSource -EntryType Error -EventID 1 -Message "VMMS did not complete initialization after VMMS service started up. Exiting..."
        Exit(1)
    }
}

$Message = "Replicaton service in VMMS is started succefully. It took " + $Count + " seconds after VMMS started."
Write-EventLog -LogName System -Source $EventSource -EntryType Information -EventID 2 -Message $Message

###
### MAIN
###
$LocalVMs = Get-VMReplication   ### Get local VMs replication is enabled.

Foreach($LocalVM in $LocalVMs)
{
    $PrimaryServer = $LocalVM.PrimaryServer
    $VMName = $LocalVM.Name

    ### The the following Get-VMRplication will access remote primary server if this VM is RecoveryVM.
    $VM = Get-VMReplication -ComputerName $PrimaryServer | Where-Object { $_.Name -eq $VMName}

    If ($VM -eq $null -or $VM.count -eq 0)
    {
        $Message = "Get-VMReplication has failed." + $Error[0].Exception + "(VM: " + $VMName + " Server: " + $PrimaryServer + ")"
        Write-EventLog -LogName System -Source $EventSource -EntryType Error -EventID 3 -Message $Message
        Exit(1)
    }

    If ($VM.State -ne "Suspended") { continue }  ### This VM is not in suspended(7). Move to next VM.

    ### Replication is in suspended. Resuming replication now.
    $Err = Resume-VMReplication -VMName $VMName -ComputerName $PrimaryServer 2>&1

    ### Wait status update for 1 sec.
    Start-Sleep -s 1
   
    ### Status check after Resume-VMReplication
    $CurrentVM = Get-VMReplication -ComputerName $PrimaryServer | Where-Object { $_.Name -eq $VMName}

    ### ReplicationState is still in suspended. => Error case.
    If ($CurrentVM.State -eq "Suspended")
    { 
        $Message = "Failed to resume replication for " + $VMName + " on " + $PrimaryServer + ". Please check replication status manually."  + $Err.Exception
        Write-EventLog -LogName System -Source $EventSource -EntryType Error -EventID 3 -Message $Message
    }
    Else
    {
        $Message = "Replication for " + $VMName + " on " + $PrimaryServer + " was in suspended and resumed successfully."
        Write-EventLog -LogName System -Source $EventSource -EntryType Information -EventID 4 -Message $Message
    }
}
 
状況
詳細
関連情報
注意 : これは、マイクロソフトのサポート組織内で直接作成された "緊急公開" の資料です。 この資料には、確認中の問題に関する現状ベースの情報が記載されています。 情報提供のスピードを優先するため、資料には誤植が含まれる可能性があり、予告なしに随時改定される場合があります。 その他の考慮事項については、使用条件を参照してください。
プロパティ

文書番号:2930278 - 最終更新日: 09/29/2016 11:37:00 - リビジョン: 4.0

Windows Server 2012 Standard, Windows Server 2012 Datacenter

  • KB2930278
フィードバック
ment.getElementsByTagName("head")[0].appendChild(m); //c.microsoft.com/ms.js'><\/script>");