内部ロードバランサを使用して同期 commit を使用する SQL Server Always On 可用性グループを構成する


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

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

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

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

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

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

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

オンプレミスの Windows クラスタ環境では、Address Resolution Protocol(ARP)通知によってIP アドレスのフェイルオーバーがトリガーされます。ただし、Google Cloudは ARP の発表を無視します。そのため、内部ロードバランサと分散ネットワーク名(DNN)を使用する次の 2 つのオプションのいずれかを実装する必要があります。

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

SQL Server Always On 可用性グループを使用して、サンプル データベース bookshelf が、2 つの SQL Server インスタンス間で同期的に複製されます。内部ロードバランサは、トラフィックがアクティブ ノードに転送されるようにします。

内部ロードバランサを使用した Windows Server フェイルオーバー クラスタリングの詳細については、フェイルオーバー クラスタリングをご覧ください。

アーキテクチャ

この図には次のものが含まれています。

  • 同じリージョン内の 2 つの VM インスタンスと、node-1node-2 という名前の異なるゾーンのフェイルオーバー クラスタ。1 つは SQL Server データベースのプライマリ レプリカをホストし、もう一方はセカンダリ レプリカをホストします。
  • witness という 3 つ目の VM は、ファイル共有監視として機能し、タイブレークの投票を行い、フェイルオーバーのクォーラムを達成します。
  • クラスタの前に配置された内部ロードバランサは、SQL Server クライアントに単一のエンドポイントを提供し、ヘルスチェックを使用してトラフィックがアクティブ ノードに転送されるようにします。

目標

このチュートリアルは、次の目標を達成することを目的としています。

料金

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

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

始める前に

このチュートリアルのタスクを完了するには、次のことを確認してください。

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. ドメイン コントローラが 1 つ以上配置された Active Directory ドメイン。Managed Microsoft AD を使用して Active Directory ドメインを作成できます。または、Compute Engine にカスタムの Active Directory 環境をデプロイして、DNS クエリをドメイン コントローラに転送するプライベート DNS 転送ゾーンを設定することもできます。
  7. コンピュータをドメインに参加させ、RDP を使用してログインする権限を付与された Active Directory ユーザーが存在する。Managed Microsoft AD を使用している場合は、setupadmin ユーザーを使用できます。Active Directory ユーザー アカウントのプロビジョニングの詳細については、Active Directory ユーザー アカウントのプロビジョニングをご覧ください。
  8. Google Cloud プロジェクトと、Active Directory ドメイン コントローラに接続する Virtual Private Cloud(VPC)。
  9. Windows Server フェイルオーバー クラスタ VM インスタンスに使用するサブネット。
このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳しくは、クリーンアップをご覧ください。

プロジェクトとネットワークを準備する

SQL Server Always On 可用性グループをデプロイするには、デプロイ用にGoogle Cloud プロジェクトと VPC を準備する必要があります。以降のセクションでは、この方法について詳しく説明します。

プロジェクトとリージョンを構成する

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

  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 に接続し、クラスタノード間で通信できるようにするには、いくつかのファイアウォール ルールを作成する必要があります。ネットワーク タグを使用すると、次のようにこれらのファイアウォール ルールの作成を簡素化できます。

  • 2 つのクラスタノードには、wsfc-node タグが付加されます。
  • すべてのサーバー(witness を含む)には、wsfc タグが付加されます。

これらのネットワーク タグを使用するファイアウォール ルールを作成するには、次の手順を行います。

  1. 既存の Cloud Shell セッションに戻ります。
  2. クラスタノード間のトラフィックを許可するファイアウォール ルールを作成します。

    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
    

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

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

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

SQL Server 2022 がプリインストールされた 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 WSFC health check" dir=in action=allow protocol=TCP localport=59998
    
    # 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 インスタンスを作成します。クラスタノードとして機能する 2 つの VM で、追加のデータディスクをアタッチし、メタデータキー enable-wsfctrue に設定して Windows Server フェイルオーバー クラスタリングを有効にします。

    REGION=$(gcloud config get-value compute/region)
    ZONE1=ZONE1
    ZONE2=ZONE2
    ZONE3=ZONE3
    PD_SIZE=200
    MACHINE_TYPE=n2-standard-8
    
    gcloud compute instances create node-1 \
      --zone $ZONE1 \
      --machine-type $MACHINE_TYPE \
      --subnet $SUBNET_NAME \
      --image-family sql-ent-2022-win-2022 \
      --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 $ZONE2 \
      --machine-type $MACHINE_TYPE \
      --subnet $SUBNET_NAME \
      --image-family sql-ent-2022-win-2022 \
      --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 $ZONE3 \
      --machine-type e2-medium \
      --subnet $SUBNET_NAME \
      --image-family=windows-2022 \
      --image-project=windows-cloud \
      --tags wsfc \
      --boot-disk-size 50 \
      --boot-disk-type pd-ssd \
      --metadata sysprep-specialize-script-ps1="add-windowsfeature FS-FileServer"
    

    使用しているゾーンに応じて、ZONE1ZONE2ZONE3 を置き換えます。

  4. 3 つの VM インスタンスを Active Directory に参加させるには、3 つの各 VM インスタンスに対して次の操作を行います。

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

      gcloud compute instances tail-serial-port-output NAME
      

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

      Instance setup finished という出力が表示されるまで数分待ちます。表示されたら 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 名に置き換えます。

    7. VM をドメインに参加させる権限を持つアカウントの認証情報を入力します。

      VM が再起動するまで待ちます。VM インスタンスが Active Directory に参加しました。

静的 IP アドレスを予約する

VPC 内に 2 つの静的 IP アドレスを予約します。1 つの IP アドレスはデフォルトの WSFC クラスタ IP アドレスとして使用され、もう 1 つの IP アドレスは SQL Server 可用性グループ リスナーの静的 IP として機能します。

WSFC クラスタでは、クラスタ IP アドレスは主に管理目的とクラスタ リソースへのアクセスに使用されます。この仮想 IP アドレスはクラスタ自体に割り当てられます。これにより、管理者はクラスタを管理し、クラスタ設定の構成、ノードの状態のモニタリング、フェイルオーバー プロセスの管理などのタスクを実行できます。

SQL Server 可用性グループのコンテキストでは、リスナーは仮想ネットワーク名(VNN)と IP アドレスであり、クライアントがプライマリ ノードである特定のサーバーを知らなくても可用性グループに接続できるようにします。

内部ロードバランサは、内部トラフィックを効率的にルーティングし、WSFC クラスタのコンテキストで高可用性とロード バランシングをサポートするために、内部 IP アドレスが必要です。内部ロードバランサにより、リクエストは常にクラスタの現在のプライマリ レプリカに転送されます。フェイルオーバー イベント中に、ロードバランサはプライマリ レプリカの変更を検出し、手動操作を必要とせずにクライアント接続を新しいプライマリにリダイレクトします。これにより、ダウンタイムを最小限に抑え、データベース サービスの継続的な可用性を確保できます。

SQL Server Always On 可用性グループを使用する WSFC のコンテキストでは、デフォルトの WSFC クラスタ IP アドレスと可用性グループ リスナーの予約済みの内部静的 IP アドレスの両方が、関連する内部ロードバランサでも使用されます。

  1. VPC に 2 つの静的 IP アドレスを予約する手順は次のとおりです。

    gcloud compute addresses create wsfc-cluster-ip \
      --subnet $SUBNET_NAME \
      --region $(gcloud config get-value compute/region) && \
    CLUSTER_IP=$(gcloud compute addresses describe wsfc-cluster-ip \
        --region $(gcloud config get-value compute/region) \
        --format=value\(address\)) && \
    echo "cluster IP: $CLUSTER_IP"
    
  2. CLUSTER_IP 変数内のクラスタ IP アドレスを置き換えます。これは、後でクラスタ IP として指定するために必要になります。

    CLUSTER_IP=CLUSTER_IP
    
  3. アベイラビリティ グループ リスナー用に別の静的 IP を予約し、そのアドレスを LISTENER_IP という新しい環境変数でキャプチャします。

    gcloud compute addresses create wsfc-listener-ip \
      --subnet $SUBNET_NAME \
      --region $(gcloud config get-value compute/region)
    
    LISTENER_IP=$(gcloud compute addresses describe wsfc-listener-ip \
      --region $(gcloud config get-value compute/region) \
      --format=value\(address\)) && \
    echo "Listener IP: $LISTENER_IP"
    
  4. ロードバランサの予約済み IP アドレスを LISTENER_IP 変数に置き換えます。この変数は、後でアベイラビリティ グループを構成する際に必要になります。

    LISTENER_IP=LISTENER_IP
    

これで、プロジェクトと VPC を Windows Server フェイルオーバー クラスタと SQL Server にデプロイする準備が整いました。

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

これで、VM インスタンスを使用して Windows Server フェイルオーバー クラスタと 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. SQL Server 構成マネージャーを開きます。
  2. ナビゲーション パネルで [SQL Server Services] を選択します。
  3. サービスのリストで [SQL Server(MSSQLSERVER)] を右クリックし、[プロパティ] を選択します。
  4. [ログオン] でアカウントを次のように変更します。

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

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

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

ファイル共有を作成する

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

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

    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
    

フェイルオーバー クラスタを作成する

フェイルオーバー クラスタを作成する手順は次のとおりです。

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

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

    CLUSTER_IP は、前に作成したクラスタ 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 を使用している場合は、Windows クラスタで使用されるコンピュータ アカウントを Cloud Service Domain Join Accounts グループに追加して、コンピュータをドメインに参加させることができます。

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

    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. [実行] を選択して SQL スクリプトを実行します。

高可用性を構成する

T-SQL または SQL Server Management Studio を使用して、可用性グループの高可用性を構成できます。

T-SQL の使用

T-SQL を使用して可用性グループの高可用性を構成する手順は次のとおりです。

  1. node-1 に接続し、次のスクリプトを実行して、bookshelf-ag 可用性グループを作成します。

    CREATE LOGIN [NET_DOMAIN\sql_server] FROM WINDOWS;
    GO
    
    USE [bookshelf];
    CREATE USER [NET_DOMAIN\sql_server] FOR LOGIN [NET_DOMAIN\sql_server];
    GO
    
    USE [master];
    CREATE ENDPOINT bookshelf_endpoint
      STATE=STARTED
      AS TCP (LISTENER_PORT=5022)
      FOR DATABASE_MIRRORING (ROLE=ALL);
    GO
    
    GRANT CONNECT ON ENDPOINT::[bookshelf_endpoint] TO [NET_DOMAIN\sql_server]
    GO
    
  2. node-2 に接続し、次のスクリプトを実行します。

    CREATE LOGIN [NET_DOMAIN\sql_server] FROM WINDOWS;
    GO
    
    CREATE ENDPOINT bookshelf_endpoint
      STATE=STARTED
      AS TCP (LISTENER_PORT=5022)
      FOR DATABASE_MIRRORING (ROLE=ALL);
    GO
    
    GRANT CONNECT ON ENDPOINT::[bookshelf_endpoint] TO [NET_DOMAIN\sql_server]
    GO
    
  3. node-1 で次のスクリプトを実行して、bookshelf-ag 可用性グループを作成します。

    USE master;
    GO
    
    CREATE AVAILABILITY GROUP [bookshelf-ag]
    WITH (AUTOMATED_BACKUP_PREFERENCE = SECONDARY,
    CLUSTER_TYPE = WSFC,
    DB_FAILOVER = ON
    )
    FOR DATABASE [bookshelf]
    REPLICA ON
      N'node-1' WITH (
          ENDPOINT_URL = 'TCP://node-1:5022',
          AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
          FAILOVER_MODE = AUTOMATIC,
          BACKUP_PRIORITY = 50,
          SEEDING_MODE = AUTOMATIC,
          SECONDARY_ROLE(ALLOW_CONNECTIONS = NO)
      ),
      N'node-2' WITH (
          ENDPOINT_URL = 'TCP://node-2:5022',
          AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
          FAILOVER_MODE = AUTOMATIC,
          BACKUP_PRIORITY = 50,
          SEEDING_MODE = AUTOMATIC,
          SECONDARY_ROLE(ALLOW_CONNECTIONS = NO)
      );
    GO
    
  4. 次のスクリプトで、LISTENER_IP は、前に内部ロードバランサ用に予約した IP アドレスに置き換えて実行します。

    USE master;
    GO
    
    ALTER AVAILABILITY GROUP [bookshelf-ag]
    ADD LISTENER N'bookshelf' (
    WITH IP (
      (N'LISTENER_IP', N'255.255.255.0')
    ),
    PORT = 1433);
    GO
    
  5. node-2 に接続し、次のスクリプトを実行して、セカンダリ レプリカを可用性グループに結合し、自動シーディングを有効にします。

    USE master;
    GO
    
    ALTER AVAILABILITY GROUP [bookshelf-ag] JOIN;
    ALTER AVAILABILITY GROUP [bookshelf-ag] GRANT CREATE ANY DATABASE;
    
    
  6. 可用性グループのステータスを確認します。

    SELECT * FROM sys.dm_hadr_availability_group_states;
    GO
    

    synchronization_health_descHEALTHY として表示されます。

SQL Server Management Studio を使用する

SQL Server Management Studio を使用して可用性グループの高可用性を構成する手順は次のとおりです。

  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. [レプリカを追加] を選択します。
    2. [Connect to server] ダイアログで、サーバー名として「node-2」と入力し、[Connect] を選択します。

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

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

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

    5. [リスナー] タブを選択します。

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

        • リスナーの DNS 名: bookshelf
        • ポート: 1433
        • ネットワーク モード: Static IP
      3. [追加] を選択し、内部ロードバランサ用に予約したリスナー IP アドレス(LISTENER_IP)を入力します。次に、[OK] を選択します。

    6. [次へ] を選択します。

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

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

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

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

内部ロードバランサとヘルスチェックを作成する

クラスタ IP は、Windows フェイルオーバー クラスタの単一のエンドポイントを表します。管理目的とクラスタ リソースの管理に使用します。クラスタ IP は常に、クラスタのホスト(またはプライマリ)ノードを指します。トラフィックがクラスタのホストノードに転送されるようにするヘルスチェックを使用する内部ロードバランサをデプロイします。WSFC ツールリングでは、転送に複数のプロトコル(ICMP、UDP、TCP)を使用する必要があります。そのため、すべてのポートをサポートする複数のプロトコルを使用して内部ロードバランサをデプロイすることをおすすめします。

内部ロードバランサをデプロイする手順は次のとおりです。

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

    REGION=$(gcloud config get-value compute/region)
    
    gcloud compute instance-groups unmanaged create wsfc-group-1 --zone $ZONE1
    gcloud compute instance-groups unmanaged add-instances wsfc-group-1 --zone $ZONE1 \
      --instances node-1
    
    gcloud compute instance-groups unmanaged create wsfc-group-2 --zone $ZONE2
    gcloud compute instance-groups unmanaged add-instances wsfc-group-2 --zone $ZONE2 \
      --instances node-2
    
  3. ロードバランサが Windows クラスタの観点からアクティブ ノードを確認するために使用できるクラスタ IP のヘルスチェックを作成します。Compute Engine ゲスト エージェントがヘルスチェックに応答するデフォルト ポートは 59998 です。ヘルスチェックはリクエストでクラスタ IP アドレスを提供し、アクティブ ノードから返されるレスポンスとして 1 を想定します。

    gcloud compute health-checks create tcp wsfc-healthcheck \
      --request=$CLUSTER_IP \
      --response=1 \
      --check-interval="2s" \
      --healthy-threshold=2 \
      --unhealthy-threshold=2 \
      --port=59998 \
      --timeout="1s"
    
  4. バックエンド サービスを作成し、2 つの既存のインスタンス グループを追加します。

    gcloud compute backend-services create wsfc-backend \
      --load-balancing-scheme internal \
      --region $REGION \
      --health-checks wsfc-healthcheck \
      --protocol UNSPECIFIED
    
    gcloud compute backend-services add-backend wsfc-backend \
      --instance-group wsfc-group-1 \
      --instance-group-zone $ZONE1 \
      --region $REGION
    
    gcloud compute backend-services add-backend wsfc-backend \
      --instance-group wsfc-group-2 \
      --instance-group-zone $ZONE2 \
      --region $REGION
    
  5. クラスタ IP に関連付けられた内部ロードバランサを作成します。

    gcloud compute forwarding-rules create wsfc \
      --load-balancing-scheme internal \
      --address $CLUSTER_IP \
      --ports ALL \
      --network $VPC_NAME \
      --subnet $SUBNET_NAME \
      --region $REGION \
      --ip-protocol L3_DEFAULT \
      --backend-service wsfc-backend
    

bookshelf 可用性グループ内の任意のデータベースに接続する SQL Server クライアントに単一のエンドポイントを提供するには、その可用性グループ専用の新しい内部ロードバランサをデプロイします。手順は次のとおりです。

  1. ロードバランサが bookshelf SQL Server 可用性グループのプライマリ ノードを確認するために使用できる、可用性グループ リスナーのヘルスチェックを作成します。

    gcloud compute health-checks create tcp wsfc-bookshelf-healthcheck \
      --request=$LISTENER_IP \
      --response=1 \
      --check-interval="2s" \
      --healthy-threshold=1 \
      --unhealthy-threshold=2 \
      --port=59998 \
      --timeout="1s"
    

    ヘルスチェックは同じ Compute Engine ゲスト エージェント ポートを使用しますが、リクエストで bookshelf アベイラビリティ グループのリスナー IP アドレスを提供します。

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

    gcloud compute backend-services create wsfc-bookshelf-backend \
      --load-balancing-scheme internal \
      --region $REGION \
      --health-checks wsfc-bookshelf-healthcheck \
      --protocol UNSPECIFIED
    
    gcloud compute backend-services add-backend wsfc-bookshelf-backend \
      --instance-group wsfc-group-1 \
      --instance-group-zone $ZONE1 \
      --region $REGION
    
    gcloud compute backend-services add-backend wsfc-bookshelf-backend \
      --instance-group wsfc-group-2 \
      --instance-group-zone $ZONE2 \
      --region $REGION
    
  3. SQL Server bookshelf-ag 可用性グループ リスナーに関連付けられた内部ロードバランサを作成します。

    gcloud compute forwarding-rules create wsfc-bookshelf \
      --load-balancing-scheme internal \
      --address $LISTENER_IP \
      --ports ALL \
      --network $VPC_NAME \
      --subnet $SUBNET_NAME \
      --region $REGION \
      --ip-protocol L3_DEFAULT \
      --backend-service wsfc-bookshelf-backend
    

これで、DNS 名 bookshelf と、bookshelf 可用性グループ リスナーで定義されたポートを使用して、SQL Server 可用性グループ リスナーに接続できるようになりました。内部ロードバランサは、bookshelf 可用性グループのプライマリ ノードにトラフィックを転送します。

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

各アベイラビリティ グループでプライマリとして指定されるノードは異なる場合があります。また、Windows クラスタのホストノードとは異なる場合があります。複数の可用性グループの場合は、次のものが必要です。

  • 内部ロードバランサが使用する可用性グループ リスナーの予約済み静的 IP アドレス。可用性グループごとに 1 つのアドレスを予約します。

  • 可用性グループごとに個別のヘルスチェック ルール。ヘルスチェックのリクエストは、可用性グループ リスナーの静的 IP アドレス(前の手順で予約した IP アドレス)を提供します。ヘルスチェックは、GCE エージェントから返されたレスポンス 1 をプローブします。すべてのヘルスチェックでポート 59998 が使用されます。

  • 既存の 2 つのコンピューティング インスタンス グループを追加する可用性グループごとに個別のバックエンド サービス。バックエンド サービスは、前の手順で定義したヘルスチェックを使用します。

  • 前の手順で作成したバックエンド サービスの可用性グループごとに内部ロードバランサ。ロードバランサは、アベイラビリティ グループ リスナーの静的 IP アドレスに関連付けられています。

フェイルオーバーをテストする

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

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

    while ($True){
      $Conn = New-Object System.Data.SqlClient.SqlConnection
      $Conn.ConnectionString = "Server=tcp:bookshelf,1433;Integrated Security=true;Initial Catalog=master"
      $Conn.Open()
    
      $Cmd = New-Object System.Data.SqlClient.SqlCommand
      $Cmd.Connection = $Conn
      $Cmd.CommandText = "SELECT SERVERPROPERTY('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
    }
    

    このガイドでは、サーバー定義 tcp:bookshelf,1433 の可用性グループ リスナーに DNS 名 bookshelf とポート値 1433 を使用しました。

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

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

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

    1. SQL Server Management Studio で、[Always On High Availability] > [Availability Groups] > [bookshelf-ag (Primary)] に移動し、ノードを右クリックします。
    2. [フェイルオーバー] を選択します。
    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. [結果] ページで、フェイルオーバーが成功したことを確認します。
  4. witness の PowerShell セッションに戻ります。

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

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

クリーンアップ

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

プロジェクトの削除

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

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

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

次のステップ