Windows Server 2012 Datacenter でライブマイグレーション

新しくなったWindows Server

2012年9月にMicrosoft社からWindows Server 2012の提供が開始されました。Windows Server 2012は仮想化環境、クラウドプラットフォームとしての機能、また多数のサーバーの一元管理などさまざまな機能の拡充が行われたリリースとなっており、その内容についてはWindows Server 2012: 概要からご確認いただけます。

また、機能の比較 - Microsoftに各Windows Serverとの機能比較がアップされていましたので、ご覧いただくと違いがわかりやすいかと思います。

弊社でもさくらの専用サーバにおいて2013年4月からWindows Server 2012の提供を開始いたしました。
個人的にはこれまでLinuxをさわることが多かったのですが、今回 Windows Server 2012をさわってみたところそれまでWindows Serverに持っていたイメージが変わり、扱いやすくなったなあと感じました。

PowerShellには豊富な数のコマンドレットがあり、さまざまな作業をスクリプトで自動化できそうです。仮想ディスク、ISOイメージのマウント機能がOS標準になり、エクスプローラの右クリックからマウントできます。Hyper-Vでは共有ストレージなしでライブマイグレーションができるようになりました。

その他にもいろいろと面白そうな機能があるのですが、共有ストレージが不要という手軽さにひかれて実際にさくらの専用サーバを使ってライブマイグレーションしてみたいと思います。

用意した環境

ライブマイグレーションさせるために最低2台のサーバが必要になりますのでさくらの専用サーバを2台用意します。また、仮想マシンをホストサーバ間で移動させる場合、移動の前後で同じIPアドレスを使えるように専用グローバルネットワークも用意しました。

用意した環境は以下のとおりです。

  • 専用サーバ Fujitsu RX200 S7 Xeon 8Core 2.6GHz 2CPU SATA 1TB x 1台
  • 専用サーバ Fujitsu RX100 S7 Xeon 4Core 3.3GHz SAS 600GB x 1台
  • 専用サーバ 専用グローバルネットワーク プランS (/28) x 1

2台のサーバにはWindows Server 2012 Datacenterがインストールされています。ちなみにさくらの専用サーバのWindows Server 2012 Datacenterでは仮想マシンとして3種類のWindows Server(2003R2、2008R2、2012)をインストールしています。また、Datacenterエディションにはインスタンス数の制限がありません。このためお客様は仮想マシンを複製して自由にインスタンスを追加したり、Datacenterエディションがインストールされた複数のサーバ間で仮想マシンのマイグレーションが行えます。

環境の構築

ライブマイグレーションを行うためにはActive Directoryドメインのメンバーでないといけません。
このため以下のような流れでActive Directoryを構成したあとにライブマイグレーションの設定を行います。

  1. ホストサーバのグローバル接続を専用グローバルネットワークに切り替え
  2. ホストサーバにローカル接続を設定
  3. 仮想マシンの作成
  4. Active Directoryを構成
  5. ライブマイグレーションを設定

ネットワーク設定と仮想マシンの作成

ホストサーバのグローバル接続は専用グローバルネットワークに切り替え、ローカル接続もローカルスイッチに接続し、それぞれIPアドレスを設定します。そのあとホストサーバの1台でWindows Server 2012 Datacenterの仮想マシンを作成し、専用グローバルネットワークのアドレスを設定しておきます。

これらの手順はさくらの専用サーバをご利用のお客様向けに用意している技術ドキュメント Windows Server 2012に記載されていますので、詳細についてはドキュメントを参照ください。

※ 現在ドキュメントには認証がかかっており、さくらの専用サーバをご利用のお客様のみ参照いただけます。

設定が終わったあとのネットワーク構成は以下のようになります。ホストサーバ host1、host2 が専用グローバルネットワーク(インターネット)、ローカル接続ネットワークに所属しています。
また、host1上で仮想マシンが稼動しています。

図1 ネットワーク構成
図1 ネットワーク構成

Active Directoryの構築

1台目ホストサーバ host1をActive Directoryドメインコントローラとして設定します。設定はhost1のPowerShellコンソールから行います。

  1. まずInstall-WindowsFeatureにて役割と機能の追加(Active Directoryドメインサービス)を行います。
  2. [powershell gutter="false"]
    Install-WindowsFeature `
    AD-Domain-Services, `
    RSAT-AD-PowerShell, `
    RSAT-ADDS-Tools, `
    RSAT-AD-AdminCenter
    [/powershell]
    
  3. 役割と機能が追加できたらドメインコントローラの設定を行います。設定内容は以下のとおりです。
    表1 ADDCの設定
    項目 設定
    配置操作 新しいフォレストを追加する
    ルートドメイン名 example.com
    フォレストの機能レベル Windows Server 2012
    ドメインの機能レベル Windows Server 2012
    ドメインコントローラーの機能 DNSサーバー
    DNS委任オプションの設定 DNS委任を作成しない
    NetBIOS ドメイン名 EXAMLE
    データベースのフォルダー C:\Windows\NTDS
    ログファイルのフォルダー C:\Windows\NTDS
    SYSVOLのフォルダー C:\Windows\SYSVOL

    この設定をInstall-ADDSForestにて行います。コマンド実行時にディレクトリサービス復元用のパスワードを設定します。プロンプトが表示されるのでパスワードを入力してください。

    [powershell gutter="false"]
    Install-ADDSForest `
    -CreateDnsDelegation:$false `
    -DatabasePath "C:\Windows\NTDS" `
    -DomainMode "Win2012" `
    -DomainName "example.com" `
    -DomainNetbiosName "EXAMPLE" `
    -ForestMode "Win2012" `
    -InstallDns:$true `
    -LogPath "C:\Windows\NTDS" `
    -NoRebootOnCompletion:$false `
    -SysvolPath "C:\Windows\SYSVOL" `
    -Force:$true
    [/powershell]
    
  4. コマンド完了後に自動再起動がかかります。再起動後からドメインコントローラとして稼動し、ログインする際には設定したNetBIOSドメイン名をアカウントの前につける必要があります。

次に作成したActive Directoryドメインにもう1台のホストサーバ host2を追加します。ここからはhost2のPowerShellコンソールで作業を行います。

  1. host2のグローバル側NICのインターフェース番号を確認します。コマンドを実行するとインターフェース番号が表示されます。
  2. [powershell gutter="false"]
    $nic_list = Get-WmiObject -query "SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=True"
    foreach($nic in $nic_list) {
      if ($nic.IPAddress -match "") {
        echo $nic.InterfaceIndex
      }
    }
    [/powershell]
    
  3. インターフェース番号が確認できたらhost1をDNSサーバとして設定します。
  4. [powershell gutter="false"]
    Set-DnsClientServerAddress `
    -InterfaceIndex <インターフェース番号> `
    -ResetServerAddresses
    Set-DnsClientServerAddress `
    -InterfaceIndex <インターフェース番号> `
    -ServerAddresses 
    [/powershell]
    
  5. host1の認証情報を取得します。コマンド実行時にパスワード入力を求められるので、EXAMPLE\Administratorアカウントのパスワードを入力します。
  6. [powershell gutter="false"]
    $mycred = Get-Credential EXAMPLE\Administrator
    [/powershell]
    
  7. ドメインexample.comに参加させます。
  8. [powershell gutter="false"]
    Add-Computer `
    -DomainName example.com `
    -Credential $mycred `
    -ComputerName $Env:ComputerName
    [/powershell]
    
  9. 設定を有効にするためサーバを再起動します。
  10. [powershell gutter="false"]
    Restart-Computer
    [/powershell]
    

ライブマイグレーションの設定

ホストサーバ host1のPowerShellコンソールからライブマイグレーションの設定を行います。Active Directoryドメインに参加しているのでホストサーバ host1からホストサーバ host2の設定も行えます。

  1. host1のライブマイグレーションを有効にします。
  2. [powershell gutter="false"]
    Enable-VMMigration
    [/powershell]
    
  3. host1がライブマイグレーションに使用するネットワークをローカルネットワーク側に指定します。
  4. [powershell gutter="false"]
    Add-VMMigrationNetwork -Subnet 192.168.0.0/24
    [/powershell]
    
  5. host2のライブマイグレーションを有効にします。
  6. [powershell gutter="false"]
    Enable-VMMigration -ComputerName host2
    [/powershell]
    
  7. host2がライブマイグレーションに使用するネットワークをローカルネットワーク側に指定します。
  8. [powershell gutter="false"]
    Add-VMMigrationNetwork -Subnet 192.168.0.0/24 -ComputerName host2
    [/powershell]
    

    以上でホストサーバの準備ができました。

マイグレーションさせる際の注意点

同じベンダーのCPUでもプロセッサ命令の違いによって仮想マシンをマイグレーションできない場合があります。これを避けるには仮想マシンでプロセッサ互換性モードを有効にしておきます。(別ベンダーのCPU同士ではプロセッサ互換性モードを有効にしてもマイグレーションできません。)今回の場合Fujitsu RX100 S7からFujitsu RX200 S7へのマイグレーションはプロセッサ互換性モードを有効にする必要がありました。

プロセッサ互換性モードを有効にするには仮想マシンをシャットダウンした状態で下記コマンドを実行します。

[powershell gutter="false"]
Set-VMProcessor `
-VMName <仮想マシン名> `
-CompatibilityForMigrationEnabled $true
[/powershell]

ライブマイグレーションを試す

ライブマイグレーションはMove-VMコマンドで行います。ディスクイメージを含めて移動する場合はIncludeStorageを指定して以下のようになります。

[powershell gutter="false"]
Move-VM `
-Name <仮想マシン名> `
-DestinationHost <移動先ホストサーバ名> `
-IncludeStorage `
-DestinationStoragePath <仮想ディスクイメージなどデータの移動先パス>
[/powershell]

またライブマイグレーションする前に仮想マシンにしかけをしておきます。仮想マシンにIISを立ち上げてカウンターCGI(PHP)を設置します。このカウンターはアクセスされた回数を表示するだけの簡単なものです。

そしてこのカウンターに0.5秒間隔でアクセスし続けるcountupスクリプトを用意しました。このスクリプトはリクエストが成功したかどうか、リクエストの回数、カウンターの内容を表示し続けるスクリプトです。

それでは別端末でcountupスクリプトを動かしながら、ライブマイグレーションしてみましょう。移動する仮想マシンは固定メモリ2GB、仮想ディスクのイメージファイルサイズが15GBの仮想マシンです。ホストサーバの移動はFujitsu RX200 S7からFujitsu RX100 S7への移動になります。また、Measure-Commandを使ってライブマイグレーションにかかる時間を計ってみました。

[powershell gutter="false"]
Measure-Command {
Move-VM `
-Name web1 `
-DestinationHost host2 `
-IncludeStorage `
-DestinationStoragePath "C:\Hyper-V\Virtual Hard Disks\web1"
}

Days              : 0
Hours             : 0
Minutes           : 6
Seconds           : 52
Milliseconds      : 691
Ticks             : 4126911906
TotalDays         : 0.00477651840972222
TotalHours        : 0.114636441833333
TotalMinutes      : 6.87818651
TotalSeconds      : 412.6911906
TotalMilliseconds : 412691.1906
[/powershell]

どきどきしながら待っているとこのように6分52秒でライブマイグレーションが完了しました。coutupスクリプトの結果もすべてのリクエストが成功おり、共有ストレージなしでのライブマイグレーション成功です。

おわりに

Windows Server 2012 Datacenter でライブマイグレーションについて紹介いたしました。共有ストレージなしでライブマイグレーションする機能は2012から追加された新しい機能です。また、PowerShellコマンドを使った設定方法をご覧いただけたかと思います。

このようにWindows Server 2012には新しくて便利な機能が追加されていますので、興味を持たれた方はさくらの専用サーバで試していただけたら幸いです。

さくらの専用サーバ