クラスタ機(WSFC)のWindows Server 2012R2, 2016から2019へのアップグレード

Always On 可用性グループを配置したクラスタ構成のAWS EC2のOSを
Windows Server 2012R2から2019へインプレースアップグレードしたときのメモです。

これらのページを参考に作業しました。
作業する場合は各種バックアップなどを取得し、十分テストを行い各自の責任で注意して実行してください。

同じハードウェアでフェールオーバー クラスターをアップグレードする
https://docs.microsoft.com/ja-jp/windows-server/failover-clustering/upgrade-option-same-hardware
クラスター オペレーティング システムのローリング アップグレード
https://docs.microsoft.com/ja-jp/windows-server/failover-clustering/cluster-operating-system-rolling-upgrade

Windows Server 2012R2のクラスタ機から、直接、Windows Server 2019へインプレースアップグレードを行うと、クラスタが壊れます。
一旦、Windows Server 2016へアップグレードしてから、さらに2019へアップグレードしてください。
また、クラスターの機能レベルを適宜、アップグレードしながら作業する必要があります。

インプレースアップグレード

  1. EC2インスタンスのPVDriverを更新する
    AWS EC2(Windows Server 2012R2)ドライバ更新
  2. 初期状態

    1番機(アクティブ)
    2番機(スタンバイ)
  3. Windows Server 2012R2 → 2016
    1. 2番機(スタンバイ) 2012R2 から 2016 へインプレースアップグレード
    2. 1番機→2番機フェールオーバー
    3. 1番機(スタンバイ) 2012R2 から 2016 へインプレースアップグレード
    4. クラスターの機能レベルを 8(Windows Server 2012 R2)から 9(Windows Server 2016)へアップグレード

      ※アップグレード後は、プロセスを元に戻すことはできません。
    5. 2番機→1番機フェールオーバー

      1番機(アクティブ)
      2番機(スタンバイ)
  4. Windows Server 2016 → 2019
    1. 2番機(スタンバイ) 2016 から 2019 へインプレースアップグレード
    2. 1番機→2番機フェールオーバー
    3. 1番機(スタンバイ) 2016 から 2019 へインプレースアップグレード
    4. クラスターの機能レベルを 9(Windows Server 2016)から 10(Windows Server 2019)へアップグレード

      ※アップグレード後は、プロセスを元に戻すことはできません。
    5. 2番機→1番機フェールオーバーWindows Server 2016 → 2019

      1番機(アクティブ)
      2番機(スタンバイ)
  5. Windows Update実行


    ※テスト時にWindows Updateで「更新プログラムを構成できませんでした」となってしまう場合がありました。
    その時は、VBScriptによるWindows Updateを実行することで適用することができました。
    VBScriptによるWindowsUpdateでも失敗することがあったので、必ず成功するわけではありませんでした。
    何度か適用と変更を元に戻すを繰り返すことで当てることができましたが、原因不明。

その他

  • Windows Server 2019 ロック画面の画像変更
    reg add HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Personalization /v LockScreenImage /t "REG_SZ" /d "c:\windows\web\screen\img105.jpg" /f
    reg add HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Personalization /v LockScreenOverlaysDisabled /t "REG_DWORD" /d 1 /f
    
  • Windows Server 2016にアップグレード後、インスタンス内にインストールしていた、Management Studioが起動できませんでした。
    →.Netをアップグレードしたところ解決しました。
  • イベントログに警告
    コンポーネント {B31118B2-1F49-48E5-B6F5-BC21CAEC56FB} のイベント Load のプロファイル通知は失敗しました。エラー コードは See Tracelogging for error details です。
    イベントID 1534
    →レジストリを削除したところ解決しました。

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileNotification\TDL
    HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\WindowsNT\CurrentVersion\ProfileNotification\TDL
  • タスクスケジューラの動き
    定期的に繰り返し実行するタスクが意図したとおり動いているか確認する。
    2012R2の時に毎日、継続期間 1日で定期実行しているタスクは、
    1回、継続期間 無期限のように変更しないと、想定通り実行されない場合がある。

  • SQLServerのwmiカウンタが取得できなくなるケース
    cactiでWin32_PerfFormattedData_MSSQLSERVER_SQLServerMemoryManagerの値を取得していましたが、WindowsServer2019にアップグレード後、取得できないマシンが何台かありました。
    こちらのサイトを参考に修正しました。
    https://forest.watch.impress.co.jp/docs/news/1394018.html
    # 1. カウンターを再構築
    cd c:\windows\system32
    lodctr /R
    cd c:\windows\sysWOW64
    lodctr /R
    
  • インスタンスストアの初期化
    インスタンスストア付きのEC2をEC2Launch v2にアップグレードしたところ、起動時の自動マウントが動かなくなってしまった。
    下記のPowerShellを用意し、タスクスケジューラからインスタンス起動時に実行します。
    Z_DriveMount.ps1
    # 未フォーマットのNVMeドライブをフォーマットして、Zドライブにマウント
    
    $path = Split-Path -Parent $MyInvocation.MyCommand.Path
    Set-Location $path
    
    $log_name = $myInvocation.MyCommand.name + ".log";
    
    Write-Output  $("START:" + (Get-Date).toString('yyyy-MM-dd HH:mm:ss.fff')) | Add-Content -Encoding Default $log_name
    
    $ret=Get-Disk | Where {$_.partitionstyle -eq "raw" -and $_.FriendlyName -eq "NVMe Amazon EC2 NVMe" }
    
    #null or empty の場合はfalse
    if ( ($ret) ){
    
        Get-Disk | Out-File -FilePath  $log_name -Append -Encoding Ascii
    
        $ret=Get-Disk | Where {$_.partitionstyle -eq "raw" -and $_.FriendlyName -eq "NVMe Amazon EC2 NVMe" } | `
        Initialize-Disk -PartitionStyle GPT -PassThru | New-Partition -UseMaximumSize | `
        Format-Volume -FileSystem NTFS -Force | Get-Partition | Add-PartitionAccessPath -AccessPath "Z:"
         $ret| Out-File -FilePath  $log_name -Append -Encoding Ascii
        Get-Disk | Out-File -FilePath  $log_name -Append -Encoding Ascii
    
    } else {
        Write-Output "SKIP" | Add-Content -Encoding Default $log_name
    }
    
    Write-Output $("END:" + (Get-Date).toString('yyyy-MM-dd HH:mm:ss.fff')) | Add-Content -Encoding Default $log_name
    

    ※インスタンスストアが一つ搭載されたインスタンスのみで利用可能。
     未初期化の場合、初期化してZドライブとしてマウントする。
     ps1の配置されたフォルダにlogファイルが出力される。

    ■プログラム/スクリプト
    %Systemroot%\System32\WindowsPowerShell\v1.0\powershell.exe

    ■引数の追加

    -ExecutionPolicy Bypass .\Z_DriveMount.ps1

    ■開始

    Z_DriveMount.ps1を格納しているフォルダ


管理人 has written 36 articles