サイト内の現在位置を表示しています。

AzureでセカンダリIPを利用したHAクラスターの構築を試してみました(Windows)

CLUSTERPRO オフィシャルブログ ~クラブロ~

はじめに

Microsoft Azure(以下、Azure)で、Windows環境における接続先切り替えにセカンダリIPを使用したHAクラスターの構築を試してみました。以前、Linux環境における構築手順をpopup[こちら]の記事でご紹介しましたが、今回はWindows環境における構築手順をご紹介します。

HAクラスターの接続先切り替えにセカンダリIPを使用することで、同じHAクラスター内からサーバーアプリケーションへの接続の切り替えが可能となります。
これにより、HAクラスターを構成するVirtual Machines(以降、VM)上に、サーバーアプリケーションとクライアントアプリケーションが同居する構成も可能になりますので、より少ないVMでクライアント/サーバー型のシステムを構築できるようになります。

この記事の内容

1. セカンダリIPとは

Azure VMでは、1つのネットワーク インターフェイス(以下、NIC)に、複数のプライベートIPアドレス(プライマリIPアドレスとセカンダリIPアドレス)を付与することが可能です。

Azure VMには、必ず1つ以上のNICが割り当てられています。そして、NICには、1つ以上のIP構成が割り当てられています。
IP構成には、プライマリIP構成とセカンダリIP構成があります。
NICには、必ず1つのプライマリIP構成が割り当てられており、さらに追加でセカンダリIP構成を割り当てることで、VMに複数のIPアドレスを割り当てることが可能です。

今回は、接続先切り替えにセカンダリIPを利用したHAクラスターを構築します。

従来のAzureプローブポートリソースによるIP切り替えでは、HAクラスターを構築するVMは、仮想IPアドレスで自身のVMにアクセスすることができないため、同じHAクラスター内からサーバーアプリケーションへの接続の切り替えができませんでした。
セカンダリIPを接続先切り替えに利用することで、VMが自身のセカンダリIPに対してアクセスすることができます。
これにより、HAクラスターを構築するVM上に、クライアントとアプリケーションが同居する構成も可能になりますので、より少ないVMでクライアント/サーバー型のシステムを構築できるようになります。

なお、セカンダリIPの切り替えには、数分の時間を要します。
業務のフェールオーバー時間が伸びることになるため、所要時間についてシステムとして許容可能か、事前にご検討ください。
事前の検証には、CLUSTERPROのpopup試用版をご活用いただけます。

2. HAクラスター構成

「セカンダリIPを使用したHAクラスター」を構築します。
構成は以下の通りです。

HAクラスター構成の図

Azure CLIを使用して、HAクラスターを構築するVMのNICにセカンダリIP(例.10.5.0.110)を追加/削除します。
また、NICへのセカンダリIPの追加/削除に合わせて、フローティングIPリソースを使用して、OS上でIPアドレスの付与/解放を行います。

セカンダリIPの付け替えは、以下のサイトを参考にしました。

3. HAクラスター構築手順

Azureに「ミラーディスク型HAクラスター」を構築します。

3.1 Azure環境の設定

3.1.1 リソースグループ、仮想ネットワークの作成

最初にリソースを管理するリソースグループを作成して仮想ネットワークを作成します。
今回作成したリソースグループと仮想ネットワークの設定は以下の通りです。

リソース グループの設定
名前 TestGroup1
リソース グループの場所 東日本
仮想ネットワークの設定
名前 Vnet1
地域 東日本
アドレス空間 10.5.0.0/24
サブネット名 Vnet1-1
サブネットアドレス範囲 10.5.0.0/24

3.1.2 仮想マシンの作成

東日本リージョンに、HAクラスター構築用のVMを作成します。今回は可用性オプションに可用性セットを選択しましたが、可用性ゾーンを選択して構築することも可能です。
IPアドレスは初期設定では動的割り当てとなっているため、静的割り当てに変更します。

VMの設定
ホスト名 サーバー1:server01 サーバー2:server02
地域 東日本 東日本
NICの設定
  ホスト名(server01) ホスト名(server02)
NIC - 名前 server01606 server02263
NIC - IP構成 ipconfig1(プライマリ):10.5.0.101 ipconfig1(プライマリ):10.5.0.102

また、セカンダリIPの追加/削除はAzure CLIを使用して行うため、Azure CLIをインストールします。

3.1.3 マネージドIDの設定

Azure CLIを実行する際の認証に、システム割り当てマネージドID(以降、マネージドID)を使用します。
マネージドIDを使用することで、コード内に資格情報を格納せずに、Azureリソースをクラウドサービスに対して認証させることができます。

今回は、Azure カスタム ロールを作成し、セカンダリIP構成でVMに付与する必要がある権限を個別に追加します。マネージドIDに作成したAzure カスタム ロールを割り当てることで、HAクラスターを構築するVMに、ネットワークやNICに対する操作権限を追加します。

マネージドIDの設定手順は次の通りです。

  • (1) HAクラスターを構築する各VMでシステム割り当てマネージドIDを有効化
  • (2) Azure カスタム ロールを作成し、必要なアクセス許可を追加
  • (3) マネージドIDに作成したAzure カスタム ロールを割り当て

以下に、各手順の詳細を記載します。

  • (1) HAクラスターを構築する各VMのシステム割り当てマネージドIDを有効にします。
    各VMに対して、下記操作を実行します。
  • 1.Azureポータルから、HAクラスターを構築するVM(server01、または、server02)を選択します。
  • 2.左側のパネルの[ID]をクリックします。
  • 3.[システム割り当て済み]の[状態]を「オン」に設定して保存します。
  • (2) Azure カスタム ロールを作成し、必要なアクセス許可を追加します。
    下記操作を実行します。
  • 1.Azureポータルから、HAクラスターを構築するVM用に作成したリソース グループ(TestGroup1)を選択します。
  • 2.左側のパネルの[アクセス制御 (IAM)]をクリックします。
  • 3.[カスタムロールを作成する]から[追加]をクリックします。
  • 4.次の項目を入力し、保存します。
    [基本]タブから[カスタム ロール名]を入力します。
    [アクセス許可]タブから[+アクセス許可の追加]をクリックして、Azure カスタム ロールに追加するアクセス許可を選択します。今回セカンダリIP構成でVMに付与が必要な権限は以下の通りです。
    ・"Microsoft.Network/networkInterfaces/write"
    ・"Microsoft.Network/networkInterfaces/delete"
    ・"Microsoft.Network/virtualNetworks/checkIpAddressAvailability/read"
    ・"Microsoft.Network/networkInterfaces/read"
    ・"Microsoft.Network/networkSecurityGroups/join/action"
    ・"Microsoft.Network/virtualNetworks/subnets/join/action"
  • [確認と作成]タブから[作成]をクリックします。
  • (3) マネージドIDに作成したAzure カスタム ロールを割り当てます。
    下記操作を実行します。
  • 1.Azureポータルから、HAクラスターを構築するVM用に作成したリソース グループ(TestGroup1)を選択します。
  • 2.左側のパネルの[アクセス制御 (IAM)]をクリックします。
  • 3.[このリソースへのアクセス権の付与]から[ロールの割り当ての追加]をクリックします。
  • 4.[ロール]タブで(2)で作成したカスタム ロールを選択します。
  • 5.[メンバー]タブで[アクセスの割り当て先]に[マネージドID]を選択します。続けて[+メンバーを選択する]をクリックします。
  • 6.右側に[マネージド ID の選択]パネルが表示されます。[マネージド ID]に[仮想マシン]を選択し、HAクラスターを構築するVM(server01とserver02)を選択して[選択]をクリックします。
  • 7.[レビューと割り当て]タブから[レビューと割り当て]をクリックします。

3.2 HAクラスターの構築

HAクラスターを構築する各VMにCLUSTERPRO Xをインストールします。
今回はCLUSTERPRO X 5.0 for Windows(内部バージョン:13.00)に以下のリソースを追加して動作確認を行いました。CLUSTERPROの構成は以下の通りです。
CLUSTERPROのフェールオーバーグループには「フローティングIPリソース」、「ミラーディスクリソース」、「スクリプトリソース」の3つを登録します。

CLUSTERPROの設定
サーバー名 server01 server02
フェールオーバーグループ (failover)
フローティングIPリソース IPアドレス:10.5.0.110
ミラーディスクリソース データパーティション:F:\
クラスタパーティション:E:\
スクリプトリソース 起動スクリプト:start.bat
停止スクリプト:stop.bat

ミラーディスクリソースを登録します。
詳細は 『リファレンスガイド』 -「ミラーディスクリソースを理解する」を参照してください。

【参考】
  • CLUSTERPRO X 5.0 > Windows > リファレンスガイド
    → 第 3 章 グループリソースの詳細
        → 3.8 ミラーディスクリソースを理解する

セカンダリIPを追加/削除するスクリプトリソースを登録します。
スクリプトリソースには以下のように、各VMのNICにセカンダリIPを追加/削除するスクリプトを登録します。

NICの設定
  ホスト名(server01) ホスト名(server02)
NIC - 名前 server01606 server02263
NIC - IP構成 ipconfig1(プライマリ):10.5.0.101 ipconfig1(プライマリ):10.5.0.102
ipconfig2(セカンダリ):10.5.0.110(フェールオーバーグループ/スクリプトリソース活性時) ipconfig2(セカンダリ):10.5.0.110(フェールオーバーグループ/スクリプトリソース活性時)

なお、スクリプトリソースの依存関係は、依存するリソースなし(深度0)に設定します。

※以下のスクリプトはサンプルであり、動作を保証するものではありません。
※★部分の変数の値は環境に合わせて設定してください。

起動スクリプト(start.bat)

@echo off

setlocal ENABLEDELAYEDEXPANSION

set HostName1=server01        ★サーバー1のホスト名
set HostName2=server02        ★サーバー2のホスト名
set NicName1=server01606        ★サーバー1のNIC
set NicName2=server02263        ★サーバー2のNIC
set AZPath="C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin\az.cmd"        ★azコマンドのパス
set ResourceGroup=TestGroup1        ★リソースグループ名
set VnetName=Vnet1        ★仮想ネットワーク名
set SecondaryIP=10.5.0.110        ★セカンダリIPアドレス
set IPConfig=ipconfig2        ★セカンダリIPアドレスを付与するIP構成

for /f "usebackq tokens=*" %%i in (`hostname`) do @set CurrentHostName=%%i

if /i %CurrentHostName%==%HostName1% (
    set NicName=%NicName1%
) else if /i %CurrentHostName%==%HostName2% (
    set NicName=%NicName2%
) else (
    echo "Server is not found."
    exit 1
)

call %AZPath% login --identity
if not %ERRORLEVEL%==0 (
    echo "Failed to az login"
    exit 1
)

rem Check secondary IP
for /f "usebackq tokens=2 delims= " %%i in (`%AZPath% network vnet check-ip-address -g %ResourceGroup% -n %VnetName% --ip-address %SecondaryIP% --output yaml ^| findstr available:`) do @set CheckInUse=%%i
if !CheckInUse!==true (
    echo "Address not in use"
) else if !CheckInUse!==false (
    echo "Address in use"
    rem Get nic-name
    for /f "usebackq tokens=9 delims=/" %%i in (`%AZPath% network vnet check-ip-address -g %ResourceGroup% -n %VnetName% --ip-address %SecondaryIP% --output yaml ^| findstr inUseWithResource`) do @set NicInUse=%%i
    if "!NicInUse!"=="" (
        echo "Failed to get nic-name"
        call %AZPath% logout
        exit 1
    ) else if !NicInUse!==%NicName% (
        echo "Address already in use for %CurrentHostName%"
        call %AZPath% logout
        exit 0
    ) else (
        echo "Delete secondary IP"
        rem Delete secondary IP
        call %AZPath% network nic ip-config delete -g %ResourceGroup% -n %IPConfig% --nic-name !NicInUse!
        if not !ERRORLEVEL!==0 (
            echo "Failed to delete secondary IP"
            call %AZPath% logout
            exit 1
        )
    )
) else (
    echo "Failed to check secondary IP"
    call %AZPath% logout
    exit 1
)

rem Create secondary IP
call %AZPath% network nic ip-config create -g %ResourceGroup% -n %IPConfig% --nic-name %NicName% --private-ip-address %SecondaryIP%
if %ERRORLEVEL%==0 (
    echo "Success to create secondary IP"
    call %AZPath% logout
    exit 0
) else (
    echo "Failed to create secondary IP"
    call %AZPath% logout
    exit 1
)

停止スクリプト(stop.bat)

@echo off

set HostName1=server01        ★サーバー1のホスト名
set HostName2=server02        ★サーバー2のホスト名
set NicName1=server01606        ★サーバー1のNIC
set NicName2=server02263        ★サーバー2のNIC
set AZPath="C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin\az.cmd"        ★azコマンドのパス
set ResourceGroup=TestGroup1        ★リソースグループ名
set IPConfig=ipconfig2        ★セカンダリIPアドレスを付与するIP構成

for /f "usebackq tokens=*" %%i in (`hostname`) do @set CurrentHostName=%%i

if /i %CurrentHostName%==%HostName1% (
    set NicName=%NicName1%
) else if /i %CurrentHostName%==%HostName2% (
    set NicName=%NicName2%
) else (
    echo "Server is not found."
    exit 1
)

call %AZPath% login --identity
if not %ERRORLEVEL%==0 (
    echo "Failed to az login"
    exit 1
)

rem Delete secondary IP
call %AZPath% network nic ip-config delete -g %ResourceGroup% -n %IPConfig% --nic-name %NicName%
if %ERRORLEVEL%==0 (
    echo "Success to delete secondary IP"
    call %AZPath% logout
    exit 0
) else (
    echo "Failed to delete secondary IP"
    call %AZPath% logout
    exit 1
)

セカンダリIPの追加/削除に合わせて、OS上でセカンダリIPを付与/解放するためフローティングIPリソースを登録します。

フローティングIPリソースを追加し、OS上でセカンダリIPを付与/解放します。
なお、フローティングIPリソースの依存関係は、依存するリソースに上記で追加したスクリプトリソースを設定します。

4. 動作確認

フェールオーバーの前後で、VMに付与したセカンダリIPに接続できることを確認します。

  • 1.server01でフェールオーバーグループを起動します。
  • 2.クライアントマシンから、セカンダリIP(10.5.0.110)にアクセスし、server01に接続できることを確認します。
  • 3.server01から、セカンダリIP(10.5.0.110)にアクセスし、server01に接続できることを確認します。
  • 4.Cluster WebUIやコマンドにより、フェールオーバーグループをserver01からserver02に手動で移動します。
  • 5.クライアントマシンから、セカンダリIP(10.5.0.110)にアクセスし、server02に接続できることを確認します。
  • 6.server02から、セカンダリIP(10.5.0.110)にアクセスし、server02に接続できることを確認します。

セカンダリIPを使用してHAクラスターに接続できることを確認できました。

まとめ

今回はWindows環境におけるセカンダリIPを利用したHAクラスターの構築手順をご紹介しました。
HAクラスター対象のアプリケーションの要件などで、IPアドレスの区別が必要な場合は、本手順を参考にHAクラスターを構築ください。

本記事の構成をご検討の際は、CLUSTERPROのpopup試用版を用いて検証した後、ご提案・構築ください。

お問い合わせ

本記事に関するお問い合わせは、popupお問い合わせ窓口までお問い合わせください。
  • 本記事で紹介しているスクリプトの内容についてのお問い合わせ、および、お客様環境に合わせたカスタマイズにつきましてはCLUSTERPRO導入支援サービスにて承っておりますので、上記窓口の"ご購入前のお問い合わせ"フォームまでお問い合わせください。