次の方法で共有


PowerShell を使用して Azure VM で Always On 可用性グループを構成する

開始する前に、Azure Resource Manager モデルでこのタスクを完了できることを検討してください。 新しいデプロイには Azure Resource Manager モデルをお勧めします。 Azure 仮想マシン上の SQL Server Always On 可用性グループを参照してください。

重要

ほとんどの新しいデプロイでは、Resource Manager モデルを使用することをお勧めします。 Azure には、リソースの作成と操作に関して、2 種類のデプロイ モデルがあります。Resource Manager とクラシックです。 この記事では、クラシック デプロイ モデルの使用方法について説明します。

Azure 仮想マシン (VM) は、データベース管理者が高可用性 SQL Server システムのコストを削減するのに役立ちます。 このチュートリアルでは、Azure 環境内で SQL Server Always On をエンド ツー エンドで使用して可用性グループを実装する方法について説明します。 チュートリアルの最後に、Azure の SQL Server Always On ソリューションは次の要素で構成されます。

  • フロントエンドとバックエンド サブネットを含む複数のサブネットを含む仮想ネットワーク。
  • Active Directory ドメインを持つドメイン コントローラー。
  • バックエンド サブネットにデプロイされ、Active Directory ドメインに参加している 2 つの SQL Server VM。
  • ノード マジョリティ クォーラム モデルを持つ 3 ノードの Windows フェールオーバー クラスター。
  • 可用性データベースの同期コミット レプリカが 2 つある可用性グループ。

このシナリオは、コスト効率やその他の要因ではなく、Azure でのシンプルさに適しています。 たとえば、2 ノードフェールオーバー クラスターのクォーラム ファイル共有監視としてドメイン コントローラーを使用することで、2 レプリカ可用性グループの VM の数を最小限に抑え、Azure のコンピューティング時間を節約できます。 この方法では、上記の構成から 1 つずつ VM 数が減ります。

このチュートリアルは、各手順の詳細を詳しく説明することなく、上記のソリューションを設定するために必要な手順を示すことを目的としています。 そのため、GUI 構成手順を提供する代わりに、PowerShell スクリプトを使用して各手順をすばやく実行します。 このチュートリアルでは、次のことを前提としています。

Azure サブスクリプションに接続し、仮想ネットワークを作成する

  1. ローカル コンピューターの PowerShell ウィンドウで、Azure モジュールをインポートし、発行設定ファイルをコンピューターにダウンロードし、ダウンロードした発行設定をインポートして PowerShell セッションを Azure サブスクリプションに接続します。

    Import-Module "C:\Program Files (x86)\Microsoft SDKs\Azure\PowerShell\Azure\Azure.psd1"
    Get-AzurePublishSettingsFile
    Import-AzurePublishSettingsFile <publishsettingsfilepath>
    

    Get-AzurePublishSettingsFile コマンドを実行すると、Azure で管理証明書が自動的に生成され、コンピューターにダウンロードされます。 ブラウザーが自動的に開き、Azure サブスクリプションの Microsoft アカウント資格情報の入力を求められます。 ダウンロードした .publishsettings ファイルには、Azure サブスクリプションを管理するために必要なすべての情報が含まれています。 このファイルをローカル ディレクトリに保存した後、 Import-AzurePublishSettingsFile コマンドを使用してインポートします。

    .publishsettings ファイルには、Azure サブスクリプションとサービスの管理に使用される資格情報 (エンコードされていない) が含まれています。 このファイルのセキュリティのベスト プラクティスは、ソース ディレクトリの外部 (Libraries\Documents フォルダーなど) に一時的に保存し、インポートが完了した後に削除することです。 .publishsettings ファイルにアクセスできる悪意のあるユーザーは、Azure サービスを編集、作成、削除できます。

  2. クラウド IT インフラストラクチャの作成に使用する一連の変数を定義します。

    $location = "West US"
    $affinityGroupName = "ContosoAG"
    $affinityGroupDescription = "Contoso SQL HADR Affinity Group"
    $affinityGroupLabel = "IaaS BI Affinity Group"
    $networkConfigPath = "C:\scripts\Network.netcfg"
    $virtualNetworkName = "ContosoNET"
    $storageAccountName = "<uniquestorageaccountname>"
    $storageAccountLabel = "Contoso SQL HADR Storage Account"
    $storageAccountContainer = "https://" + $storageAccountName + ".blob.core.windows.net/vhds/"
    $winImageName = (Get-AzureVMImage | where {$_.Label -like "Windows Server 2008 R2 SP1*"} | sort PublishedDate -Descending)[0].ImageName
    $sqlImageName = (Get-AzureVMImage | where {$_.Label -like "SQL Server 2012 SP1 Enterprise*"} | sort PublishedDate -Descending)[0].ImageName
    $dcServerName = "ContosoDC"
    $dcServiceName = "<uniqueservicename>"
    $availabilitySetName = "SQLHADR"
    $vmAdminUser = "AzureAdmin"
    $vmAdminPassword = "Contoso!000"
    $workingDir = "c:\scripts\"
    

    コマンドが後で成功することを確認するには、次の点に注意してください。

    • 変数 $storageAccountName$dcServiceName は、それぞれインターネット上のクラウド ストレージ アカウントとクラウド サーバーを識別するために使用されるため、一意である必要があります。
    • 変数 $affinityGroupName および $virtualNetworkName に指定する名前は、後で使用する仮想ネットワーク構成ドキュメントで構成します。
    • $sqlImageName は、SQL Server 2012 Service Pack 1 Enterprise Edition を含む VM イメージの更新された名前を指定します。
    • わかりやすくするために、 Contoso!000 はチュートリアル全体で使用されるパスワードと同じです。
  3. アフィニティグループを作成する。

    New-AzureAffinityGroup `
        -Name $affinityGroupName `
        -Location $location `
        -Description $affinityGroupDescription `
        -Label $affinityGroupLabel
    
  4. 構成ファイルをインポートして仮想ネットワークを作成します。

    Set-AzureVNetConfig `
        -ConfigurationPath $networkConfigPath
    

    構成ファイルには、次の XML ドキュメントが含まれています。 簡単に言うと、ContosoAG というアフィニティ グループに ContosoNET という仮想ネットワークを指定します。 アドレス空間は 10.10.0.0/16 で、それぞれフロント サブネットとバック サブネットである 10.10.1.0/2410.10.2.0/24 の 2 つのサブネットがあります。 フロント サブネットでは、Microsoft SharePoint などのクライアント アプリケーションを配置できます。 バック サブネットは、SQL Server VM を配置する場所です。 前に $affinityGroupName 変数と $virtualNetworkName 変数を変更する場合は、以下の対応する名前も変更する必要があります。

    <NetworkConfiguration xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns="https://schemas.microsoft.com/ServiceHosting/2011/07/NetworkConfiguration">
      <VirtualNetworkConfiguration>
        <Dns />
        <VirtualNetworkSites>
          <VirtualNetworkSite name="ContosoNET" AffinityGroup="ContosoAG">
            <AddressSpace>
              <AddressPrefix>10.10.0.0/16</AddressPrefix>
            </AddressSpace>
            <Subnets>
              <Subnet name="Front">
                <AddressPrefix>10.10.1.0/24</AddressPrefix>
              </Subnet>
              <Subnet name="Back">
                <AddressPrefix>10.10.2.0/24</AddressPrefix>
              </Subnet>
            </Subnets>
          </VirtualNetworkSite>
        </VirtualNetworkSites>
      </VirtualNetworkConfiguration>
    </NetworkConfiguration>
    ```xml
    
    
  5. 作成したアフィニティ グループに関連付けられているストレージ アカウントを作成し、サブスクリプションの現在のストレージ アカウントとして設定します。

    New-AzureStorageAccount `
        -StorageAccountName $storageAccountName `
        -Label $storageAccountLabel `
        -AffinityGroup $affinityGroupName
    Set-AzureSubscription `
        -SubscriptionName (Get-AzureSubscription).SubscriptionName `
        -CurrentStorageAccount $storageAccountName
    
  6. 新しいクラウド サービスと可用性セットにドメイン コントローラー サーバーを作成します。

    New-AzureVMConfig `
        -Name $dcServerName `
        -InstanceSize Medium `
        -ImageName $winImageName `
        -MediaLocation "$storageAccountContainer$dcServerName.vhd" `
        -DiskLabel "OS" |
        Add-AzureProvisioningConfig `
            -Windows `
            -DisableAutomaticUpdates `
            -AdminUserName $vmAdminUser `
            -Password $vmAdminPassword |
            New-AzureVM `
                -ServiceName $dcServiceName `
                –AffinityGroup $affinityGroupName `
                -VNetName $virtualNetworkName
    

    これらのパイプコマンドは、次のことを行います。

    • New-AzureVMConfig によって VM 構成が作成されます。
    • Add-AzureProvisioningConfig は、スタンドアロンの Windows サーバーの構成パラメーターを提供します。
    • Add-AzureDataDisk は、キャッシュ オプションを None に設定して、Active Directory データの格納に使用するデータ ディスクを追加します。
    • New-AzureVM は、新しいクラウド サービスを作成し、新しいクラウド サービスに新しい Azure VM を作成します。
  7. 新しい VM が完全にプロビジョニングされるまで待ち、リモート デスクトップ ファイルを作業ディレクトリにダウンロードします。 新しい Azure VM のプロビジョニングには時間がかかるため、 while ループは、使用できる状態になるまで新しい VM をポーリングし続けます。

    $VMStatus = Get-AzureVM -ServiceName $dcServiceName -Name $dcServerName
    
    While ($VMStatus.InstanceStatus -ne "ReadyRole")
    {
        write-host "Waiting for " $VMStatus.Name "... Current Status = " $VMStatus.InstanceStatus
        Start-Sleep -Seconds 15
        $VMStatus = Get-AzureVM -ServiceName $dcServiceName -Name $dcServerName
    }
    
    Get-AzureRemoteDesktopFile `
        -ServiceName $dcServiceName `
        -Name $dcServerName `
        -LocalPath "$workingDir$dcServerName.rdp"
    

これで、ドメイン コントローラー サーバーが正常にプロビジョニングされました。 次に、このドメイン コントローラー サーバーで Active Directory ドメインを構成します。 ローカル コンピューターで PowerShell ウィンドウを開いたままにします。 後でもう一度使用して、2 つの SQL Server VM を作成します。

ドメイン コントローラーの構成

  1. リモート デスクトップ ファイルを起動して、ドメイン コントローラー サーバーに接続します。 新しい VM の作成時に指定したマシン管理者のユーザー名 AzureAdmin とパスワード Contoso!000 を使用します。

  2. 管理者モードで PowerShell ウィンドウを開きます。

  3. 次の DCPROMO.EXE コマンドを実行して、ドライブ M 上のデータ ディレクトリを使用して、 corp.contoso.com ドメインを設定します。

    dcpromo.exe `
        /unattend `
        /ReplicaOrNewDomain:Domain `
        /NewDomain:Forest `
        /NewDomainDNSName:corp.contoso.com `
        /ForestLevel:4 `
        /DomainNetbiosName:CORP `
        /DomainLevel:4 `
        /InstallDNS:Yes `
        /ConfirmGc:Yes `
        /CreateDNSDelegation:No `
        /DatabasePath:"C:\Windows\NTDS" `
        /LogPath:"C:\Windows\NTDS" `
        /SYSVOLPath:"C:\Windows\SYSVOL" `
        /SafeModeAdminPassword:"Contoso!000"
    

    コマンドが完了すると、VM が自動的に再起動します。

  4. リモート デスクトップ ファイルを起動して、ドメイン コントローラー サーバーにもう一度接続します。 今回は、 CORP\Administrator としてサインインします。

  5. 管理者モードで PowerShell ウィンドウを開き、次のコマンドを使用して Active Directory PowerShell モジュールをインポートします。

    Import-Module ActiveDirectory
    
  6. 次のコマンドを実行して、3 人のユーザーをドメインに追加します。

    $pwd = ConvertTo-SecureString "Contoso!000" -AsPlainText -Force
    New-ADUser `
        -Name 'Install' `
        -AccountPassword  $pwd `
        -PasswordNeverExpires $true `
        -ChangePasswordAtLogon $false `
        -Enabled $true
    New-ADUser `
        -Name 'SQLSvc1' `
        -AccountPassword  $pwd `
        -PasswordNeverExpires $true `
        -ChangePasswordAtLogon $false `
        -Enabled $true
    New-ADUser `
        -Name 'SQLSvc2' `
        -AccountPassword  $pwd `
        -PasswordNeverExpires $true `
        -ChangePasswordAtLogon $false `
        -Enabled $true
    

    CORP\Install は、SQL Server サービス インスタンス、フェールオーバー クラスター、および可用性グループに関連するすべての構成に使用されます。 CORP\SQLSvc1CORP\SQLSvc2 は、2 つの SQL Server VM の SQL Server サービス アカウントとして使用されます。

  7. 次に、次のコマンドを実行して 、CORP\Install にドメインにコンピューター オブジェクトを作成するアクセス許可を付与します。

    Cd ad:
    $sid = new-object System.Security.Principal.SecurityIdentifier (Get-ADUser "Install").SID
    $guid = new-object Guid bf967a86-0de6-11d0-a285-00aa003049e2
    $ace1 = new-object System.DirectoryServices.ActiveDirectoryAccessRule $sid,"CreateChild","Allow",$guid,"All"
    $corp = Get-ADObject -Identity "DC=corp,DC=contoso,DC=com"
    $acl = Get-Acl $corp
    $acl.AddAccessRule($ace1)
    Set-Acl -Path "DC=corp,DC=contoso,DC=com" -AclObject $acl
    

    上記で指定した GUID は、コンピューター オブジェクトの種類の GUID です。 CORP\Install アカウントには、フェールオーバー クラスターの Active Direct オブジェクトを作成するために、すべてのプロパティの読み取りとコンピューター オブジェクトの作成アクセス許可が必要です。 [ すべてのプロパティの読み取り] アクセス許可は既定で CORP\Install に与えられているため、明示的に付与する必要はありません。 フェールオーバー クラスターの作成に必要なアクセス許可の詳細については、「 フェールオーバー クラスターのステップ バイ ステップ ガイド: Active Directory でのアカウントの構成」を参照してください。

    これで Active Directory とユーザー オブジェクトの構成が完了したので、2 つの SQL Server VM を作成し、このドメインに参加させます。

SQL Server VM を作成する

  1. ローカル コンピューターで開いている PowerShell ウィンドウを引き続き使用します。 次の追加変数を定義します。

    $domainName= "corp"
    $FQDN = "corp.contoso.com"
    $subnetName = "Back"
    $sqlServiceName = "<uniqueservicename>"
    $quorumServerName = "ContosoQuorum"
    $sql1ServerName = "ContosoSQL1"
    $sql2ServerName = "ContosoSQL2"
    $availabilitySetName = "SQLHADR"
    $dataDiskSize = 100
    $dnsSettings = New-AzureDns -Name "ContosoBackDNS" -IPAddress "10.10.0.4"
    

    通常、IP アドレス 10.10.0.4 は、Azure 仮想ネットワークの 10.10.0.0/16 サブネットに作成した最初の VM に割り当てられます。 IPCONFIG を実行して、これがドメイン コントローラー サーバーのアドレスであることを確認する必要があります。

  2. 次のパイプコマンドを実行して、 ContosoQuorum という名前のフェールオーバー クラスターに最初の VM を作成します。

    New-AzureVMConfig `
        -Name $quorumServerName `
        -InstanceSize Medium `
        -ImageName $winImageName `
        -MediaLocation "$storageAccountContainer$quorumServerName.vhd" `
        -AvailabilitySetName $availabilitySetName `
        -DiskLabel "OS" |
        Add-AzureProvisioningConfig `
            -WindowsDomain `
            -AdminUserName $vmAdminUser `
            -Password $vmAdminPassword `
            -DisableAutomaticUpdates `
            -Domain $domainName `
            -JoinDomain $FQDN `
            -DomainUserName $vmAdminUser `
            -DomainPassword $vmAdminPassword |
            Set-AzureSubnet `
                -SubnetNames $subnetName |
                New-AzureVM `
                    -ServiceName $sqlServiceName `
                    –AffinityGroup $affinityGroupName `
                    -VNetName $virtualNetworkName `
                    -DnsSettings $dnsSettings
    

    上記のコマンドに関して、次の点に注意してください。

    • New-AzureVMConfig は、目的の可用性セット名を使用して VM 構成を作成します。 後続の VM は、同じ可用性セット名で作成され、同じ可用性セットに参加します。
    • Add-AzureProvisioningConfig は、作成した Active Directory ドメインに VM を参加させます。
    • Set-AzureSubnet は、VM をバック サブネットに配置します。
    • New-AzureVM は、新しいクラウド サービスを作成し、新しいクラウド サービスに新しい Azure VM を作成します。 DnsSettings パラメーターは、新しいクラウド サービス内のサーバーの DNS サーバーに IP アドレス 10.10.0.4 があることを指定します。 これは、ドメイン コントローラー サーバーの IP アドレスです。 このパラメーターは、クラウド サービス内の新しい VM が Active Directory ドメインに正常に参加できるようにするために必要です。 このパラメーターを指定しない場合は、VM のプロビジョニング後にドメイン コントローラー サーバーをプライマリ DNS サーバーとして使用するように VM の IPv4 設定を手動で設定し、VM を Active Directory ドメインに参加させる必要があります。
  3. 次のパイプコマンドを実行して、 ContosoSQL1ContosoSQL2 という名前の SQL Server VM を作成します。

    # Create ContosoSQL1...
    New-AzureVMConfig `
        -Name $sql1ServerName `
        -InstanceSize Large `
        -ImageName $sqlImageName `
        -MediaLocation "$storageAccountContainer$sql1ServerName.vhd" `
        -AvailabilitySetName $availabilitySetName `
        -HostCaching "ReadOnly" `
        -DiskLabel "OS" |
        Add-AzureProvisioningConfig `
            -WindowsDomain `
            -AdminUserName $vmAdminUser `
            -Password $vmAdminPassword `
            -DisableAutomaticUpdates `
            -Domain $domainName `
            -JoinDomain $FQDN `
            -DomainUserName $vmAdminUser `
            -DomainPassword $vmAdminPassword |
            Set-AzureSubnet `
                -SubnetNames $subnetName |
                Add-AzureEndpoint `
                    -Name "SQL" `
                    -Protocol "tcp" `
                    -PublicPort 1 `
                    -LocalPort 1433 |
                    New-AzureVM `
                        -ServiceName $sqlServiceName
    
    # Create ContosoSQL2...
    New-AzureVMConfig `
        -Name $sql2ServerName `
        -InstanceSize Large `
        -ImageName $sqlImageName `
        -MediaLocation "$storageAccountContainer$sql2ServerName.vhd" `
        -AvailabilitySetName $availabilitySetName `
        -HostCaching "ReadOnly" `
        -DiskLabel "OS" |
        Add-AzureProvisioningConfig `
            -WindowsDomain `
            -AdminUserName $vmAdminUser `
            -Password $vmAdminPassword `
            -DisableAutomaticUpdates `
            -Domain $domainName `
            -JoinDomain $FQDN `
            -DomainUserName $vmAdminUser `
            -DomainPassword $vmAdminPassword |
            Set-AzureSubnet `
                -SubnetNames $subnetName |
                Add-AzureEndpoint `
                    -Name "SQL" `
                    -Protocol "tcp" `
                    -PublicPort 2 `
                    -LocalPort 1433 |
                    New-AzureVM `
                        -ServiceName $sqlServiceName
    

    上記のコマンドに関して、次の点に注意してください。

    • New-AzureVMConfig では、ドメイン コントローラー サーバーと同じ可用性セット名が使用され、仮想マシン ギャラリーの SQL Server 2012 Service Pack 1 Enterprise Edition イメージが使用されます。 また、オペレーティング システム ディスクを読み取りキャッシュのみに設定します (書き込みキャッシュなし)。 VM にアタッチする別のデータ ディスクにデータベース ファイルを移行し、読み取りまたは書き込みキャッシュなしで構成することをお勧めします。 ただし、次に最適なのは、オペレーティング システム ディスクの読み取りキャッシュを削除できないため、オペレーティング システム ディスクの書き込みキャッシュを削除することです。
    • Add-AzureProvisioningConfig は、作成した Active Directory ドメインに VM を参加させます。
    • Set-AzureSubnet は、VM をバック サブネットに配置します。
    • Add-AzureEndpoint は、クライアント アプリケーションがインターネット上のこれらの SQL Server サービス インスタンスにアクセスできるように、アクセス エンドポイントを追加します。 ContosoSQL1 と ContosoSQL2 には、さまざまなポートが提供されます。
    • New-AzureVM は 、ContosoQuorum と同じクラウド サービスに新しい SQL Server VM を作成します。 VM を同じ可用性セットに含める場合は、同じクラウド サービスに VM を配置する必要があります。
  4. 各 VM が完全にプロビジョニングされるまで待ち、各 VM がリモート デスクトップ ファイルを作業ディレクトリにダウンロードします。 for ループは、3 つの新しい VM を循環し、それぞれの最上位の中かっこ内のコマンドを実行します。

    Foreach ($VM in $VMs = Get-AzureVM -ServiceName $sqlServiceName)
    {
        write-host "Waiting for " $VM.Name "..."
    
        # Loop until the VM status is "ReadyRole"
        While ($VM.InstanceStatus -ne "ReadyRole")
        {
            write-host "  Current Status = " $VM.InstanceStatus
            Start-Sleep -Seconds 15
            $VM = Get-AzureVM -ServiceName $VM.ServiceName -Name $VM.InstanceName
        }
    
        write-host "  Current Status = " $VM.InstanceStatus
    
        # Download remote desktop file
        Get-AzureRemoteDesktopFile -ServiceName $VM.ServiceName -Name $VM.InstanceName -LocalPath "$workingDir$($VM.InstanceName).rdp"
    }
    

    これで SQL Server VM がプロビジョニングされ、実行されるようになりましたが、既定のオプションを使用して SQL Server と共にインストールされます。

フェールオーバー クラスター VM を初期化する

このセクションでは、フェールオーバー クラスターと SQL Server のインストールで使用する 3 つのサーバーを変更する必要があります。 具体的には:

  • すべてのサーバー: フェールオーバー クラスタリング 機能をインストールする必要があります。

  • すべてのサーバー: CORP\Install をマシン 管理者として追加する必要があります。

  • ContosoSQL1 と ContosoSQL2 のみ: 既定のデータベースに CORP\Installsysadmin ロールとして追加する必要があります。

  • ContosoSQL1 と ContosoSQL2 のみ: 次のアクセス許可を持つサインインとして NT AUTHORITY\System を追加する必要があります。

    • 可用性グループを変更する
    • SQL の接続
    • サーバー状態の表示
  • ContosoSQL1 と ContosoSQL2 のみ: SQL Server VM で TCP プロトコルが既に有効になっています。 ただし、SQL Server のリモート アクセス用にファイアウォールを開く必要があります。

これで、開始する準備ができました。 ContosoQuorum 以降、次の手順に従います。

  1. リモート デスクトップ ファイルを起動して ContosoQuorum に接続します。 VM の作成時に指定したマシン管理者のユーザー名 AzureAdmin とパスワード Contoso!000 を使用します。

  2. コンピューターが正常に corp.contoso.com に参加していることを確認します。

  3. 続行する前に、SQL Server のインストールが自動化された初期化タスクの実行を完了するまで待ちます。

  4. 管理者モードで PowerShell ウィンドウを開きます。

  5. Windows フェールオーバー クラスタリング機能をインストールします。

    Import-Module ServerManager
    Add-WindowsFeature Failover-Clustering
    
  6. CORP\Install をローカル管理者として追加します。

    net localgroup administrators "CORP\Install" /Add
    
  7. ContosoQuorum からサインアウトします。 これで、このサーバーが完了しました。

    logoff.exe
    

次に、 ContosoSQL1ContosoSQL2 を初期化します。 次の手順に従います。これは両方の SQL Server VM で同じです。

  1. リモート デスクトップ ファイルを起動して、2 つの SQL Server VM に接続します。 VM の作成時に指定したマシン管理者のユーザー名 AzureAdmin とパスワード Contoso!000 を使用します。

  2. コンピューターが正常に corp.contoso.com に参加していることを確認します。

  3. 続行する前に、SQL Server のインストールが自動化された初期化タスクの実行を完了するまで待ちます。

  4. 管理者モードで PowerShell ウィンドウを開きます。

  5. Windows フェールオーバー クラスタリング機能をインストールします。

    Import-Module ServerManager
    Add-WindowsFeature Failover-Clustering
    
  6. CORP\Install をローカル管理者として追加します。

    net localgroup administrators "CORP\Install" /Add
    
  7. SQL Server PowerShell プロバイダーをインポートします。

    Set-ExecutionPolicy -Execution RemoteSigned -Force
    Import-Module -Name "sqlps" -DisableNameChecking
    
  8. 既定の SQL Server インスタンスの sysadmin ロールとして CORP\Install を追加します。

    net localgroup administrators "CORP\Install" /Add
    Invoke-SqlCmd -Query "EXEC sp_addsrvrolemember 'CORP\Install', 'sysadmin'" -ServerInstance "."
    
  9. 上記の 3 つのアクセス許可を持つサインインとして NT AUTHORITY\System を追加します。

    Invoke-SqlCmd -Query "CREATE LOGIN [NT AUTHORITY\SYSTEM] FROM WINDOWS" -ServerInstance "."
    Invoke-SqlCmd -Query "GRANT ALTER ANY AVAILABILITY GROUP TO [NT AUTHORITY\SYSTEM] AS SA" -ServerInstance "."
    Invoke-SqlCmd -Query "GRANT CONNECT SQL TO [NT AUTHORITY\SYSTEM] AS SA" -ServerInstance "."
    Invoke-SqlCmd -Query "GRANT VIEW SERVER STATE TO [NT AUTHORITY\SYSTEM] AS SA" -ServerInstance "."
    
  10. SQL Server のリモート アクセス用にファイアウォールを開きます。

     netsh advfirewall firewall add rule name='SQL Server (TCP-In)' program='C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn\sqlservr.exe' dir=in action=allow protocol=TCP
    
  11. 両方の VM からサインアウトします。

     logoff.exe
    

最後に、可用性グループを構成する準備ができました。 SQL Server PowerShell プロバイダーを使用して、 ContosoSQL1 のすべての作業を実行します。

可用性グループを構成する

  1. リモート デスクトップ ファイルを起動して 、ContosoSQL1 にもう一度接続します。 コンピューター アカウントを使用してサインインする代わりに、 CORP\Install を使用してサインインします。

  2. 管理者モードで PowerShell ウィンドウを開きます。

  3. 次の変数を定義します。

    $server1 = "ContosoSQL1"
    $server2 = "ContosoSQL2"
    $serverQuorum = "ContosoQuorum"
    $acct1 = "CORP\SQLSvc1"
    $acct2 = "CORP\SQLSvc2"
    $password = "Contoso!000"
    $clusterName = "Cluster1"
    $timeout = New-Object System.TimeSpan -ArgumentList 0, 0, 30
    $db = "MyDB1"
    $backupShare = "\\$server1\backup"
    $quorumShare = "\\$server1\quorum"
    $ag = "AG1"
    
  4. SQL Server PowerShell プロバイダーをインポートします。

    Set-ExecutionPolicy RemoteSigned -Force
    Import-Module "sqlps" -DisableNameChecking
    
  5. ContosoSQL1 の SQL Server サービス アカウントを CORP\SQLSvc1 に変更します。

    $wmi1 = new-object ("Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer") $server1
    $wmi1.services | where {$_.Type -eq 'SqlServer'} | foreach{$_.SetServiceAccount($acct1,$password)}
    $svc1 = Get-Service -ComputerName $server1 -Name 'MSSQLSERVER'
    $svc1.Stop()
    $svc1.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Stopped,$timeout)
    $svc1.Start();
    $svc1.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Running,$timeout)
    
  6. ContosoSQL2 の SQL Server サービス アカウントを CORP\SQLSvc2 に変更します。

    $wmi2 = new-object ("Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer") $server2
    $wmi2.services | where {$_.Type -eq 'SqlServer'} | foreach{$_.SetServiceAccount($acct2,$password)}
    $svc2 = Get-Service -ComputerName $server2 -Name 'MSSQLSERVER'
    $svc2.Stop()
    $svc2.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Stopped,$timeout)
    $svc2.Start();
    $svc2.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Running,$timeout)
    
  7. azure VM の Always On 可用性グループのフェールオーバー クラスターの作成からローカル作業ディレクトリにCreateAzureFailoverCluster.ps1をダウンロードします。 このスクリプトは、機能するフェールオーバー クラスターの作成に役立ちます。 Windows フェールオーバー クラスタリングが Azure ネットワークと対話する方法の重要な情報については、Azure Virtual Machines での SQL Server の高可用性とディザスター リカバリーに関するページを参照してください。

  8. 作業ディレクトリに移動し、ダウンロードしたスクリプトを使用してフェールオーバー クラスターを作成します。

    Set-ExecutionPolicy Unrestricted -Force
    .\CreateAzureFailoverCluster.ps1 -ClusterName "$clusterName" -ClusterNode "$server1","$server2","$serverQuorum"
    
  9. ContosoSQL1ContosoSQL2 の既定の SQL Server インスタンスに対して Always On 可用性グループを有効にします。

    Enable-SqlAlwaysOn `
        -Path SQLSERVER:\SQL\$server1\Default `
        -Force
    Enable-SqlAlwaysOn `
        -Path SQLSERVER:\SQL\$server2\Default `
        -NoServiceRestart
    $svc2.Stop()
    $svc2.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Stopped,$timeout)
    $svc2.Start();
    $svc2.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Running,$timeout)
    
  10. バックアップ ディレクトリを作成し、SQL Server サービス アカウントのアクセス許可を付与します。 このディレクトリを使用して、セカンダリ レプリカで可用性データベースを準備します。

    $backup = "C:\backup"
    New-Item $backup -ItemType directory
    net share backup=$backup "/grant:$acct1,FULL" "/grant:$acct2,FULL"
    icacls.exe "$backup" /grant:r ("$acct1" + ":(OI)(CI)F") ("$acct2" + ":(OI)(CI)F")
    
  11. MyDB1 という名前の ContosoSQL1 にデータベースを作成し、完全バックアップとログ バックアップの両方を取得し、WITH NORECOVERY オプションを使用して ContosoSQL2 で復元します。

    Invoke-SqlCmd -Query "CREATE database $db"
    Backup-SqlDatabase -Database $db -BackupFile "$backupShare\db.bak" -ServerInstance $server1
    Backup-SqlDatabase -Database $db -BackupFile "$backupShare\db.log" -ServerInstance $server1 -BackupAction Log
    Restore-SqlDatabase -Database $db -BackupFile "$backupShare\db.bak" -ServerInstance $server2 -NoRecovery
    Restore-SqlDatabase -Database $db -BackupFile "$backupShare\db.log" -ServerInstance $server2 -RestoreAction Log -NoRecovery
    
  12. SQL Server VM に可用性グループ エンドポイントを作成し、エンドポイントに適切なアクセス許可を設定します。

    $endpoint =
      New-SqlHadrEndpoint MyMirroringEndpoint `
        -Port 5022 `
        -Path "SQLSERVER:\SQL\$server1\Default"
      Set-SqlHadrEndpoint `
        -InputObject $endpoint `
        -State "Started"
    $endpoint =
      New-SqlHadrEndpoint MyMirroringEndpoint `
        -Port 5022 `
        -Path "SQLSERVER:\SQL\$server2\Default"
    Set-SqlHadrEndpoint `
         -InputObject $endpoint `
         -State "Started"
    
    Invoke-SqlCmd -Query "CREATE LOGIN [$acct2] FROM WINDOWS" -ServerInstance $server1
    Invoke-SqlCmd -Query "GRANT CONNECT ON ENDPOINT::[MyMirroringEndpoint] TO [$acct2]" -ServerInstance $server1
    Invoke-SqlCmd -Query "CREATE LOGIN [$acct1] FROM WINDOWS" -ServerInstance $server2
    Invoke-SqlCmd -Query "GRANT CONNECT ON ENDPOINT::[MyMirroringEndpoint] TO [$acct1]" -ServerInstance $server2
    
  13. 可用性レプリカを作成します。

    $primaryReplica =
       New-SqlAvailabilityReplica `
         -Name $server1 `
         -EndpointURL "TCP://$server1.corp.contoso.com:5022" `
         -AvailabilityMode "SynchronousCommit" `
         -FailoverMode "Automatic" `
         -Version 11 `
         -AsTemplate
    $secondaryReplica =
       New-SqlAvailabilityReplica `
         -Name $server2 `
         -EndpointURL "TCP://$server2.corp.contoso.com:5022" `
         -AvailabilityMode "SynchronousCommit" `
         -FailoverMode "Automatic" `
         -Version 11 `
         -AsTemplate
    
  14. 最後に、可用性グループを作成し、セカンダリ レプリカを可用性グループに参加させます。

    New-SqlAvailabilityGroup `
        -Name $ag `
        -Path "SQLSERVER:\SQL\$server1\Default" `
        -AvailabilityReplica @($primaryReplica,$secondaryReplica) `
        -Database $db
    Join-SqlAvailabilityGroup `
        -Path "SQLSERVER:\SQL\$server2\Default" `
        -Name $ag
    Add-SqlAvailabilityDatabase `
        -Path "SQLSERVER:\SQL\$server2\Default\AvailabilityGroups\$ag" `
        -Database $db
    

次のステップ

これで、Azure に可用性グループを作成することで、SQL Server Always On が正常に実装されました。 この可用性グループのリスナーを構成するには、「Azure で Always On 可用性グループの ILB リスナーを構成する」を参照してください。

Azure での SQL Server の使用に関するその他の情報については、Azure 仮想マシン上の SQL Server に関するページを参照してください。