演習 - 読み取りスケールを使用した地理的に分散された自動フェールオーバー グループ

完了

前のユニットでは、geo レプリケーションと自動フェールオーバー グループについて学習しました。 この演習では、Azure SQL データベースに対して自動フェールオーバー グループを構成します。 その後、フェールオーバーを開始して結果を表示します。

Azure SQL の自動フェールオーバー グループ

1 つ以上のデータベースに対して自動フェールオーバー グループを構成し、結果を表示するには、次の手順のようにする必要があります。

  1. 環境を構成します。
  2. フェールオーバー リージョンに空の Azure SQL Database サーバーを作成します。
  3. サーバー間にフェールオーバー グループを作成します。
  4. ネットワークを構成します。
  5. フェールオーバー グループに 1 つ以上のデータベースを追加します。
  6. コマンド プロンプト アプリケーションを構成します。
  7. 実行中のアプリケーションについて理解します。
  8. フェールオーバーを開始します。
  9. フェールバックを行います。

この演習では、AdventureWorks データベースの自動フェールオーバー グループを構成する手順について説明します。 次に、単純なコマンド ライン アプリケーションを使用して、読み取りと書き込みが行われる場所と、アプリケーションの再試行ロジックの重要性を把握します。 最後に、自動フェールオーバー グループも備えている Business Critical データベースに関連付けられた読み取りレプリカの数を確認するための楽しい演習を行います。

環境を構成する

  1. 次のコードをメモ帳などのテキスト エディターにコピーします。 情報を入力します。 SQL 認証パスワードを追加します。 $drLocation には、フェールオーバー グループを作成するリージョンを指定します。 理想的には、現在のサーバーのリージョンとペアになっているリージョンを選びます。 ペアになっているリージョンの一覧を確認できます。 少なくとも、元のデータベースがあるリージョンにすることはできません。 最後に、ローカル コンピューターの IP アドレスを追加します。 IP アドレスを決定する必要がある場合は、ローカル コンピューターで PowerShell を開き、(Invoke-WebRequest -Uri "https://ipinfo.io/ip").Content を実行します。

    # Add your info
    $password = "password"
    $drLocation = "westus2"
    $ipAddress = "xx.xx.xx.xx"
    
  2. 更新したコマンドを、(このページの右側にある) Azure Cloud Shell で実行します。

  3. Azure Cloud Shell で次のスクリプトを実行して、以降の手順のための変数を構成します。

    $admin = "cloudadmin"
    $resourceGroup = Get-AzResourceGroup | Where ResourceGroupName -like <rgn>Sandbox resource group name</rgn>
    $location = $resourceGroup.Location
    $resourceGroup = $resourceGroup.ResourceGroupName
    $database = "AdventureWorks"
    $server = Get-AzureRmSqlServer -ResourceGroupName $resourceGroup
    $server = $server.ServerName
    $drServer = "$($server)-dr"
    $failoverGroup = "$($server)-fg"
    $firewallRule = "AllowMyIp"
    Write-Host "Variables Received"
    
  4. Azure Cloud Shell で次のスクリプトを実行して、フェールオーバー リージョンに空の Azure SQL Database サーバーを作成します。

    # Create a backup server in the failover region
    New-AzSqlServer -ResourceGroupName $resourceGroup `
        -ServerName $drServer `
        -Location $drLocation `
        -SqlAdministratorCredentials $(New-Object -TypeName System.Management.Automation.PSCredential `
        -ArgumentList $admin, $(ConvertTo-SecureString -String $password -AsPlainText -Force))
    Write-Host "New Azure SQL Database logical server Created in different region"
    
  5. Azure Cloud Shell で次のスクリプトを実行して、サーバー間にフェールオーバー グループを作成します。

    # Create a failover group between the servers
    New-AzSqlDatabaseFailoverGroup -ResourceGroupName $resourceGroup `
        -ServerName $server `
        -PartnerServerName $drServer `
        -FailoverGroupName $failoverGroup 
    Write-Host "New auto-failover group created between the two Azure SQL Database logical servers"
    
  6. Azure Cloud Shell で次のスクリプトを実行して、ネットワークを構成します。

    # Add a firewall rule that gives your VM access to the new server
    New-AzSqlServerFirewallRule -ResourceGroupName $resourceGroup `
        -ServerName $drServer `
        -FirewallRuleName $firewallRule `
        -StartIpAddress $ipAddress `
        -EndIpAddress $ipAddress;
    

    自動フェールオーバー グループの例を示すには、このネットワーク セットアップで十分です。 エンタープライズ環境での処理とは少し異なります。 エンタープライズ環境では、アクセスを必要とするコンピューターが、何らかの種類のアプリケーションを構成する一連のリソースである可能性があります。 データベースのフェールオーバーを行う場合、アプリケーション、VM、またはその他のリソースを新しいリージョンにフェールオーバーすることもできます。 どちらのリソース セットも、もう一方のリージョンのリソース、サーバー、データベースへのアクセスを必要とします。 このためには、仮想ネットワーク ピアリング、仮想ネットワークから仮想ネットワークへの接続、または他の方法 (Azure ExpressRoute など) を使用できます。 シナリオによって異なります。

  7. Azure Cloud Shell で次のスクリプトを実行して、フェールオーバー グループに 1 つ以上のデータベースを追加します。

    # Add the database or databases to the failover group
    Get-AzSqlDatabase -ResourceGroupName $resourceGroup `
        -ServerName $server -DatabaseName $database | `
        Add-AzSqlDatabaseToFailoverGroup -ResourceGroupName $resourceGroup `
        -ServerName $server `
        -FailoverGroupName $failoverGroup
    Write-Host "AdventureWorks database added to the auto-failover group"
    

    このスクリプトの実行には時間がかかります。 他のリージョンのデータベースを復元することになり、元のリージョンからディザスター リカバリー リージョンにデータをコピーする処理が含まれます。 次のセクションの手順を実行してから、このスクリプトが完了しているかどうかを確認できます。

これで、AdventureWorks データベースの自動フェールオーバー グループのデプロイと構成が完了しました。

コマンド プロンプト アプリケーションを構成する

このセクションでは、2 つの ostress ワークロードを使用して、フェールオーバー グループ内のプライマリ サーバーとセカンダリ サーバーの Updateability (データベースが ReadWrite 状態か ReadOnly 状態か) を確認します。 このシナリオは、読み取りと書き込みのワークロードがあるアプリケーションをシミュレートするためのものです。

  1. 2 つの個別のコマンド プロンプト ウィンドウを開きます。 このウィンドウ (ブラウザー) と両方のコマンド プロンプト ウィンドウが表示されるように、ウィンドウを設定します。

  2. 両方のコマンド プロンプト ウィンドウで、前の演習で行ったように、Availability フォルダーに移動します。 たとえば、次のコマンドを使用できます。

    cd C:\Users\username\mslearn-azure-sql-fundamentals\05-Availability
    
  3. 最初のコマンド プロンプト ウィンドウは、作成したフェールオーバー グループのプライマリ サーバーの状態を確認するために使用します。 ご自身のサーバー名とパスワードを使用して、次のコマンドを実行します。

    .\ostress.exe -S"<server-name>-fg.database.windows.net" -Q"SELECT DATABASEPROPERTYEX(DB_NAME(),'Updateability')" -U"cloudadmin" -d"AdventureWorks" -P"password" -n1 -r5000 -oprimary
    

    Note

    自動フェールオーバー グループを使用している場合は、データベースの抽象化であるフェールオーバー グループ名に接続します。

  4. 2 番目のコマンド プロンプト ウィンドウは、作成したフェールオーバー グループのセカンダリ サーバーの状態を確認するために使用します。 ご自身のサーバー名とパスワードを使用して、次のコマンドを実行します。

    ostress.exe -S"<server-name>-fg.secondary.database.windows.net" -Q"SELECT DATABASEPROPERTYEX(DB_NAME(),'Updateability')" -U"cloudadmin" -d"AdventureWorks" -P"password" -n1 -r5000 -osecondary
    

最初のコマンドの結果は READ_WRITE になるはずです。これは、フェールオーバー グループのプライマリ サーバーが確認され、フェールオーバーが開始されていないからです。

2 つ目のコマンドの結果は、構成したディザスター リカバリー サーバーまたはセカンダリ サーバーを確認するため、READ_ONLY になるはずです。 任意の時点で、いずれか 1 つのサーバーからのみ書き込みが可能である必要があります。

次の手順では、フェールオーバーが発生したときに両方のサーバーで何が起こるかを確認します。

フェールオーバーを開始して結果を表示する

  1. このページの右側にある Azure Cloud Shell ターミナルを使って、セカンダリ サーバーの状態を確認します。

    (Get-AzSqlDatabaseFailoverGroup -FailoverGroupName $failoverGroup `
        -ResourceGroupName $resourceGroup -ServerName $drServer).ReplicationRole
    

    この結果により、自動フェールオーバー グループのセカンダリ サーバーがプライマリ データベースとして使用されているか、またはセカンダリ データベースとして使用されているかがわかります。

  2. フェールオーバーが発生したときの動作を確認できるようになりました。 Azure Cloud Shell ターミナルで次の Azure PowerShell コマンドを入力して、手動フェールオーバーを開始します。

    Switch-AzSqlDatabaseFailoverGroup -ResourceGroupName $resourceGroup `
     -ServerName $drServer -FailoverGroupName $failoverGroup
    

    フェールオーバーが発生すると、接続が一時的に切断されることに気付くかもしれませんが、アプリは再試行を続けるため、アプリケーションが完全に失敗することはありません。 フェールオーバー完了後、READ_WRITEREAD_ONLY の結果が再開され、これらが変わらないことがわかります。

    Azure SQL Database と Azure SQL Managed Instance における自動フェールオーバー グループの利点の 1 つは、フェールオーバー後に接続文字列を更新する必要がないことです。 書き込みワークロードの場合はプライマリ (<failover-group>.database.windows.net) に、読み取りワークロードの場合はセカンダリ (<failover-group>.secondary.database.windows.net) に引き続き接続します。 Azure によって、対応するリージョンまたはサーバー内の適切なデータベースへのルーティングが行われます。

  3. Azure Cloud Shell で次のスクリプトを実行して、セカンダリ サーバーの状態を確認します。

    (Get-AzSqlDatabaseFailoverGroup -FailoverGroupName $failoverGroup `
        -ResourceGroupName $resourceGroup -ServerName $drServer).ReplicationRole
    

    このサーバーがプライマリ ロールになっていることがわかります。

  4. Azure Cloud Shell で次のスクリプトを実行して、フェールバックします。

    Switch-AzSqlDatabaseFailoverGroup -ResourceGroupName $resourceGroup `
     -ServerName $server -FailoverGroupName $failoverGroup
    
  5. 最後に、セカンダリ サーバーの状態をもう一度確認することができます。 Azure Cloud Shell で次のスクリプトを実行します。

    (Get-AzSqlDatabaseFailoverGroup -FailoverGroupName $failoverGroup `
        -ResourceGroupName $resourceGroup -ServerName $drServer).ReplicationRole
    
  6. これで、両方のコマンド プロンプト ウィンドウを閉じ、Microsoft Learn ブラウザー ウィンドウを最大化できるようになりました。

この演習では、自動フェールオーバー グループをデプロイして構成する方法について学習しました。 また、アプリケーションの観点から、それが何を意味するかも学習しました。 自動フェールオーバー グループは、Azure SQL の可用性と読み取りスケールをさらに向上させるための 1 つの方法にすぎません。