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-1 と node-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 のアナウンスメントを無視します。そのため、2 つのオプション、内部ロードバランサの使用、または分散ネットワーク名(DNN)の使用のいずれかを実装する必要があります。
この記事は、 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-1とnode-2という名前の異なるゾーンのフェイルオーバー クラスタ。1 つは SQL Server データベースのプライマリ レプリカをホストし、もう一方はセカンダリ レプリカをホストします。
- witnessという 3 つ目の VM は、ファイル共有監視として機能し、多数決でフェイルオーバーのクォーラムを達成します。
- クラスタの前に配置された内部ロードバランサは、SQL Server クライアントに単一のエンドポイントを提供し、ヘルスチェックを使用してトラフィックがアクティブ ノードに転送されるようにします。
目標
このチュートリアルは、次の目標を達成することを目的としています。
費用
このチュートリアルでは、以下を含む、 Google Cloudの課金対象となるコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。
始める前に
このチュートリアルのタスクを完了するには、次のことを確認してください。
- 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.
- 
    
    
      In the Google Cloud console, on the project selector page, select or create a Google Cloud project. Roles required to select or create a project - Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
- 
      Create a project: To create a project, you need the Project Creator
      (roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
 
- 
  
    Verify that billing is enabled for your Google Cloud project. 
- 
    
    
      In the Google Cloud console, on the project selector page, select or create a Google Cloud project. Roles required to select or create a project - Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
- 
      Create a project: To create a project, you need the Project Creator
      (roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
 
- 
  
    Verify that billing is enabled for your Google Cloud project. 
- ドメイン コントローラが 1 つ以上配置された Active Directory ドメインがある。Managed Microsoft AD を使用して Active Directory ドメインを作成できる。または、Compute Engine にカスタムの Active Directory 環境をデプロイして、DNS クエリをドメイン コントローラに転送するプライベート DNS 転送ゾーンを設定できる。
- 
    コンピュータをドメインに参加させ、RDP を使用してログインする権限を付与された Active Directory ユーザーが存在する。Managed Microsoft AD を使用している場合は、setupadminユーザーを使用できます。Active Directory ユーザー アカウントのプロビジョニングの詳細については、Active Directory ユーザー アカウントのプロビジョニングをご覧ください。
- Google Cloud プロジェクトと、Active Directory ドメイン コントローラに接続する Virtual Private Cloud(VPC)。
- Windows Server フェイルオーバー クラスタ VM インスタンスに使用するサブネット。 このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳しくは、クリーンアップをご覧ください。
プロジェクトとネットワークを準備する
SQL Server Always On 可用性グループをデプロイするには、デプロイ用にGoogle Cloud プロジェクトと VPC を準備する必要があります。以降のセクションでは、この方法について詳しく説明します。
プロジェクトとリージョンを構成する
SQL Server Always On 可用性グループをデプロイするために Google Cloud プロジェクトを準備するには、次の操作を行います。
- Google Cloud コンソールで、[Cloud Shell をアクティブにする] - ボタンをクリックして Cloud Shell を開きます。 
- 次の変数を初期化します。 - VPC_NAME= - VPC_NAMESUBNET_NAME=- SUBNET_NAME- 次のように置き換えます。 - VPC_NAME: VPC の名前
- SUBNET_NAME: サブネットの名前
 
- デフォルトのプロジェクト ID を設定します。 - gcloud config set project - PROJECT_ID- PROJECT_IDは、 Google Cloud プロジェクトの ID に置き換えます。
- デフォルトのリージョンを設定します。 - gcloud config set compute/region - REGION- REGIONは、デプロイするリージョンの ID に置き換えます。
ファイアウォール ルールを作成する
クライアントが SQL Server に接続し、クラスタノード間で通信できるようにするには、いくつかのファイアウォール ルールを作成する必要があります。ネットワーク タグを使用すると、次のようにファイアウォール ルールの作成を簡素化できます。
- 2 つのクラスタノードには、wsfc-nodeタグが付加されます。
- witnessを含め、すべてのサーバーに- wsfcタグが付けられます。
これらのネットワーク タグを使用するファイアウォール ルールを作成するには、次の手順を行います。
- 既存の Cloud Shell セッションに戻ります。
- クラスタノード間のトラフィックを許可するファイアウォール ルールを作成します。 - 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 をデプロイします。
- 既存の Cloud Shell セッションに戻ります。
- 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 
- VM インスタンスを作成します。クラスタノードとして機能する 2 つの VM で、追加のデータディスクをアタッチして、メタデータキー - enable-wsfcを- trueに設定し、Windows Server フェイルオーバー クラスタリングを有効にします。- REGION=$(gcloud config get-value compute/region) ZONE1= - ZONE1ZONE2=- ZONE2ZONE3=- ZONE3PD_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"- 使用しているゾーンに応じて、ZONE1、ZONE2、ZONE3 を置き換えます。 
- 3 つの VM インスタンスを Active Directory に参加させるには、3 つの各 VM インスタンスに対して次の操作を行います。 - シリアルポートの出力を表示して、VM の初期化プロセスをモニタリングします。 - gcloud compute instances tail-serial-port-output - NAME- NAMEは VM インスタンスの名前に置き換えます。- Instance setup finishedという出力が表示されるまで数分待ちます。表示されたら Ctrl+C キーを押します。この時点で、VM インスタンスが使用できるようになります。
- VM インスタンスにユーザー名とパスワードを作成します。 
- リモート デスクトップを使用して VM に接続し、前のステップで作成したユーザー名とパスワードを使用してログインします。 
- [スタート] ボタンを右クリックするか Win + X を押して、[Windows PowerShell(管理者)] をクリックします。 
- 特権昇格を確認するプロンプトが表示されたら [はい] をクリックします。 
- コンピュータを Active Directory ドメインに追加して再起動します。 - Add-Computer -Domain - DOMAIN -Restart- DOMAINは、Active Directory ドメインの DNS 名に置き換えます。
- 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 アドレスの両方が、関連する内部ロードバランサでも使用されます。
- 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"
- CLUSTER_IP変数内のクラスタ IP アドレスを置き換えます。これは、後でクラスタ IP として指定する際に必要になります。- CLUSTER_IP= - CLUSTER_IP
- 可用性グループ リスナー用に別の静的 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" 
- ロードバランサの予約済み IP アドレスを - LISTENER_IP変数に置き換えます。この変数は、後で可用性グループを構成する際に必要になります。- LISTENER_IP= - LISTENER_IP
これで、プロジェクトと VPC を Windows Server フェイルオーバー クラスタと SQL Server にデプロイする準備が整いました。
フェイルオーバー クラスタのデプロイ
次に、VM インスタンスを使用して Windows Server フェイルオーバー クラスタと SQL Server をデプロイします。以降のセクションでは、この方法について詳しく説明します。
SQL Server の準備
次の手順で、Active Directory で SQL Server 用の新しいユーザー アカウントを作成します。
- リモート デスクトップを使用して、node-1に接続します。ドメイン ユーザー アカウントでログインします。
- [スタート] ボタンを右クリックするか Win + X を押して、[Windows PowerShell(管理者)] をクリックします。
- 特権昇格を確認するプロンプトが表示されたら [はい] をクリックします。
- 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-1 と node-2 の両方で次の操作を行います。
- SQL Server 構成マネージャーを開きます。
- ナビゲーション パネルで [SQL Server Services] を選択します。
- サービスのリストで [SQL Server(MSSQLSERVER)] を右クリックし、[プロパティ] を選択します。
- [Log on as] でアカウントを次のように変更します。 - アカウント名: DOMAIN\sql_server。DOMAINは Active Directory ドメインの NetBIOS 名です。
- パスワード: 前に選択したパスワードを入力します。
 
- アカウント名: 
- [OK] をクリックします。 
- SQL Server の再起動を求めるプロンプトが表示されたら、[はい] を選択します。 
SQL Server がドメイン ユーザー アカウントで実行されるようになりました。
ファイル共有を作成する
VM インスタンス witness に 2 つのファイル共有を作成して、SQL Server のバックアップを保存し、ファイル共有監視として機能できるようにします。
- リモート デスクトップを使用して、witnessに接続します。ドメイン ユーザー アカウントでログインします。
- [スタート] ボタンを右クリックするか Win + X を押して、[Windows PowerShell(管理者)] をクリックします。
- 特権昇格を確認するプロンプトが表示されたら [はい] をクリックします。
- 監視ファイル共有を作成し、自身と 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$ 
- 別のファイル共有を作成してバックアップを保存し、SQL Server に完全アクセス権を付与します。 - New-Item "C:\Backup" –type directory New-SmbShare ` -Name Backup ` -Path "C:\Backup" ` -Description "SQL Backup" ` -FullAccess $env:USERDOMAIN\sql_server 
フェイルオーバー クラスタを作成する
フェイルオーバー クラスタを作成する手順は次のとおりです。
- node-1のリモート デスクトップ セッションに戻ります。
- [スタート] ボタンを右クリックするか Win + X を押して、[Windows PowerShell(管理者)] をクリックします。
- 特権昇格を確認するプロンプトが表示されたら [はい] をクリックします。
- 新しいクラスタを作成します。 - New-Cluster ` -Name sql-cluster ` -Node node-1,node-2 ` -NoStorage ` -StaticAddress - CLUSTER_IP- CLUSTER_IPは、前に作成したクラスタ IP アドレスに置き換えます。
- witnessの PowerShell セッションに戻り、クラスタの仮想コンピュータ オブジェクトにファイル共有へのアクセス権限を付与します。- icacls C:\QWitness\ /grant 'sql-cluster$:(OI)(CI)(M)' Grant-SmbShareAccess ` -Name QWitness ` -AccountName 'sql-cluster$' ` -AccessRight Full ` -Force 
- node-1の PowerShell セッションに戻り、- witnessのファイル共有をクラスタ クォーラムとして使用するようにクラスタを構成します。- Set-ClusterQuorum -FileShareWitness \\witness\QWitness 
- クラスタが正常に作成されたことを確認します。 - 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 スナップインを起動し、クラスタの正常性を確認することもできます。
- Managed AD を使用している場合は、Windows クラスタが使用するコンピュータ アカウントを Cloud Service Domain Join Accounts グループに追加して、コンピュータをドメインに参加させることができるようにします。 - Add-ADGroupMember ` -Identity "Cloud Service Domain Join Accounts" ` -Members sql-cluster$ 
- 両方のノードで AlwaysOn 可用性グループを有効にします。 - Enable-SqlAlwaysOn -ServerInstance node-1 -Force Enable-SqlAlwaysOn -ServerInstance node-2 -Force 
可用性グループの作成
サンプル データベース bookshelf を作成し、bookshelf-ag という名前の新しい可用性グループに組み込み、高可用性を構成します。
データベースの作成
新しいデータベースを作成します。このチュートリアルでは、データベースにデータが含まれている必要はありません。
- node-1のリモート デスクトップ セッションに戻ります。
- SQL Server Management Studio を開きます。
- [サーバーに接続] ダイアログで、サーバー名が node-1に設定されていることを確認し、[接続] を選択します。
- メニューで [File] > [New] > [Query with current connection] を選択します。
- 次の 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への初期バックアップを実行します。
- [Execute] を選択して SQL スクリプトを実行します。 
高可用性を構成する
T-SQL または SQL Server Management Studio を使用して、可用性グループの高可用性を構成できます。
T-SQL の使用
T-SQL を使用して可用性グループの高可用性を構成する手順は次のとおりです。
- 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
- 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
- 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
- 次のスクリプトで、 - LISTENER_IPは、前に内部ロードバランサ用に予約した IP アドレスに置き換えて実行します。- USE master; GO ALTER AVAILABILITY GROUP [bookshelf-ag] ADD LISTENER N'bookshelf' ( WITH IP ( (N' - LISTENER_IP
- node-2に接続し、次のスクリプトを実行して、セカンダリ レプリカを可用性グループに結合し、自動シーディングを有効にします。- USE master; GO ALTER AVAILABILITY GROUP [bookshelf-ag] JOIN; ALTER AVAILABILITY GROUP [bookshelf-ag] GRANT CREATE ANY DATABASE; 
- 可用性グループのステータスを確認します。 - SELECT * FROM sys.dm_hadr_availability_group_states; GO - synchronization_health_descが- HEALTHYとして表示されます。
SQL Server Management Studio の使用
SQL Server Management Studio を使用して可用性グループの高可用性を構成する手順は次のとおりです。
- [Object Explorer] ウィンドウで、[Always On High Availability] を右クリックし、[New Availability Group Wizard] を選択します。
- [Specify Options] ページで、可用性グループ名を bookshelf-agに設定し、[次へ] を選択します。
- [Select Databases] ページで、bookshelfデータベースを選択し、[Next] を選択します。
- [Specify Replicas] ページで、[Replicas] タブを選択します。 - [Add replica] を選択します。
- [Connect to server] ダイアログで、サーバー名として「 - node-2」と入力し、[Connect] を選択します。- 可用性レプリカのリストに SQL Server インスタンス - node-1と- node-2が追加されました。
- 両方のインスタンスで、可用性モードを [Synchrounous commit] に設定します。 
- 両方のインスタンスで、自動フェイルオーバーを [Enabled] に設定します。 
- [Listener] タブを選択します。 - [Create an availability group listener] を選択します。
- 次の設定を入力します。 - リスナーの DNS 名: bookshelf
- ポート: 1433
- ネットワーク モード: Static IP
 
- リスナーの DNS 名: 
- [Add] を選択し、内部ロードバランサ用に予約したリスナー IP アドレス( - LISTENER_IP
 
- [Next] を選択します。 
 
- [Select Data Synchronization] ページで、[Automatic Seeding] を選択します。 
- [Validation] ページで、すべてのチェックが成功したことを確認します。 
- [Summary] ページで、[Finish] を選択します。 
- [Results] ページで、[Close] を選択します。 
内部ロードバランサとヘルスチェックを作成する
クラスタ IP は、Windows フェイルオーバー クラスタの単一のエンドポイントを表します。これは、管理目的とクラスタ リソースの管理に使用します。クラスタ IP は常にクラスタのホスト(またはプライマリ)ノードを指します。トラフィックがクラスタのホストノードに転送されるようにヘルスチェックを使用する内部ロードバランサをデプロイします。WSFC ツールでは、転送に複数のプロトコル(ICMP、UDP、TCP)を使用する必要があります。そのため、すべてのポートをサポートする複数のプロトコルを使用して、内部ロードバランサをデプロイすることをおすすめします。
内部ロードバランサをデプロイする手順は次のとおりです。
- 既存の Cloud Shell セッションに戻ります。
- 非マネージド インスタンス グループを 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 
- ロードバランサが 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" 
- バックエンド サービスを作成し、既存の 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 
- クラスタ 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 クライアントに単一のエンドポイントを提供するには、その可用性グループ専用の新しい内部ロードバランサをデプロイします。手順は次のとおりです。
- ロードバランサが - bookshelfSQL 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 つのインスタンス グループを追加します。 - 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 
- 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 アドレスに関連付けられています。 
フェイルオーバーをテストする
これで、フェイルオーバーが想定どおりに機能するかどうかをテストする準備が整いました。
- witnessの PowerShell セッションに戻ります。
- 次のスクリプトを実行します。 - 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 に接続し、サーバー名を照会します。 - スクリプトを実行したままにします。 
- node-1のリモート デスクトップ セッションに戻り、フェイルオーバーをトリガーします。- SQL Server Management Studio で、[Always On High Availability] > [Availability Groups] > [bookshelf-ag (Primary)] に移動し、ノードを右クリックします。
- [Failover] を選択します。
- [Select new primary replica] ページで、node-2が新しいプライマリ レプリカとして選択され、[Failover readiness] 列にNo data lossが表示されていることを確認します。[Next] を選択します。
- [Connect to replica] ページで、[Connect] を選択します。
- [Connect to server] ダイアログで、サーバー名が node-2であることを確認し、[Connect] をクリックします。
- [Next]、[Finish] の順に選択します。
- [Results] ページで、フェイルオーバーが成功したことを確認します。
 
- witnessの PowerShell セッションに戻ります。
- 実行中のスクリプトの出力を確認して、フェイルオーバーの結果として、サーバー名が - node-1から- node-2に変更されたことを確認します。
- Ctrl+Cを押してスクリプトを停止します。
クリーンアップ
チュートリアルが終了したら、作成したリソースをクリーンアップして、割り当ての使用を停止し、課金されないようにできます。次のセクションで、リソースを削除または無効にする方法を説明します。
プロジェクトの削除
課金されないようにする最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.