仮想化ホストを冗長化してみようというテスト。
まずはHyper-Vのレプリケーション機能を使って最低限の冗長性を。
最低限なのでADとか使いません。
!!!注意!!!
この試みは失敗に終わっています。解決編まで見てね。
この試みは失敗に終わっています。解決編まで見てね。
この試みは失敗に終わっています。解決編まで見てね。
テスト環境
Windows Server 2016 + Hyper-Vを導入したサーバーを2台用意。
最低限のネットワークとしてHyperVで使用するホスト用と、サーバー間データ転送に使うストレージ用の2つのネットワークを作成。
HyperV1 | HyperV2 | |
---|---|---|
ホスト名 | castor1 | pollux1 |
fqdn | castor.hyperv.local | pollux.hyperv.local |
eth0 | 192.168.11.231 | 192.168.11.232 |
eth1 | 10.20.30.10 | 10.20.30.20 |
fqdnで証明書を作るのでシステムのプロパティからプライマリDNSサフィックスを登録しておく。
hostsにそれぞれfqdnで接続できるように設定
10.20.30.10 castor.hyperv.storage
10.20.30.20 pollux.hyperv.storage
192.168.11.231 castor.hyperv.local
192.168.11.232 pollux.hyperv.local
それぞれのネットワークで相互の導通が確認できている状態。
Hyper-Vにレプリケーションを設定
双方のサーバー用のオレオレ証明書2を作る
ADを使わないでレプリケーションをするためには証明書ベースで認証する必要がある。
ところが正式な証明書をきちんと手に入れるためにはADがほしいという再帰構造で非常に面倒くさいのでオレオレ証明書でやっつける。
Windows10 / Windows Server 2016 以降用。
どこの環境で作っても一緒なので適宜。以下castorで作業。
ホスト名保証用のfqdnとストレージネットワーク用のfqdnをサブジェクト代替名に併記しておく。
PS C:\Users\Administrator> New-SelfSignedCertificate -DnsName "castor.hyperv.local","castor.hyperv.storage" –CertStoreLocation "cert:\LocalMachine\My" -TestRoot
PSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\My
Thumbprint Subject
---------- -------
6B8F53418C906ACDD707810073F4424C4963447A CN=castor.hyperv.local
PS C:\Users\Administrator> New-SelfSignedCertificate -DnsName "pollux.hyperv.local","pollux.hyperv.storage" –CertStoreLocation "cert:\LocalMachine\My" -TestRoot
PSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\My
Thumbprint Subject
---------- -------
97E639E2F79BCC1ED44431DC48EAE1DACD79646A CN=pollux.hyperv.local
それ以前のバージョンだと -TestRoot
が使えないので先にルート証明書を作る必要があるみたい。
- ポイント対サイトの証明書の作成とエクスポート: MakeCert : Azure | Microsoft Docs
- Generate and export certificates for Point-to-Site: Linux: CLI: Azure | Microsoft Docs
出来た証明書の確認とエクスポート
コンピュータの証明書スナップイン3を開いて確認してみる。
サーバー証明書
証明書作成時に –CertStoreLocation "cert:\LocalMachine\My"
と指定しているのでローカルコンピューター/個人/証明書に証明書ができているのでこれをそれぞれエクスポートする。
ウィザードの流れ
###ルート証明書
あとルート証明書が-TestRoot
によって
中間証明機関/証明書にできているのでこれもエクスポート。
証明書を双方のサーバー4にインストールする。
ここまででこのファイルが出来ているので、これをそれぞれのサーバーにコピーする。
(今回は証明書をcastorで作ったので証明書の登録はpolluxでやる。)
ルート証明書のインストール
サーバー証明書のインストール
これを2サーバー分繰り返す
これを2サーバー分繰り返す
これを2サーバー分繰り返す
大事なことなので3回(ry
HyperVサーバー上で証明書を作っていたらルート証明書を信頼できるとこに置く
ほかのPCで証明書作った場合は関係ないです。
信頼されたルート証明機関/証明書
にドラッグ&ドロップでポイっとする。
Hyper-Vにレプリケーションの設定をする
ここまでで両方のサーバーで双方の証明書が登録されてるはずなのでここからHyperVに設定していく。
念の為オレオレ証明書の失効チェックを外しておく
ここまでの流れで作った証明書は1年で失効するので念の為。
「このテスト環境なんてすぐ捨てるから関係ねーよ」って人は無視してOK
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Replication" /v DisableCertRevocationCheck /d 1 /t REG_DWORD /f
レプリケーションの設定
レプリケーションには方向があってVMが動作する方のサーバーをプライマリ、プライマリの情報を逐次同期して備えておくほうのサーバーをレプリカと呼ぶ。
まずはcastorをプライマリ、polluxをレプリカとして設定してみる。
レプリカサーバー(pollux)で受け入れ準備
レプリケーションの構成
からチェックボックス2個チェックして証明書を選択。でOK。
ここでエラーが出たら証明書のインストールが終わってないかルート証明書が信頼できないか、そのあたり。
VMのレプリケーションにはSSL(443)を使用するのでファイアーウォールに穴をあける。
これでOK。
プライマリサーバー(castor)のVMにレプリケーションの設定
プライマリで稼働しているVMにレプリケーションの設定をする。
VMからウィザード開いて
こうして
こう
こうなって
こう
できた!
\(^o^)/
七転八倒
試しにhyperv.localネットワークでレプリケーションしてみる
てめぇ!
これなんかの原因で間違ったNIC使ってるわ。
ルーティングでNICを縛る
C:\Users\Administrator>route print -4
===========================================================================
インターフェイス一覧
7...00 25 90 2d 80 a9 ......Intel(R) 82576 Gigabit Dual Port Network Connection
6...00 25 90 2d 80 a8 ......Hyper-V Virtual Ethernet Adapter
1...........................Software Loopback Interface 1
3...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter
11...00 00 00 00 00 00 00 e0 Teredo Tunneling Pseudo-Interface
17...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter #3
===========================================================================
IPv4 ルート テーブル
===========================================================================
アクティブ ルート:
ネットワーク宛先 ネットマスク ゲートウェイ インターフェイス メトリック
0.0.0.0 0.0.0.0 192.168.11.1 192.168.11.231 291
10.20.30.0 255.255.255.0 リンク上 10.20.30.10 291
10.20.30.10 255.255.255.255 リンク上 10.20.30.10 291
10.20.30.255 255.255.255.255 リンク上 10.20.30.10 291
127.0.0.0 255.0.0.0 リンク上 127.0.0.1 331
127.0.0.1 255.255.255.255 リンク上 127.0.0.1 331
127.255.255.255 255.255.255.255 リンク上 127.0.0.1 331
192.168.11.0 255.255.255.0 リンク上 192.168.11.231 291
192.168.11.231 255.255.255.255 リンク上 192.168.11.231 291
192.168.11.255 255.255.255.255 リンク上 192.168.11.231 291
224.0.0.0 240.0.0.0 リンク上 127.0.0.1 331
224.0.0.0 240.0.0.0 リンク上 10.20.30.10 291
224.0.0.0 240.0.0.0 リンク上 192.168.11.231 291
255.255.255.255 255.255.255.255 リンク上 127.0.0.1 331
255.255.255.255 255.255.255.255 リンク上 10.20.30.10 291
255.255.255.255 255.255.255.255 リンク上 192.168.11.231 291
===========================================================================
固定ルート:
ネットワーク アドレス ネットマスク ゲートウェイ アドレス メトリック
0.0.0.0 0.0.0.0 192.168.11.1 既定
0.0.0.0 0.0.0.0 192.168.11.1 既定
===========================================================================
C:\Users\Administrator>route add -p 10.20.30.0 mask 255.255.255.0 10.20.30.1 metric 1
OK!
C:\Users\Administrator>route print -4
(略)
===========================================================================
固定ルート:
ネットワーク アドレス ネットマスク ゲートウェイ アドレス メトリック
0.0.0.0 0.0.0.0 192.168.11.1 既定
0.0.0.0 0.0.0.0 192.168.11.1 既定
10.20.30.0 255.255.255.0 10.20.30.1 1
===========================================================================
で、再実行。
なぜだ!
名前解決が間違えるなら名前を変えればいいじゃない
10.20.30.10 castor-LB , castor-LB.hyperv.storage
10.20.30.20 pollux-LB , pollux-LB.hyperv.storage
192.168.11.231 castor , castor.hyperv.local
192.168.11.232 pollux , pollux.hyperv.local
あばばばばばば
0x00002EFE でぐぐぐぐる
When Hyper-V Replica fails to initialize ← MIRU.CH
これ認証系のエラーだなぁ。
もう開き直ってレプリカ側の名前を変えてやる!
あっ。
ああっ。
今更ながらにHyper-vの冗長化 (Hyper-Vレプリケーション 解決編) - Qiitaにつづく
今日の反省会場
よくよく考えればレプリカ受付のHTTPSは名前ベースの仮想ホスト(ApacheのVirtualHost的な)なんだから、そのベース名はシステムのFQDNしかないよな。ないですよね。ちくしょう。
参考
- Windows Server 2016: Configuring Hyper-V Replica in a workgroup environment – Part1 | Michael Firsov