同期 commit を使用して SQL Server AlwaysOn 可用性グループを構成する


Microsoft SQL Server の AlwaysOn 可用性グループ(AG)を使用すると、複数の SQL Server Enterprise インスタンス間でデータベースを複製できます。

SQL Server フェイルオーバー クラスタ インスタンスと同様に、AlwaysOn 可用性グループは Windows Server フェイルオーバー クラスタリング(WSFC)を使用して高可用性を実装します。ただし、この 2 つの機能には次のような違いがあります。

Always On 可用性グループ フェイルオーバー クラスタ インスタンス
フェイルオーバーのスコープ データベースのグループ インスタンス
ストレージ 共有なし 共有

詳細な比較については、フェイルオーバー クラスタ インスタンスと可用性グループの比較をご覧ください。

AlwaysOn 可用性グループは、複数の可用性モードをサポートしています。このチュートリアルでは、AlwaysOn 可用性グループを同期 commit モードでデプロイして、1 つ以上のデータベースの高可用性を実装する方法について説明します。

アーキテクチャ

2 つの VM インスタンス(node-1node-2)が WSFC ノードとして機能し、SQL Server を実行します。3 番目の VM インスタンス witness は、フェイルオーバー シナリオでクォーラムを達成するために使用されます。3 つの VM インスタンスは 3 つのゾーンに分散され、共通のサブネットを共有します。

SQL Server Always On 可用性グループを使用して、サンプル データベース bookshelf が、2 つの SQL Server インスタンス間で同期的に複製されます。

オンプレミス環境では、フェイルオーバーが発生したときに、WSFC が ARP 通知を実行して、IP アドレスの変更をネットワーク機器に通知できます。Google Cloud は ARP 通知を無視するため、代わりに内部ロードバランサを使用する必要があります。詳細については、Windows Server フェイルオーバー クラスタリングの実行をご覧ください。

ロードバランサは次の処理を行います。

  • 現在アクティブな WSFC ノードを特定するためのヘルスチェックを定期的に実行する
  • クライアントがロードバランサの IP アドレスに接続する
  • クライアント トラフィックを現在アクティブな WSFC ノードに転送する

この記事では、Google Cloud に Active Directory がデプロイされており、SQL Server、Active Directory、Compute Engine の基本的な知識があることを前提としています。

目標

  • 2 つの SQL Server VM インスタンスと、ファイル共有監視の機能を有する 1 つの VM インスタンスで構成される WSFC をデプロイします。
  • SQL Server をデプロイします。
  • 同期 commit を使用して可用性グループを作成します。
  • フェイルオーバーをシミュレートして、設定が機能していることを確認します。

費用

このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。

料金計算ツールを使用すると、予想使用量に基づいて費用の見積もりを作成できます。

始める前に

このガイドを完了するには、次の準備が必要です。

  • ドメイン コントローラが 1 つ以上配置された Active Directory ドメイン。Active Directory ドメインは、Managed Microsoft AD を使用して作成できます。または、Compute Engine にカスタムの Active Directory 環境をデプロイして、DNS クエリをドメイン コントローラに転送するプライベート DNS 転送ゾーンを設定することも可能です。
  • コンピュータをドメインに参加させ、RDP を使用してログインする権限を付与された Active Directory ユーザー。Managed Microsoft AD を使用している場合は、setupadmin ユーザーを使用できます。
  • Active Directory ドメイン コントローラと Google Cloud プロジェクトおよび VPC の接続。
  • WSFC VM インスタンスに使用するサブネット。

このガイドを完了するには、次の Google Cloud プロジェクトも必要です。

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  5. Google Cloud プロジェクトで課金が有効になっていることを確認します

このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳しくは、クリーンアップをご覧ください。

プロジェクトとネットワークの準備

SQL Server AlwaysOn 可用性グループをデプロイするために Google Cloud プロジェクトと VPC を準備するには、次の操作を行います。

  1. Google Cloud コンソールで、[Cloud Shell をアクティブにする] Cloud Shell をアクティブにします。 ボタンをクリックして Cloud Shell を開きます。

    Google Cloud コンソールに移動

  2. 次の変数を初期化します。

    VPC_NAME=VPC_NAME
    SUBNET_NAME=SUBNET_NAME
    

    ここで

    • VPC_NAME: VPC の名前
    • SUBNET_NAME: サブネットの名前
  3. デフォルトのプロジェクト ID を設定します。

    gcloud config set project PROJECT_ID
    

    PROJECT_ID は、Google Cloud プロジェクトの ID に置き換えます。

  4. デフォルトのリージョンを設定します。

    gcloud config set compute/region REGION
    

    REGION は、デプロイするリージョンの ID に置き換えます。

ファイアウォール ルールの作成

クライアントによる SQL Server への接続、WSFC ノード間の通信、ロードバランサによるヘルスチェックの実行を可能にするには、ファイアウォール ルールをいくつか作成する必要があります。ネットワーク タグを使用すると、こうしたファイアウォール ルールを簡単に作成できます。

  • 2 つの WSFC ノードには、wsfc-node タグを付加します。
  • すべてのサーバー(監視サーバーを含む)には、wsfc タグを付加します。

こうしたネットワーク タグを使用してファイアウォール ルールを作成します。

  1. 既存の Cloud Shell セッションに戻ります。
  2. WSFC ノードのファイアウォール ルールを作成します。

    SUBNET_CIDR=$(gcloud compute networks subnets describe $SUBNET_NAME --format=value\('ipCidrRange'\))
    
    gcloud compute firewall-rules create allow-all-between-wsfc-nodes \
      --direction=INGRESS \
      --action=allow \
      --rules=tcp,udp,icmp \
      --enable-logging \
      --source-tags=wsfc \
      --target-tags=wsfc \
      --network=$VPC_NAME \
      --priority 10000
    
    gcloud compute firewall-rules create allow-sql-to-wsfc-nodes \
      --direction=INGRESS \
      --action=allow \
      --rules=tcp:1433 \
      --enable-logging \
      --source-ranges=$SUBNET_CIDR \
      --target-tags=wsfc-node \
      --network=$VPC_NAME \
      --priority 10000
    
  3. Google Cloud プローバーの IP 範囲からのヘルスチェックを許可するファイアウォール ルールを作成します。

    gcloud compute firewall-rules create allow-health-check-to-wsfc-nodes \
      --direction=INGRESS \
      --action=allow \
      --rules=tcp \
      --source-ranges=130.211.0.0/22,35.191.0.0/16 \
      --target-tags=wsfc-node \
      --network=$VPC_NAME \
      --priority 10000
    

VM インスタンスを作成する

フェイルオーバー クラスタ用に 2 つの VM インスタンスをデプロイします。どの時点においても、これらの VM の 1 つが SQL Server データベースのプライマリ レプリカをホストし、もう一方がセカンダリ レプリカをホストします。2 つの VM インスタンスは、次の条件を満たしている必要があります。

  • 内部パススルー ネットワーク ロードバランサからアクセスできるように、同じリージョンに配置されている。
  • Windows Server フェイルオーバー クラスタリング(WSFC)と SQL Server がインストールされている。
  • Compute Engine の WSFC サポート(.external)が有効になっている。

SQL Server 2019 がプリインストールされた SQL Server プレミアム イメージを使用します。

多数決でフェイルオーバー シナリオのクォーラムを構成するには、ファイル共有監視として機能する 3 つ目の VM をデプロイします。

  1. 既存の Cloud Shell セッションに戻ります。
  2. WSFC ノード用の専用スクリプトを作成します。このスクリプトは、必要な Windows 機能をインストールし、WSFC と SQL Server 用のファイアウォール ルールを作成します。

    cat << "EOF" > specialize-node.ps1
    
    $ErrorActionPreference = "stop"
    
    # Install required Windows features
    Install-WindowsFeature Failover-Clustering -IncludeManagementTools
    Install-WindowsFeature RSAT-AD-PowerShell
    
    # Open firewall for WSFC
    netsh advfirewall firewall add rule name="Allow SQL Server health check" dir=in action=allow protocol=TCP localport=59997
    
    # Open firewall for SQL Server
    netsh advfirewall firewall add rule name="Allow SQL Server" dir=in action=allow protocol=TCP localport=1433
    
    # Open firewall for SQL Server replication
    netsh advfirewall firewall add rule name="Allow SQL Server replication" dir=in action=allow protocol=TCP localport=5022
    
    # Format data disk
    Get-Disk |
     Where partitionstyle -eq 'RAW' |
     Initialize-Disk -PartitionStyle MBR -PassThru |
     New-Partition -AssignDriveLetter -UseMaximumSize |
     Format-Volume -FileSystem NTFS -NewFileSystemLabel 'Data' -Confirm:$false
    
    # Create data and log folders for SQL Server
    md d:\Data
    md d:\Logs
    EOF
    
  3. VM インスタンスを作成します。WSFC ノードとして機能する 2 つの VM で、追加のデータディスクをアタッチして、メタデータキー enable-wsfctrue に設定し、Windows Server フェイルオーバー クラスタリングを有効にします。

    REGION=$(gcloud config get-value compute/region)
    PD_SIZE=200
    MACHINE_TYPE=n2-standard-8
    
    gcloud compute instances create node-1 \
      --zone $REGION-a \
      --machine-type $MACHINE_TYPE \
      --subnet $SUBNET_NAME \
      --image-family sql-ent-2019-win-2019 \
      --image-project windows-sql-cloud \
      --tags wsfc,wsfc-node \
      --boot-disk-size 50 \
      --boot-disk-type pd-ssd \
      --boot-disk-device-name "node-1" \
      --create-disk=name=node-1-datadisk,size=$PD_SIZE,type=pd-ssd,auto-delete=no \
      --metadata enable-wsfc=true \
      --metadata-from-file=sysprep-specialize-script-ps1=specialize-node.ps1
    
    gcloud compute instances create node-2 \
      --zone $REGION-b \
      --machine-type $MACHINE_TYPE \
      --subnet $SUBNET_NAME \
      --image-family sql-ent-2019-win-2019 \
      --image-project windows-sql-cloud \
      --tags wsfc,wsfc-node \
      --boot-disk-size 50 \
      --boot-disk-type pd-ssd \
      --boot-disk-device-name "node-2" \
      --create-disk=name=node-2-datadisk,size=$PD_SIZE,type=pd-ssd,auto-delete=no \
      --metadata enable-wsfc=true \
      --metadata-from-file=sysprep-specialize-script-ps1=specialize-node.ps1
    
    gcloud compute instances create "witness" \
      --zone $REGION-c \
      --machine-type n2-standard-2 \
      --subnet $SUBNET_NAME \
      --image-family=windows-2019 \
      --image-project=windows-cloud \
      --tags wsfc \
      --boot-disk-size 50 \
      --boot-disk-type pd-ssd \
      --metadata sysprep-specialize-script-ps1="add-windowsfeature FS-FileServer"
    
  4. 3 つの VM インスタンスを Active Directory に参加させるには、3 つの各 VM インスタンスに対して次の操作を行います。

    1. シリアルポートの出力を表示して、VM の初期化プロセスをモニタリングします。

      gcloud compute instances tail-serial-port-output NAME
      

      NAME は VM インスタンスの名前に置き換えます。

      Instance setup finished という出力が表示されるまで 3 分ほど待ちます。表示されたら Ctrl+C キーを押します。この時点で、VM インスタンスが使用できるようになります。

    2. VM インスタンスにユーザー名とパスワードを作成します。

    3. リモート デスクトップを使用して VM に接続し、前のステップで作成したユーザー名とパスワードを使用してログインします。

    4. [スタート] ボタンを右クリックするか Win + X を押して、[Windows PowerShell(管理者)] をクリックします。

    5. 特権昇格を確認するプロンプトが表示されたら [はい] をクリックします。

    6. コンピュータを Active Directory ドメインに追加して再起動します。

      Add-Computer -Domain DOMAIN -Restart
      

      DOMAIN は、Active Directory ドメインの DNS 名に置き換えます。

      再起動が完了するまで 1 分ほど待ちます。

クラスタの IP アドレスを予約する

VPC 内に 2 つの静的 IP アドレスを予約します。1 つは WSFC クラスタの IP アドレスとして使用され、もう 1 つの IP アドレスは内部ロードバランサで使用されます。

  1. 内部ロードバランサ用に静的 IP を予約し、そのアドレスを LOADBALANCER_ADDRESS という新しい環境変数でキャプチャします。

    gcloud compute addresses create wsfc \
      --subnet $SUBNET_NAME \
      --region $(gcloud config get-value compute/region)
    
    LOADBALANCER_ADDRESS=$(gcloud compute addresses describe wsfc \
      --region $(gcloud config get-value compute/region) \
      --format=value\(address\)) && \
    echo "Load Balancer IP: $LOADBALANCER_ADDRESS"
    

    後で必要になるため、IP アドレスをメモします。

  2. クラスタ IP として使用する別の静的 IP アドレスを予約します。

    gcloud compute addresses create wsfc-cluster \
      --subnet $SUBNET_NAME \
      --region $(gcloud config get-value compute/region) && \
    CLUSTER_ADDRESS=$(gcloud compute addresses describe wsfc-cluster \
        --region $(gcloud config get-value compute/region) \
        --format=value\(address\)) && \
    echo "Cluster IP: $CLUSTER_ADDRESS"
    

    後で必要になるため、IP アドレスをメモします。

これで、プロジェクトと VPC を WSFC と SQL Server にデプロイする準備が整いました。

フェイルオーバー クラスタのデプロイ

次に、VM インスタンスを使用して WSFC と SQL Server をデプロイします。

SQL Server の準備

Active Directory で SQL Server に新しいユーザー アカウントを作成します。

  1. リモート デスクトップを使用して、node-1 に接続します。ドメイン ユーザー アカウントでログインします。
  2. [スタート] ボタンを右クリックするか Win + X を押して、[Windows PowerShell(管理者)] をクリックします。
  3. 特権昇格を確認するプロンプトが表示されたら [はい] をクリックします。
  4. SQL サーバーと SQL エージェントのドメイン ユーザー アカウントを作成し、パスワードを割り当てます。

    $Credential = Get-Credential -UserName sql_server -Message 'Enter password'
    New-ADUser `
      -Name "sql_server" `
      -Description "SQL Admin account." `
      -AccountPassword $Credential.Password `
      -Enabled $true -PasswordNeverExpires $true
    

SQL Server を構成するには、node-1node-2 の両方で次の操作を行います。

  1. [スタート] ボタンを右クリックするか Win + X を押して、[Windows PowerShell(管理者)] をクリックします。

    ホスト名と一致するように、SQL Server インスタンスの名前を変更します。

    Invoke-Sqlcmd -Query "
      sp_dropserver 'INST-INSTALL-SQ';
      GO
      sp_addserver '$env:computername', local;
      GO"
    Restart-Service -Name MSSQLSERVER
    
  2. SQL Server 構成マネージャーを開きます。

  3. ナビゲーション パネルで [SQL Server Services] を選択します。

  4. サービスのリストで [SQL Server(MSSQLSERVER)] を右クリックし、[プロパティ] を選択します。

  5. [ログオン] でアカウントを変更します。

    • アカウント名: DOMAIN\sql_serverDOMAIN は Active Directory ドメインの NetBIOS 名です。
    • パスワード: 前に選択したパスワードを入力します。
  6. [OK] をクリックします。

  7. SQL Server の再起動を求めるプロンプトが表示されたら、[はい] を選択します。

SQL Server がドメイン ユーザー アカウントで実行されるようになりました。

ファイル共有の作成

witness に 2 つのファイル共有を作成して、VM インスタンスが SQL Server のバックアップを保存し、ファイル共有監視として機能できるようにします。

  1. リモート デスクトップを使用して、witness に接続します。ドメイン ユーザー アカウントでログインします。
  2. [スタート] ボタンを右クリックするか Win + X を押して、[Windows PowerShell(管理者)] をクリックします。
  3. 特権昇格を確認するプロンプトが表示されたら [はい] をクリックします。
  4. 監視ファイル共有を作成し、自身と 2 つの WSFC ノードにファイル共有へのアクセス権を付与します。

    New-Item "C:\QWitness" –type directory
    
    icacls C:\QWitness\ /grant 'node-1$:(OI)(CI)(M)'
    icacls C:\QWitness\ /grant 'node-2$:(OI)(CI)(M)'
    
    New-SmbShare `
      -Name QWitness `
      -Path "C:\QWitness" `
      -Description "SQL File Share Witness" `
      -FullAccess $env:username,node-1$,node-2$
    
  5. 別のファイル共有を作成してバックアップを保存し、SQL Server に完全アクセス権を付与します。

    New-Item "C:\Backup" –type directory
    New-SmbShare `
      -Name Backup `
      -Path "C:\Backup" `
      -Description "SQL Backup" `
      -FullAccess  $env:USERDOMAIN\sql_server
    

WSFC をデプロイする

ここでは、フェイルオーバー クラスタを作成します。

  1. node-1 のリモート デスクトップ セッションに戻ります。
  2. [スタート] ボタンを右クリックするか Win + X を押して、[Windows PowerShell(管理者)] をクリックします。
  3. 特権昇格を確認するプロンプトが表示されたら [はい] をクリックします。
  4. 新しいクラスタの作成

    New-Cluster `
      -Name sql-cluster `
      -Node node-1,node-2 `
      -NoStorage `
      -StaticAddress CLUSTER_ADDRESS
    

    CLUSTER_ADDRESS は、前に作成したクラスタ IP アドレスに置き換えます。

  5. witness の PowerShell セッションに戻り、クラスタの仮想コンピュータ オブジェクトにファイル共有へのアクセス権限を付与します。

    icacls C:\QWitness\ /grant 'sql-cluster$:(OI)(CI)(M)'
    Grant-SmbShareAccess `
      -Name QWitness `
      -AccountName 'sql-cluster$' `
      -AccessRight Full `
      -Force
    
  6. node-1 の PowerShell セッションに戻り、witness のファイル共有をクラスタ クォーラムとして使用するようにクラスタを構成します。

    Set-ClusterQuorum -FileShareWitness \\witness\QWitness
    
  7. クラスタが正常に作成されたことを確認します。

    Test-Cluster
    

    次のような警告が表示される場合がありますが、無視して問題ありません。

    WARNING: System Configuration - Validate All Drivers Signed: The test reported some warnings..
    WARNING: Network - Validate Network Communication: The test reported some warnings..
    WARNING:
    Test Result:
    HadUnselectedTests, ClusterConditionallyApproved
    Testing has completed for the tests you selected. You should review the warnings in the Report.  A cluster solution is
    supported by Microsoft only if you run all cluster validation tests, and all tests succeed (with or without warnings).
    

    cluadmin.msc を実行してフェイルオーバー クラスタ マネージャー MMC スナップインを起動し、クラスタの正常性を確認することもできます。

  8. Managed AD を使用している場合は、WSFC が使用するコンピュータ アカウントを Cloud Service Domain Join Accounts グループに追加して、コンピュータをドメインに参加させることができるようにします。

    Add-ADGroupMember `
      -Identity "Cloud Service Domain Join Accounts" `
      -Members sql-cluster$
    
  9. 両方のノードで AlwaysOn 可用性グループを有効にします。

    Enable-SqlAlwaysOn -ServerInstance node-1 -Force
    Enable-SqlAlwaysOn -ServerInstance node-2 -Force
    

可用性グループの作成

サンプル データベース bookshelf を作成し、bookshelf-ag という名前の新しい可用性グループに組み込み、高可用性を構成します。

データベースの作成

新しいデータベースを作成します。このチュートリアルでは、データベースにデータが含まれている必要はありません。

  1. node-1 のリモート デスクトップ セッションに戻ります。
  2. SQL Server Management Studio を開きます。
  3. [サーバーに接続] ダイアログで、サーバー名が NODE-1 に設定されていることを確認し、[接続] を選択します。
  4. メニューで [File] > [New] > [Query with current connection] を選択します。
  5. 次の SQL スクリプトをエディタに貼り付けます。

    -- Create a sample database
    CREATE DATABASE bookshelf ON PRIMARY (
      NAME = 'bookshelf',
      FILENAME='d:\Data\bookshelf.mdf',
      SIZE = 256MB,
      MAXSIZE = UNLIMITED,
      FILEGROWTH = 256MB)
    LOG ON (
      NAME = 'bookshelf_log',
      FILENAME='d:\Logs\bookshelf.ldf',
      SIZE = 256MB,
      MAXSIZE = UNLIMITED,
      FILEGROWTH = 256MB)
    GO
    
    USE [bookshelf]
    SET ANSI_NULLS ON
    SET QUOTED_IDENTIFIER ON
    GO
    
    -- Create sample table
    CREATE TABLE [dbo].[Books] (
      [Id] [bigint] IDENTITY(1,1) NOT NULL,
      [Title] [nvarchar](max) NOT NULL,
      [Author] [nvarchar](max) NULL,
      [PublishedDate] [datetime] NULL,
      [ImageUrl] [nvarchar](max) NULL,
      [Description] [nvarchar](max) NULL,
      [CreatedById] [nvarchar](max) NULL,
      CONSTRAINT [PK_dbo.Books] PRIMARY KEY CLUSTERED ([Id] ASC) WITH (
        PAD_INDEX = OFF,
        STATISTICS_NORECOMPUTE = OFF,
        IGNORE_DUP_KEY = OFF,
        ALLOW_ROW_LOCKS = ON,
        ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    
    -- Create a backup
    EXEC dbo.sp_changedbowner @loginame = 'sa', @map = false;
      ALTER DATABASE [bookshelf] SET RECOVERY FULL;
      GO
      BACKUP DATABASE bookshelf to disk = '\\witness\Backup\bookshelf.bak' WITH INIT
    GO
    

    このスクリプトは、1 つのテーブルで新しいデータベースを作成し、witness への初期バックアップを実行します。

  6. [Execute] を選択して SQL スクリプトを実行します。

高可用性の構成

  1. [Object Explorer] ウィンドウで、[Always On High Availability] を右クリックし、[New Availability Group Wizard] を選択します。
  2. [Specify Options] ページで、可用性グループ名を bookshelf-ag に設定し、[次へ] を選択します。
  3. [Select Databases] ページで、bookshelf データベースを選択し、[Next] を選択します。
  4. [Specify Replicas] ページで、[Replicas] タブを選択します。

    1. [Add replica] を選択します。
    2. [Connect to server] ダイアログで、サーバー名として「node-2」と入力し、[Connect] を選択します。

      可用性レプリカのリストに SQL Server インスタンス node-1node-2 が追加されました。

    3. 両方のインスタンスの可用性モードを [Synchrounous commit] に設定します。

    4. 両方のインスタンスで、自動フェイルオーバーを [Enabled] に設定します。

    5. [Listener] タブを選択します。

      1. [Create an availability group listener] を選択します。
      2. 次の設定を入力します。

        • リスナーの DNS 名: bookshelf
        • ポート: 1433
        • ネットワーク モード: Static IP
      3. [Add] を選択し、前に作成したロードバランサの IP アドレスを入力します。次に、[OK] を選択します。

    6. [Next] を選択します。

  5. [Select Data Synchronization] ページで、[Automatic Seeding] を選択します。

  6. [Validation] ページで、すべてのチェックが成功したことを確認します。

  7. [Summary] ページで、[Finish] を選択します。

  8. [Results] ページで、[Close] を選択します。

ヘルスチェックを構成する

最後の手順として、内部ロードバランサで使用可能なヘルスチェック エンドポイントを公開するようにクラスタを構成します。

  1. node-1 の PowerShell セッションに戻ります。
  2. ロードバランサの IP アドレスを使用して変数を初期化します。

    $LoadBalancerIP = 'IP_ADDRESS'
    

    IP_ADDRESS は、前に予約した wsfc アドレスの IP アドレスに置き換えます。

  3. ヘルスチェック サービスに応答するようにフェイルオーバー クラスタを構成します。

    $SqlIpAddress = Get-ClusterResource |
      Where-Object {$_.ResourceType -eq "IP Address"} |
      Where-Object {$_.Name.StartsWith("bookshelf")}
    
    $SqlIpAddress | Set-ClusterParameter -Multiple @{
     'Address'= $LoadBalancerIP;
     'ProbePort'= 59997;
     'SubnetMask'='255.255.255.255';
     'Network'= (Get-ClusterNetwork).Name;
     'EnableDhcp'=0; }
    
  4. クラスタ リソースを再起動します。

    $SqlIpAddress | Stop-ClusterResource
    $SqlIpAddress | Start-ClusterResource
    

内部ロードバランサを作成する

SQL Server クライアントに単一のエンドポイントを指定するため、内部ロードバランサをデプロイします。ロードバランサはヘルスチェックを使用して、トラフィックが WSFC のアクティブ ノードに転送されるかどうかを確認します。

  1. 既存の Cloud Shell セッションに戻ります。
  2. 非マネージド インスタンス グループを 2 つ(各ゾーンに 1 つ)作成し、2 つのノードをグループに追加します。

    REGION=$(gcloud config get-value compute/region)
    
    gcloud compute instance-groups unmanaged create wsfc-group-1 --zone $REGION-a
    gcloud compute instance-groups unmanaged add-instances wsfc-group-1 --zone $REGION-a \
      --instances node-1
    
    gcloud compute instance-groups unmanaged create wsfc-group-2 --zone $REGION-b
    gcloud compute instance-groups unmanaged add-instances wsfc-group-2 --zone $REGION-b \
      --instances node-2
    
  3. ロードバランサがアクティブ ノードの判別に使用できるヘルスチェックを作成します。

    gcloud compute health-checks create tcp wsfc-healthcheck \
      --check-interval="2s" \
      --healthy-threshold=1 \
      --unhealthy-threshold=2 \
      --port=59997 \
      --timeout="1s"
    

    ヘルスチェック プローブのポート 59997 は、可用性グループ リスナー用に以前に ProbePort として構成したポートです。

  4. バックエンド サービスを作成し、2 つのインスタンス グループを追加します。

    gcloud compute backend-services create wsfc-backend \
      --load-balancing-scheme internal \
      --region $(gcloud config get-value compute/region) \
      --health-checks wsfc-healthcheck \
      --protocol tcp
    
    gcloud compute backend-services add-backend wsfc-backend \
      --instance-group wsfc-group-1 \
      --instance-group-zone $REGION-a \
      --region $REGION
    
    gcloud compute backend-services add-backend wsfc-backend \
      --instance-group wsfc-group-2 \
      --instance-group-zone $REGION-b \
      --region $REGION
    
  5. 内部ロードバランサを作成します。

    gcloud compute forwarding-rules create wsfc-sql \
      --load-balancing-scheme internal \
      --address $LOADBALANCER_ADDRESS \
      --ports 1433 \
      --network $VPC_NAME \
      --subnet $SUBNET_NAME \
      --region $REGION \
      --backend-service wsfc-backend
    

これで、内部ロードバランサと DNS 名 bookshelf を使用して SQL Server 可用性グループ リスナーに接続できるようになりました。

1 つのフェイルオーバー クラスタに複数の可用性グループを作成するには、可用性グループごとに独自のヘルスチェックを行う別のロードバランサを使用する必要があります。つまり、可用性グループごとに次のものが必要です。

  1. リスナーと内部ロードバランサに使用される予約済みの内部 IP アドレス(可用性グループごとに 1 つ)。

  2. 前の手順で予約された独自の IP アドレスを持つ個別のロードバランサ(可用性グループごとに 1 つ)。

  3. 個別のプローブポート(可用性グループごとに 59997、59998 など)と、これらのプローブポート上のトラフィックを許可するファイアウォール ルール。

  4. それぞれのプローブポートを使用する、可用性グループごとに個別のヘルスチェック ルール。

フェイルオーバーのテスト

これで、フェイルオーバーが想定どおりに機能するかどうかをテストする準備が整いました。

  1. witness の PowerShell セッションに戻ります。
  2. 次のスクリプトを実行します。

    while ($True){
      $Conn = New-Object System.Data.SqlClient.SqlConnection
      $Conn.ConnectionString = "Server=bookshelf;Integrated Security=true;Initial Catalog=master"
      $Conn.Open()
    
      $Cmd = New-Object System.Data.SqlClient.SqlCommand
      $Cmd.Connection = $Conn
      $Cmd.CommandText = "SELECT @@SERVERNAME"
    
      $Adapter = New-Object System.Data.SqlClient.SqlDataAdapter $Cmd
      $Data = New-Object System.Data.DataSet
      $Adapter.Fill($Data) | Out-Null
      $Data.Tables[0] + (Get-Date -Format "MM/dd/yyyy HH:mm:ss")
    
      Start-Sleep -Seconds 2
    }
    

    このスクリプトは、2 秒ごとに可用性グループ リスナーを使用して SQL Server に接続し、サーバー名を照会します。

    スクリプトを実行したままにします。

  3. node-1 のリモート デスクトップ セッションに戻り、フェイルオーバーをトリガーします。

    1. SQL Server Management Studio で、[Always On High Availability] > [Availability Groups] > [bookshelf-ag (Primary)] に移動し、ノードを右クリックします。
    2. [Failover] を選択します。
    3. [Select new primary replica] ページで、node-2 が新しいプライマリ レプリカとして選択され、[Failover readiness] 列に No data loss が表示されていることを確認します。[Next] を選択します。
    4. [Connect to replica] ページで、[Connect] を選択します。
    5. [Connect to server] ダイアログで、サーバー名が node-2 であることを確認し、[Connect] をクリックします。
    6. [Next]、[Finish] の順に選択します。
    7. [Results] ページで、フェイルオーバーが成功したことを確認します。
  4. witness の PowerShell セッションに戻ります。

  5. 実行中のスクリプトの出力を確認して、フェイルオーバーの結果として、サーバー名が node-1 から node-2 に変更されたことを確認します。

  6. Ctrl+C を押してスクリプトを停止します。

クリーンアップ

チュートリアルが終了したら、作成したリソースをクリーンアップして、割り当ての使用を停止し、課金されないようにできます。次のセクションで、リソースを削除または無効にする方法を説明します。

プロジェクトの削除

課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除するには:

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ