SQL Server AlwaysOn 可用性グループの構成

Compute Engine で複数の SQL Server Enterprise インスタンスを実行している場合、Windows Server Failover Clustering と SQL Server AlwaysOn の可用性グループを使用して、高可用性と障害復旧がサポートされるようにインスタンスを構成できます。

このチュートリアルでは、必要なネットワーク設定を行って SQL Server Enterprise でインスタンスのクラスタを作成し、Windows Server Failover Clustering と SQL Server AlwaysOn 可用性グループが使用されるようにそれらのインスタンスを構成する方法について説明します。SQL Server 公開イメージまたは Microsoft ライセンス モビリティから作成された SQL Server Enterprise インスタンスを使用できます。

前提条件

このチュートリアルでは、以下を前提としています。

VPC ネットワークの設定

3 つのサブネットを持つカスタムモードの VPC ネットワークを作成します。次に、内部仮想マシン間のトラフィックが許可されるように、ファイアウォール ルールを設定します。必要に応じて、このタスクに既存のネットワークを使用することもできますが、システムは、異なるネットワークとサブネットに分離することをおすすめします。このチュートリアルでは、以下の VPC ネットワークとサブネットワークの構成を作成します。

  1. カスタムモードの VPC ネットワークを作成します。

        gcloud compute networks create wsfcnet --subnet-mode custom
        
  2. 3 つのサブネットを VPC ネットワークに追加します。

        gcloud compute networks subnets create wsfcsubnet1 --network wsfcnet \
        --region us-central1 --range 10.0.0.0/24
        
        gcloud compute networks subnets create wsfcsubnet2 --network wsfcnet \
        --region us-central1 --range 10.1.0.0/24
        
        gcloud compute networks subnets create wsfcsubnet3 --network wsfcnet \
        --region us-central1 --range 10.2.0.0/24
        
  3. 新しい VPC ネットワークで、内部 IP アドレスを持つインスタンス間でのトラフィック転送を許可するファイアウォール ルールを作成します。

        gcloud compute firewall-rules create allow-internal-ports \
        --network wsfcnet --allow tcp:1-65535,udp:1-65535,icmp \
        --source-ranges 10.0.0.0/24,10.1.0.0/24,10.2.0.0/24
        
  4. VPC ネットワーク上のポート 3389 で RDP を許可するファイアウォール ルールを作成します。

        gcloud compute firewall-rules create allow-rdp --network wsfcnet \
        --allow tcp:3389 --source-ranges 0.0.0.0/0
        

Windows ドメイン コントローラの作成

Windows ドメイン コントローラを作成します。このチュートリアルでは、ドメインは dbeng.com、ドメイン コントローラの名前は dc-windows、IP アドレスは 10.2.0.100 です。ドメイン コントローラは wsfcsubnet3 サブネットを使用しています。

  1. ドメイン コントローラとして使用するインスタンスを作成します。このチュートリアルでは、小規模な n1-standard-2 マシンタイプと、windows-2016 イメージ ファミリーの最新のイメージを指定します。

        gcloud compute instances create dc-windows --machine-type n1-standard-2 \
        --boot-disk-type pd-ssd --image-project windows-cloud \
        --image-family windows-2016 --boot-disk-size 200GB \
        --zone us-central1-f --subnet wsfcsubnet3 --private-network-ip=10.2.0.100
        
  2. パスワードを生成し、ローカル アカウントを使用してドメイン コントローラ VM に接続できるようにします。今後の使用のためにユーザー名とパスワードを記録しておきます。

  3. RDP を使用して、ローカル アカウントのユーザー名とパスワードでドメイン コントローラ VM に接続します。

  4. インスタンスで、管理者として PowerShell を実行し、PowerShell ターミナルを開きます。

  5. 管理者ユーザーを設定します。

    1. 次のコマンドを実行し、管理者アカウントで使用するパスワードを入力します。

          PS C:\> $Password = Read-Host -AsSecureString
          

      入力したパスワードを記録しておきます。このパスワードは管理者アカウント用に使用します。

    2. 管理者アカウントのパスワードを設定します。

          PS C:\> Set-LocalUser -Name Administrator -Password $Password
          
    3. 管理者アカウントを有効にします。

          PS C:\> Enable-LocalUser -Name Administrator
          
  6. 以下の変数を設定します。

        PS C:\> $DomainName = "dbeng.com";
        
        PS C:\> $DomainMode = "Win2012R2";
        
        PS C:\> $ForestMode = "Win2012R2";
        
        PS C:\> $DatabasePath = "C:\Windows\NTDS";
        
        PS C:\> $LogPath = "C:\Windows\NTDS";
        
        PS C:\> $SysvolPath = "C:\Windows\SYSVOL";
        
  7. 以下の Active Directory ツールをインストールします。

        PS C:\> Install-WindowsFeature -Name AD-Domain-Services -IncludeManagementTools
        
        PS C:\> Install-ADDSForest -CreateDnsDelegation:$false -DatabasePath $DatabasePath -LogPath $LogPath -SysvolPath $SysvolPath -DomainName $DomainName -DomainMode $DomainMode -ForestMode $ForestMode -InstallDNS:$true -NoRebootOnCompletion:$false -SafeModeAdministratorPassword ((Get-Credential).Password) -Force:$true
        
  8. ドメインが作成された後、インスタンスが自動的に再起動しない場合、インスタンスを手動で再起動してください。

  9. インスタンスが再起動したら、新しく作成したドメイン名(このチュートリアルでは dbeng.com)の Administrator アカウントを使用して再接続します。

  10. sql_service という名前のドメイン アカウントを作成します。これは、SQL Server の実行に使用されます。

    1. SQL Server サービス アカウントで使用するパスワードをセキュアな文字列として入力します。

          PS C:\> $Password = Read-Host -AsSecureString
          

      入力したパスワードを記録しておきます。このパスワードは、SQL Server サービス アカウントに使用します。

    2. SQL Server サービス アカウントを作成し、そのパスワードを設定します。

          PS C:\> New-LocalUser -Name "sql_service" -Description "SQL Agent and SQL Admin account."  -Password $Password
          

ドメイン コントローラの構成が完了したら、dc-windows インスタンスから切断できます。次に、可用性グループのインスタンスを作成します。

可用性グループのインスタンスの作成

可用性グループの SQL Server インスタンスを作成します。これらのインスタンスは、エイリアス IP とともに次の IP アドレス構成を使用します。

  • インスタンス名: cluster-sql1
    • 内部 IP アドレス: 10.0.0.4
    • Windows フェイルオーバー クラスタ名: cluster-ag
    • フェイルオーバー クラスタの IP アドレス: 10.0.0.5(エイリアス IP)
    • 可用性グループ名: cluster-listener
    • 可用性グループ リスナーのアドレス: 10.0.0.6(エイリアス IP)
  • インスタンス名: cluster-sql2
    • 内部 IP アドレス: 10.1.0.4
    • Windows フェイルオーバー クラスタ名: cluster-ag
    • フェイルオーバー クラスタの IP アドレス: 10.1.0.5(エイリアス IP)
    • 可用性グループ名: cluster-listener
    • 可用性グループ リスナーのアドレス: 10.1.0.6(エイリアス IP)

以下のいずれかの方法を使用して SQL Server インスタンスを作成します。

SQL Server の公開イメージ

公開 SQL Server イメージから 2 つのインスタンスを作成します。この例では、インスタンスに cluster-sql1cluster-sql2 という名前を付けます。ブートディスク サイズとして 200GB を指定し、マシンタイプに n1-highmem-4 を指定します。通常、SQL Server インスタンスではドメイン コントローラのインスタンスよりも多くのコンピューティング リソースが必要になります。後でさらにコンピューティング リソースが必要になった場合、それらのインスタンスのマシンタイプを変更できます。さらに保存容量が必要になった場合、ディスクを追加するか永続ブートディスクのサイズを変更します。より大規模な可用性グループでは、複数のインスタンスを作成できます。

また、インスタンスの作成時に --metadata sysprep-specialize-script-ps1 フラグを組み込んで PowerShell コマンドを実行し、Failover-Clustering 機能をインストールします。

この例では、以下のコマンドを使用して 2 つのインスタンスを作成します。

    gcloud compute instances create cluster-sql1 --machine-type n1-highmem-4 \
    --boot-disk-type pd-ssd --boot-disk-size 200GB \
    --image-project windows-sql-cloud --image-family sql-ent-2016-win-2016 \
    --zone us-central1-f \
    --network-interface "subnet=wsfcsubnet1,private-network-ip=10.0.0.4,aliases=10.0.0.5;10.0.0.6" \
    --can-ip-forward --metadata sysprep-specialize-script-ps1="Install-WindowsFeature Failover-Clustering -IncludeManagementTools;"
    
    gcloud compute instances create cluster-sql2 --machine-type n1-highmem-4 \
    --boot-disk-type pd-ssd --boot-disk-size 200GB \
    --image-project windows-sql-cloud --image-family sql-ent-2016-win-2016 \
    --zone us-central1-f \
    --network-interface "subnet=wsfcsubnet2,private-network-ip=10.1.0.4,aliases=10.1.0.5;10.1.0.6" \
    --can-ip-forward --metadata sysprep-specialize-script-ps1="Install-WindowsFeature Failover-Clustering -IncludeManagementTools;"
    

より大規模な可用性グループの場合、該当する IP アドレスを使用してさらにインスタンスを作成できます。

既存のライセンス

ソフトウェア アシュアランスによる Microsoft ライセンス モビリティに基づいて、所有する SQL Server Enterprise のライセンスを導入する場合は、--guestOSFeatures を有効にして Windows イメージを作成します。後で SQL Server Enterprise を手動でインストールします。

  1. Windows Server インスタンスを作成します。
  2. このインスタンスで、すべてのコンポーネントを最新バージョンに更新します。
  3. インスタンスのブートディスクの自動削除状態false に設定します。
  4. インスタンスを削除します
  5. 標準 Windows Server イメージを入れる一時ディスクを作成します。

        gcloud compute disks create windows-2012-disk-new --size 200 \
        --zone us-central1-f --type pd-ssd --image-family windows-2012-r2 \
        --image-project windows-cloud
        
  6. guestOSFeatures パラメータで MULTI_IP_SUBNET を有効にして、この新しいディスクからカスタム Windows Server イメージを作成します。

        gcloud beta compute images create windows-server-2012-r2-dc-new \
        --source-disk windows-2012-disk-new --source-disk-zone us-central1-f \
        --guest-os-features MULTI_IP_SUBNET
        
  7. イメージを作成したら、一時ディスクを削除します。

        gcloud compute disks delete windows-2012-disk-new --zone us-central1-f
        
  8. カスタム イメージを使用して、可用性グループ用の新しい SQL Server インスタンスを作成します。通常、SQL Server インスタンスではドメイン コントローラのインスタンスよりも多くのコンピューティング リソースが必要になるため、少なくとも n1-highmem-4 のマシンタイプを指定します。後でさらにコンピューティング リソースが必要になった場合、それらのインスタンスのマシンタイプを変更できます。さらに保存容量が必要になった場合、ディスクを追加するか永続ブートディスクのサイズを変更します。より大規模な可用性グループでは、複数のインスタンスを作成できます。たとえば、2 つのインスタンスを作成します。

        gcloud compute instances create cluster-sql1 --machine-type n1-highmem-4 \
        --boot-disk-type pd-ssd --boot-disk-size 200GB \
        --image windows-server-2012-r2-dc-new --zone us-central1-f \
        --subnet wsfcsubnet1 --private-network-ip=10.0.0.4 --can-ip-forward \
        --metadata sysprep-specialize-script-ps1="Install-WindowsFeature Failover-Clustering -IncludeManagementTools;"
        
        gcloud compute instances create cluster-sql2 --machine-type n1-highmem-4 \
        --boot-disk-type pd-ssd --boot-disk-size 200GB \
        --image windows-server-2012-r2-dc-new --zone us-central1-f \
        --subnet wsfcsubnet2 --private-network-ip=10.1.0.4 --can-ip-forward \
        --metadata sysprep-specialize-script-ps1="Install-WindowsFeature Failover-Clustering -IncludeManagementTools;"
        
  9. 各インスタンスで、SQL Server Enterprise を手動でインストールします。

インスタンスを作成した後、それらが可用性グループとして機能できるようにインスタンスを構成します。

  1. RDP 接続を使用して両方のインスタンスに接続します。
  2. 両方のインスタンスで、静的 IP アドレスを使用するように構成を変更し、ネットマスクを 255.255.0.0 に設定します。管理者として PowerShell ターミナルを開き、静的 IP アドレスを static に設定します。これらのコマンドを実行すると、リモート デスクトップ接続が終了する場合があります。

    • インスタンス 1:

          PS C:\> netsh interface ip set address name=Ethernet static 10.0.0.4 255.255.0.0 10.0.0.1 1
          
          PS C:\> netsh interface ip set dns Ethernet static 10.2.0.100
          
          PS C:\> netsh advfirewall firewall add rule name="Open Port 5022 for Availability Groups" dir=in action=allow protocol=TCP localport=5022
          
          PS C:\> netsh advfirewall firewall add rule name="Open Port 1433 for SQL Server" dir=in action=allow protocol=TCP localport=1433
          
    • インスタンス 2:

          PS C:\> netsh interface ip set address name=Ethernet static 10.1.0.4 255.255.0.0 10.1.0.1 1
          
          PS C:\> netsh interface ip set dns Ethernet static 10.2.0.100
          
          PS C:\> netsh advfirewall firewall add rule name="Open Port 5022 for Availability Groups" dir=in action=allow protocol=TCP localport=5022
          
          PS C:\> netsh advfirewall firewall add rule name="Open Port 1433 for SQL Server" dir=in action=allow protocol=TCP localport=1433
          
  3. 両方のインスタンスを Windows ドメインに追加します。管理者として PowerShell を開き、両方のインスタンスで次の Add-Computer コマンドを実行します。

        PS C:\> Add-Computer -DomainName "dbeng.com" -Credential "dbeng.com\Administrator" -Restart -Force
        

    コマンドにより、認証情報が要求されます。コマンドの実行が完了したら、インスタンスが再起動します。

  4. SQL Server サービス アカウントを設定するには、RDP を使用してインスタンスに再接続します。

    1. SQL Server 構成マネージャーを開きます。
    2. [SQL Server サービス] タブを選択し、[SQL Server] を右クリックして、[プロパティ] をクリックします。
    3. sql_service のアカウントとパスワードを設定します。

これで、可用性グループ用にインスタンスが作成されました。次に、フェイルオーバー クラスタ マネージャーを構成します。

フェイルオーバー クラスタ マネージャーの構成

可用性グループのインスタンスでフェイルオーバー クラスタリングを有効にし、1 つのインスタンスがフェイルオーバー クラスタ マネージャーとして機能するように構成します。グループ内のすべてのインスタンスで AlwaysOn 高可用性を有効にします。

  1. RDP を使用してインスタンスに再接続しますが、ドメイン管理者の資格情報を使用します。この例では、ドメインは dbeng、管理者アカウントは Administrator です。Chrome RDP for Google Cloud を使用している場合は、オプション メニューの証明書のリストで、それらのアドレスに対する既存の RDP 証明書を削除します。

  2. いずれかのインスタンスを選択し、フェイルオーバー クラスタ マネージャーとして実行されるようにそのインスタンスを構成します。

    1. 管理者として PowerShell を開き、クラスタ環境を反映するように変数を設定します。この例の場合、以下の変数を設定します。

          PS C:\> $node1 = "cluster-sql1"
          
          PS C:\> $node2 = "cluster-sql2"
          
          PS C:\> $nameWSFC = "cluster-dbclus" #Name of cluster
          
          PS C:\> $ipWSFC1 = "10.0.0.5" #IP address of cluster in subnet 1
          
          PS C:\> $ipWSFC2 = "10.1.0.5" #IP address of cluster in subnet 2
          
    2. フェイルオーバー クラスタを作成します。

          PS C:\> New-Cluster -Name $nameWSFC -Node $node1, $node2 -NoStorage -StaticAddress $ipWSFC1, $ipWSFC2
          
    3. クラスタの両方のノードに対して、AlwaysOn 高可用性を有効にします。

          PS C:\> Enable-SqlAlwaysOn -ServerInstance $node1 -Force
          
          PS C:\> Enable-SqlAlwaysOn -ServerInstance $node2 -Force
          
  3. クラスタ マネージャーがない 2 番目のインスタンス上の C:\SQLBackup にバックアップ フォルダを作成し、読み取りと書き込みの両方のために、そのフォルダを sql_service アカウントの \\cluster-sql2\SQLBackup として共有します。

  4. 両方のインスタンスで、C:\SQLDataC:\SQLLog に 2 つのフォルダを作成します。これらのフォルダはデータベースのデータとログファイルに使用します。

これで、フェイルオーバー クラスタ マネージャーの準備が整いました。次に、可用性グループを作成します。

可用性グループの作成

テスト データベースを作成し、新しい可用性グループで機能するように構成します。あるいは、可用性グループに既存のデータベースを指定することもできます。

  1. まだデータベースが構成されていない場合は、テスト データベースを作成します。クラスタ マネージャーのインスタンスで、SQL Server Management Studio を実行し、次の SQL コマンドを使用してテスト データベースを作成します。

        CREATE DATABASE TestDB
        ON PRIMARY (NAME = 'TestDB_Data', FILENAME='C:\SQLData\TestDB_Data.mdf', SIZE = 256MB, MAXSIZE = UNLIMITED, FILEGROWTH = 256MB )
        LOG ON (NAME = 'TestDB_Log', FILENAME='C:\SQLLog\TestDB_Log.ldf', SIZE = 256MB, MAXSIZE = UNLIMITED, FILEGROWTH = 256MB )
        GO
        USE [TestDB]
        Exec dbo.sp_changedbowner @loginame = 'sa', @map = false;
          ALTER DATABASE [TestDB] SET RECOVERY FULL;
          GO
          BACKUP DATABASE TestDB to disk = '\\cluster-sql2\SQLBackup\TestDB.bak' WITH INIT
        GO
        
  2. クラスタ マネージャーのインスタンスで、SQL Server Management Studio を実行します。

  3. [AlwaysOn 高可用性] を右クリックし、[新しい可用性グループ ウィザード] を選択します。

  4. [名前を指定] ページで、可用性グループの名前を設定します。この例では、cluster-ag と指定します。

  5. [データベースの選択] ページで、複製するデータベースを指定します。この例では、TestDB データベースを指定します。

  6. [レプリカの指定] ページで、自動フェイルオーバーと同期 commit が組み込まれたレプリカとして両方のインスタンスを設定します。

  7. [データ同期の選択] ページで、初期同期中にデータベースのバックアップが保持されるようにネットワーク共有を指定します。この例では、\\cluster-sql2\SQLBackup と指定します。

  8. リスナーがないため、[検証] ページで警告が発生しますが、この警告は無視できます。

  9. ウィザードが完了したら、新しい可用性グループを右クリックし、[リスナーを追加] を選択します。

  10. このリスナーのパラメータを指定します。

    • リスナーの DNS 名: cluster-listener
    • ネットワーク ポート: 1433
    • ネットワーク モード: Static IP
  11. 2 つのサブネットと IP アドレス フィールドを追加します。この例では、以下のサブネットと IP アドレスのペアを使用します。

    • 10.0.0.0/1610.0.0.6
    • 10.1.0.0/1610.1.0.6

これで、インスタンスの名前ではなく、SQL Server データベースの名前として cluster-listener を使用して SQL Server に接続できるようになりました。この接続は、現在アクティブなインスタンスを指します。

次のステップ