使用后继数据库

使用后继数据库功能可将另一群集中的数据库附加到 Azure 数据资源管理器群集。 后继数据库以只读模式附加,因此可以查看其数据,并针对已引入先导数据库的数据运行查询。 后继数据库会同步先导数据库中的更改。 由于同步的缘故,数据可用性方面会存在几秒钟到几分钟的数据延迟。 具体的延迟时长取决于先导数据库元数据的总体大小。 先导数据库和后继数据库使用相同的存储帐户来提取数据。 存储由先导数据库拥有。 后继数据库无需引入数据即可查看数据。 由于附加的数据库是只读的数据库,因此无法修改数据库中除缓存策略主体权限以外的其他数据、表和策略。 无法删除附加的数据库。 这些数据库必须先由先导数据库或后继数据库分离,然后才能将其删除。

使用后继功能将数据库附加到不同群集是在组织与团队之间共享数据的基础结构。 此功能可用于隔离计算资源,以防止将生产环境用于非生产用例。 后继功能还可用于将 Azure 数据资源管理器群集的成本关联到对数据运行查询的一方。

哪些数据库是后继数据库?

  • 一个群集可以后继先导群集中的一个数据库、多个数据库或所有数据库。
  • 单个群集可以后继多个先导群集中的数据库。
  • 一个群集可以同时包含后继数据库和先导数据库。
  • EngineV3 群集只能遵循 EngineV3 群集;类似地,EngineV2 群集只能遵循 V2 群集。

先决条件

附加数据库

可以使用多种方法来附加数据库。 本文介绍如何使用 C#、Python、PowerShell 或 Azure 资源管理器模板来附加数据库。 若要附加数据库,必须在先导群集和后继群集上拥有至少具有参与者角色的用户、组、服务主体或托管标识。 使用 Azure 门户PowerShellAzure CLIARM 模板来添加或删除角色分配。 深入了解 Azure 基于角色的访问控制 (Azure RBAC)不同角色

表级别共享

附加数据库时,还会附加所有表、外部表和具体化视图。 可以通过配置“TableLevelSharingProperties”来共享特定表/外部表/具体化视图。

“TableLevelSharingProperties”包含八个字符串数组:tablesToIncludetablesToExcludeexternalTablesToIncludeexternalTablesToExcludematerializedViewsToIncludematerializedViewsToExcludefunctionsToIncludefunctionsToExclude。 所有数组中的最大条目数之和为 100。

注意

使用“*”所有数据库表示法时,不支持表级共享。

注意

如果包含具体化视图,则也会包含它们的源表。

示例

  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 = await ApplicationTokenProvider.LoginSilentAsync(tenantId, clientId, clientSecret);
var resourceManagementClient = new KustoManagementClient(credentials) { SubscriptionId = followerSubscriptionId };
var followerResourceGroupName = "followerResourceGroup";
var followerClusterName = "follower";
var attachedDatabaseConfigurationName = "attachedDatabaseConfiguration"
var leaderSubscriptionId = "xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxx";
var leaderResourceGroup = "leaderResourceGroup";
var leaderClusterName = "leader";
var attachedDatabaseConfigurationData = new AttachedDatabaseConfiguration
{
    ClusterResourceId = $"/subscriptions/{leaderSubscriptionId}/resourceGroups/{leaderResourceGroup}/providers/Microsoft.Kusto/Clusters/{leaderClusterName}",
    DatabaseName = "<databaseName>", // Can be specific database name or * for all databases
    DefaultPrincipalsModificationKind = "Union",
    Location = "North Central US"
};
// 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 TableLevelSharingProperties(
        tablesToInclude:new List<string> { "table1" },
        tablesToExclude:new List<string> { "table2" },
        externalTablesToInclude:new List<string> { "exTable1" },
        externalTablesToExclude:new List<string> { "exTable2" },
        materializedViewsToInclude:new List<string> { "matTable1" },
        materializedViewsToExclude:new List<string> { "matTable2" }
    );
}
await resourceManagementClient.AttachedDatabaseConfigurations.CreateOrUpdateAsync(
    followerResourceGroupName, followerClusterName, attachedDatabaseConfigurationName, attachedDatabaseConfigurationData
);

验证是否已成功附加数据库

若要验证是否已成功附加数据库,请在 Azure 门户中找到附加的数据库。 可以验证数据库是否已成功附加到后继群集或先导群集。

检查后继群集

  1. 浏览到后继群集并选择“数据库”。

  2. 在数据库列表中搜索新的只读数据库。

    屏幕截图显示门户中只读的后继数据库。

    还可以在数据库概述页中查看此列表:

    数据库概述页的屏幕截图,其中列出了后继群集。

检查先导群集

  1. 浏览到先导群集并选择“数据库”

  2. 检查相关数据库是否标记为“与其他数据库共享”“是”

  3. 切换关系链接以查看详细信息。

    屏幕截图显示与其他人共享的数据库,可用于查看先导群集。

    还可以在数据库概述页中查看此信息:

    概述页的屏幕截图,其中列出了与其他人共享的数据库。

分离后继数据库

注意

若要从后继或先导方拆离数据库,必须在分离数据库的群集上拥有至少具有参与者角色的用户、组、服务主体或托管标识。 在下面的示例中,我们使用服务主体。

使用 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 = await ApplicationTokenProvider.LoginSilentAsync(tenantId, clientId, clientSecret);
var resourceManagementClient = new KustoManagementClient(credentials) { SubscriptionId = followerSubscriptionId };
var followerResourceGroupName = "testrg";
//The cluster and database attached database configuration are created as part of the prerequisites
var followerClusterName = "follower";
var attachedDatabaseConfigurationsName = "attachedDatabaseConfiguration";
await resourceManagementClient.AttachedDatabaseConfigurations.DeleteAsync(
    followerResourceGroupName, followerClusterName, attachedDatabaseConfigurationsName
);

使用 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 = await ApplicationTokenProvider.LoginSilentAsync(tenantId, clientId, clientSecret);
var resourceManagementClient = new KustoManagementClient(credentials) { SubscriptionId = leaderSubscriptionId };
var leaderResourceGroupName = "testrg";
var leaderClusterName = "leader";
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 FollowerDatabaseDefinition
{
    ClusterResourceId = $"/subscriptions/{followerSubscriptionId}/resourceGroups/{followerResourceGroupName}/providers/Microsoft.Kusto/Clusters/{followerClusterName}",
    AttachedDatabaseConfigurationName = attachedDatabaseConfigurationsName
};
await resourceManagementClient.Clusters.DetachFollowerDatabasesAsync(
    leaderResourceGroupName, leaderClusterName, followerDatabaseDefinition
);

管理主体、权限和缓存策略

管理主体

附加数据库时,请指定“默认主体修改类型”。 默认设置是将替代授权主体与已授权主体的先导数据库集合组合使用

种类 说明
联合 附加的数据库主体将会始终包括原始数据库主体,以及添加到后继数据库的其他新主体。
不会从原始数据库继承主体。 必须为附加的数据库创建新主体。
附加的数据库主体只包括原始数据库的主体,而不包括其他主体。

有关使用控制命令配置已授权主体的详细信息,请参阅用于管理后继群集的控制命令

管理权限

所有只读数据库类型的权限管理方式都是相同的。 请参阅在 Azure 门户中管理权限

配置缓存策略

后继数据库管理员可以修改附加数据库或者该数据库在托管群集上的任何表的缓存策略。 默认设置是将先导群集中的源数据库的数据库级和表级缓存策略将与数据库级和表级替代策略中定义的策略组合使用。 例如,可对先导数据库使用一个 30 天缓存策略以运行每月报告,并对后继数据库使用一个 3 天缓存策略,以仅查询最近的数据进行故障排除。 有关使用控制命令对后继数据库或表配置缓存策略的详细信息,请参阅用于管理后继群集的控制命令

注释

  • 如果先导/后继群集的数据库之间存在冲突,则在所有数据库都被该后继群集后继时,这些数据库的解析方式如下:
    • 在后继群集上创建的名为 DB 的数据库优先于在先导群集上创建的同名数据库。 因此,需要删除或重命名后继群集中的数据库 DB,以使后继群集包括先导群集的数据库 DB 。
    • 将会从某一个先导群集中任意选择两个或多个先导群集中被后继的名为 DB 的数据库,并且该数据库被后继的次数不会多于一次 。
  • 在某个后继群集上运行的用于显示群集活动日志和历史记录的命令将会显示该后继群集上的活动和历史记录,并且这些命令的结果集不会包括一个或多个先导群集的相应结果。
    • 例如:在后继群集上运行的 .show queries 命令将只显示在由后继群集后继的数据库上运行的查询,而不会显示针对先导群集中同一数据库运行的查询。

限制

  • 后继和先导群集必须位于同一区域。
  • 如果对后继数据库使用了流式引入,则应启用后继群集进行流式引入,以允许流式引入数据跟随。
  • 先导和后继群集都不支持使用客户管理的密钥进行数据加密。
  • 在分离已附加到其他群集的数据库之前,无法删除该数据库。
  • 在分离包含已附加到其他群集的数据库的群集之前,无法删除该群集。
  • 后继所有数据库时,不支持表级共享属性。

后续步骤