使用粉丝数据库

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

使用关注器功能将数据库附加到其他群集用作基础结构,用于在组织和团队之间共享数据。 此功能可用于隔离计算资源,以保护生产环境免受非生产用例的防护。 Follower 还可以用于将 Azure 数据浏览器群集的成本与在数据上运行查询的参与方相关联。

遵循哪些数据库?

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

先决条件

附加数据库

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

表级共享

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

TableLevelSharingProperties”包含八个字符串数组:tablesToInclude、、tablesToExclude、、externalTablesToIncludeexternalTablesToExcludematerializedViewsToIncludematerializedViewsToExcludefunctionsToIncludefunctionsToExclude。 所有数组中的最大条目数为 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 天的缓存策略来运行每月报告,对后续数据库使用三天的缓存策略,以便仅查询最近的数据进行故障排除。 有关使用控制命令在关注器数据库或表上配置缓存策略的详细信息,请参阅 用于管理关注者群集的控制命令

注释

  • 如果领导者/从属群集的数据库之间存在冲突,当所有数据库的状态与从属群集一致时,它们将按如下方式解决:
    • 在后继群集 上创建的数据库 优先于在前导群集上创建的名称相同的数据库。 这就是为什么需要删除或重命名后继群集中的数据库 DB ,以便让后继群集包含领导者的数据库 DB
    • 从两个或更多领导群集中的一个随机选择一个名为 DB 的数据库,并且不会被重复选择。
  • 用于在从属群集上显示 群集活动日志和历史记录 的命令将会显示该从属群集的活动和历史记录结果集,而不会包含主导群集或其他群集的结果。
    • 例如:在后继群集上运行的 .show queries 命令只会显示在后跟群集的数据库上运行的查询,而不是针对前导群集中的同一数据库运行的查询。

局限性

  • 后续群集和领导者群集必须位于同一区域。
  • 如果在正在关注的数据库上使用 流式引入 ,则应为流式引入启用后继群集以允许关注流式引入数据。
  • 领导者群集和关注者群集不支持使用 客户托管密钥 的数据加密。
  • 在分离数据库之前,无法删除附加到其他群集的数据库。
  • 在将数据库从其他群集中分离之前,您无法删除该群集。
  • 在使用所有数据库时,不支持表级共享属性。

后续步骤