フォロワー データベースを使用する

フォロワー データベース機能を使うと、別のクラスターにあるデータベースを Azure Data Explorer クラスターにアタッチできます。 フォロワー データベースは "読み取り専用" モードでアタッチされるため、データを表示したり、リーダー データベースに取り込まれたデータに対してクエリを実行したりできます。 フォロワー データベースには、リーダー データベースの変更が同期されます。 この同期により、データが利用可能になるまでに数秒から数分のデータ遅延が発生します。 遅延の長さは、リーダー データベースのメタデータ全体のサイズに応じて異なります。 リーダー データベースとフォロワー データベースでは、データをフェッチするために同じストレージ アカウントが使用されます。 ストレージを所有するのはリーダー データベースです。 フォロワー データベースでは、データを取り込むことなくデータを表示できます。 アタッチされたデータベースは読み取り専用のデータベースであるため、データベース内のデータ、テーブル、およびポリシーの変更はできませんが、キャッシュ ポリシープリンシパル、およびアクセス許可の変更は可能です。 アタッチされたデータベースは削除できません。 これらは、リーダーまたはフォロワーによってデタッチされた後にのみ、削除できます。

フォロワー機能を使った別のクラスターへのデータベースのアタッチは、組織とチームの間でデータを共有するためのインフラストラクチャとして使用されます。 この機能は、非運用環境のユース ケースから運用環境を保護するためにコンピューティング リソースを分離するのに役立ちます。 また、フォロワーを使うことで、Azure Data Explorer クラスターのコストを、そのデータに対してクエリを実行するパーティーに関連付けることができます。

以前の SDK バージョンに基づくコード サンプルについては、 アーカイブされた記事を参照してください。

フォロー対象データベース

  • クラスターでは、1 つのデータベース、複数のデータベース、またはリーダー クラスターのすべてのデータベースをフォローできます。
  • 単一のクラスターでは、複数のリーダー クラスターのデータベースをフォローできます。
  • クラスターには、フォロワー データベースとリーダー データベースの両方を含めることができます。

前提条件

データベースのアタッチ

データベースのアタッチにはさまざまな方法があります。 この記事では、C#、Python、PowerShell、または Azure Resource Manager テンプレートを使用してデータベースをアタッチする方法について説明します。 データベースをアタッチするには、リーダー クラスターとフォロワー クラスターに対して少なくとも共同作成者ロールを持つユーザー、グループ、サービス プリンシパル、またはマネージド ID が必要です。 Azure portalPowerShellAzure CLIARM テンプレートを使用して、ロールの割り当てを追加または削除します。 詳細については、Azure のロールベースのアクセス制御 (Azure RBAC) および各種ロールに関する記事をご覧ください。

テーブル レベルの共有

データベースにすべてのテーブルをアタッチすると、外部テーブルと具体化されたビューもそれに従います。 'TableLevelSharingProperties' を構成することで、特定のテーブル、外部テーブル、具体化されたビューを共有できます。

'TableLevelSharingProperties' には、および functionsToExcludeの 8 つの文字列materializedViewsToIncludetablesToExcludefunctionsToIncludetablesToIncludeexternalTablesToIncludeexternalTablesToExcludematerializedViewsToExclude配列が含まれています。 すべての配列の最大エントリ数は合計で 100 です。

Note

  • '*' すべてのデータベースの表記を使用している場合、テーブル レベルの共有はサポートされません。
  • 具体化されたビューを含める場合は、それらのソース テーブルも含まれます。

  1. すべてのテーブルを含めます。 すべてのテーブルが既定でフォローされるため、'*' は不要です。

    tablesToInclude = []
    
  2. 名前が "Logs" で始まるテーブルをすべて含める場合:

    tablesToInclude = ["Logs*"]
    
  3. すべての外部テーブルを除外する場合:

    externalTablesToExclude = ["*"]
    
  4. すべての具体化されたビューを除外する場合:

    materializedViewsToExclude=["*"]
    

データベース名のオーバーライド

必要に応じて、フォロワー クラスター内のデータベース名をリーダー クラスターとは異なる名前にすることができます。 たとえば、複数のリーダー クラスターからフォロワー クラスターに同じデータベース名をアタッチできます。 別のデータベース名を指定するには、'DatabaseNameOverride' または 'DatabaseNamePrefix' プロパティを構成します。

C# を使用したデータベースのアタッチ

必要な NuGet パッケージ

C# の例

var tenantId = "xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxx"; //Directory (tenant) ID
var clientId = "xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxx"; //Application ID
var clientSecret = "PlaceholderClientSecret"; //Client Secret
var followerSubscriptionId = "xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxx";
var credentials = new ClientSecretCredential(tenantId, clientId, clientSecret);
var resourceManagementClient = new ArmClient(credentials, followerSubscriptionId);
var followerResourceGroupName = "followerResourceGroup";
var followerClusterName = "follower";
var subscription = await resourceManagementClient.GetDefaultSubscriptionAsync();
var resourceGroup = (await subscription.GetResourceGroupAsync(followerResourceGroupName)).Value;
var cluster = (await resourceGroup.GetKustoClusterAsync(followerClusterName)).Value;
var attachedDatabaseConfigurations = cluster.GetKustoAttachedDatabaseConfigurations();
var attachedDatabaseConfigurationName = "attachedDatabaseConfiguration"
var leaderSubscriptionId = "xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxx";
var leaderResourceGroup = "leaderResourceGroup";
var leaderClusterName = "leader";
var attachedDatabaseConfigurationData = new KustoAttachedDatabaseConfigurationData
{
    ClusterResourceId = new ResourceIdentifier($"/subscriptions/{leaderSubscriptionId}/resourceGroups/{leaderResourceGroup}/providers/Microsoft.Kusto/Clusters/{leaderClusterName}"),
    DatabaseName = "<databaseName>", // Can be a specific database name in a leader cluster or * for all databases
    DefaultPrincipalsModificationKind = KustoDatabaseDefaultPrincipalsModificationKind.Union,
    Location = AzureLocation.NorthCentralUS
};
// Table level sharing properties are not supported when using '*' all databases notation.
if (attachedDatabaseConfigurationData.DatabaseName != "*")
{
    // Set up the table level sharing properties - the following is just an example.
    attachedDatabaseConfigurationData.TableLevelSharingProperties = new KustoDatabaseTableLevelSharingProperties();
    attachedDatabaseConfigurationData.TableLevelSharingProperties.TablesToInclude.Add("table1");
    attachedDatabaseConfigurationData.TableLevelSharingProperties.TablesToExclude.Add("table2");
    attachedDatabaseConfigurationData.TableLevelSharingProperties.ExternalTablesToExclude.Add("exTable1");
    attachedDatabaseConfigurationData.TableLevelSharingProperties.ExternalTablesToInclude.Add("exTable2");
    attachedDatabaseConfigurationData.TableLevelSharingProperties.MaterializedViewsToInclude.Add("matTable1");
    attachedDatabaseConfigurationData.TableLevelSharingProperties.MaterializedViewsToExclude.Add("matTable2");
    attachedDatabaseConfigurationData.TableLevelSharingProperties.FunctionsToInclude.Add("func1");
    attachedDatabaseConfigurationData.TableLevelSharingProperties.FunctionsToExclude.Add("func2");
}
await attachedDatabaseConfigurations.CreateOrUpdateAsync(WaitUntil.Completed, attachedDatabaseConfigurationName, attachedDatabaseConfigurationData);

データベースが正常にアタッチされたことを確認する

データベースが正常にアタッチされたことを確認するには、Azure portal でアタッチされたデータベースを見つけます。 フォロワーまたはリーダー のクラスターでデータベースが正常にアタッチされたことを確認できます。

フォロワー クラスターを確認する

  1. フォロワー クラスターを参照し、[データベース] を選択 します

  2. データベースの一覧で、新しい読み取り専用データベースを検索します。

    ポータルの読み取り専用フォロワー データベースのスクリーンショット。

    この一覧は、データベースの概要ページでも表示できます。

    フォロワー クラスターの一覧を含むデータベースの概要ページのスクリーンショット。

リーダー クラスターを確認する

  1. リーダー クラスターを参照し、 [データベース] を選択します

  2. 関連するデータベースの [他のユーザーと共有][はい] に設定されていることを確認します。

  3. リレーションシップ リンクを切り替えて詳細を表示します。

    リーダー クラスターに他のユーザーと共有されているデータベースチェックスクリーンショット。

    これは、データベースの概要ページでも確認できます。

    他のユーザーと共有されているデータベースの一覧を含む概要のスクリーンショット。

フォロワー データベースをデタッチする

Note

フォロワーまたはリーダー側からデータベースをデタッチするには、データベースをデタッチするクラスターに対して少なくとも共同作成者ロールを持つユーザー、グループ、サービス プリンシパル、またはマネージド ID が必要です。 下の例では、サービス プリンシパルを使用します。

C#** を使用して、フォロワー クラスターにアタッチされたフォロワー データベースをデタッチする

フォロワー クラスターにアタッチされたフォロワー データベースは、次の方法でデタッチできます。

var tenantId = "xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxx"; //Directory (tenant) ID
var clientId = "xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxx"; //Application ID
var clientSecret = "PlaceholderClientSecret"; //Client Secret
var followerSubscriptionId = "xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxx";
var credentials = new ClientSecretCredential(tenantId, clientId, clientSecret);
var resourceManagementClient = new ArmClient(credentials, followerSubscriptionId);
var followerResourceGroupName = "testrg";
//The cluster and database attached database configuration are created as part of the prerequisites
var followerClusterName = "follower";
var attachedDatabaseConfigurationsName = "attachedDatabaseConfiguration";
var subscription = await resourceManagementClient.GetDefaultSubscriptionAsync();
var resourceGroup = (await subscription.GetResourceGroupAsync(followerResourceGroupName)).Value;
var cluster = (await resourceGroup.GetKustoClusterAsync(followerClusterName)).Value;
var attachedDatabaseConfiguration = (await cluster.GetKustoAttachedDatabaseConfigurationAsync(attachedDatabaseConfigurationsName)).Value;
await attachedDatabaseConfiguration.DeleteAsync(WaitUntil.Completed);

C# を使用して、リーダー クラスターにアタッチされたフォロワー データベースをデタッチする

リーダー クラスターにアタッチされたデータベースは、次の方法でデタッチできます。

var tenantId = "xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxx"; //Directory (tenant) ID
var clientId = "xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxx"; //Application ID
var clientSecret = "PlaceholderClientSecret"; //Client Secret
var leaderSubscriptionId = "xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxx";
var credentials = new ClientSecretCredential(tenantId, clientId, clientSecret);
var resourceManagementClient = new ArmClient(credentials, leaderSubscriptionId);
var leaderResourceGroupName = "testrg";
var leaderClusterName = "leader";
var subscription = await resourceManagementClient.GetDefaultSubscriptionAsync();
var resourceGroup = (await subscription.GetResourceGroupAsync(leaderResourceGroupName)).Value;
var cluster = (await resourceGroup.GetKustoClusterAsync(leaderClusterName)).Value;
var followerSubscriptionId = "xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxx";
var followerResourceGroupName = "followerResourceGroup";
//The cluster and attached database configuration that are created as part of the Prerequisites
var followerClusterName = "follower";
var attachedDatabaseConfigurationsName = "attachedDatabaseConfiguration";
var followerDatabaseDefinition = new KustoFollowerDatabaseDefinition(
    clusterResourceId: new ResourceIdentifier($"/subscriptions/{followerSubscriptionId}/resourceGroups/{followerResourceGroupName}/providers/Microsoft.Kusto/Clusters/{followerClusterName}"),
    attachedDatabaseConfigurationName: attachedDatabaseConfigurationsName
);
await cluster.DetachFollowerDatabasesAsync(WaitUntil.Completed, followerDatabaseDefinition);

プリンシパル、アクセス許可、キャッシュ ポリシーの管理

プリンシパルの管理

データベースをアタッチするときは、 "既定のプリンシパル変更の種類" を指定します。 既定では、オーバーライドの承認されたプリンシパルと、承認されたプリンシパルのリーダー データベース コレクションを組み合わせます。

種類 説明
Union (結合) アタッチされたデータベース プリンシパルには、元のデータベース プリンシパルと、フォロワー データベースに追加されたその他の新しいプリンシパルが常に含まれます。
Replace 元のデータベースから継承されるプリンシパルはありません。 アタッチされたデータベース用に新しいプリンシパルを作成する必要があります。
なし アタッチされたデータベース プリンシパルには、元のデータベースのプリンシパルのみが含まれます。その他のプリンシパルはありません。

管理コマンドを使用して承認されたプリンシパルを構成する方法の詳細については、「 フォロワー クラスターを管理するための管理コマンド」を参照してください。

アクセス許可の管理

読み取り専用データベースのアクセス許可は、他のデータベースの種類と同じ方法で管理できます。 アクセス許可を割り当てるには、「Azure portalでデータベースのアクセス許可を管理する」を参照するか、管理コマンドを使用してデータベース セキュリティ ロールを管理します。

キャッシュ ポリシーの構成

フォロワー データベースの管理者は、ホスティング クラスター上でアタッチされたデータベースまたはその任意のテーブルのキャッシュ ポリシー を変更できます。 既定では、リーダー クラスター データベースのソース データベースとテーブルレベルのキャッシュ ポリシーは、データベースで定義されているポリシーとテーブルレベルのオーバーライド ポリシーと組み合わされます。 たとえば、リーダー データベースでは月次レポートを実行するために 30 日間のキャッシュ ポリシーを設定し、フォロワー データベースでは、トラブルシューティング用に最新のデータのみのクエリを実行するため、3 日間のキャッシュ ポリシーを設定することができます。 管理コマンドを使用してフォロワー データベースまたはテーブルのキャッシュ ポリシーを構成する方法の詳細については、「フォロワー クラスターを管理するための管理コマンド」を参照してください。

Notes

  • リーダー/フォロワー クラスターのデータベース間に競合がある場合、フォロワー クラスターがすべてのデータベースをフォローすると、次のように解決されます。
    • フォロワー クラスターで作成された DB という名前のデータベースは、リーダー クラスターで作成された同じ名前のデータベースよりも優先されます。 そのため、フォロワー クラスターでリーダーのデータベース DB を含めるために、フォロワー クラスターのデータベース DB を削除または名前変更する必要があります。
    • 2 つ以上のリーダー クラスターからフォローされる DB という名前のデータベースは、リーダー クラスターの "いずれか" から任意に選択され、複数回フォローされなくなります。
  • クラスターのアクティビティ ログと履歴を表示するためのコマンドをフォロワー クラスターで実行すると、フォロワー クラスターのアクティビティと履歴が表示され、その結果セットには、1 つ以上のリーダー クラスターのそれらの結果は含まれません。
    • たとえば、.show queries コマンドをフォロワー クラスターで実行すると、フォロワー クラスターがフォローするデータベースで実行されたクエリのみが表示され、リーダー クラスター内の同じデータベースに対して実行されたクエリは表示されません。

制限事項

  • フォロワー クラスターとリーダー クラスターは、同じリージョンに存在する必要があります。
  • フォロー対象のデータベースでストリーミング インジェストが使用されている場合は、ストリーミング インジェスト データをフォローできるように、フォロワー クラスターでストリーミング インジェストを有効にする必要があります。
  • カスタマー マネージド キー (CMK) を使用したデータ暗号化を使用したクラスターのフォローは、次の制限でサポートされます。
    • フォロワー クラスターもリーダー クラスターも、他のクラスターに従いません。
    • フォロワー クラスターが CMK が有効になっているリーダー クラスターをフォローしていて、キーへのリーダーのアクセスが取り消された場合、リーダークラスターとフォロワー クラスターの両方が中断されます。 このような場合は、CMK の問題を解決してからフォロワー クラスターを再開するか、フォロワー クラスターからフォロワー データベースをデタッチしてリーダー クラスターから独立して再開することができます。
  • 別のクラスターにアタッチされているデータベースは、デタッチ前に削除することはできません。
  • 別のクラスターにアタッチされているデータベースを持つクラスターは、デタッチ前に削除することはできません。
  • すべてのデータベースをフォローする場合、テーブル レベルの共有プロパティはサポートされません。
  • フォロワー データベースでは、認証方法としてマネージド ID を使用する外部テーブルに対してクエリを実行するには、マネージド ID をフォロワー クラスターに追加する必要があります。 リーダー クラスターとフォロワー クラスターが異なるテナントにプロビジョニングされている場合、この機能は機能しません。

次のステップ