Использование баз данных подписчиков

Функция базы данных подписчиков позволяет присоединить базу данных, расположенную в другом кластере, к кластеру Azure Data Explorer. База данных подписчиков присоединяется в режиме только для чтения, что позволяет просматривать данные и выполнять запросы по данным, которые были переданы в базу данных руководителя. База данных подписчика синхронизирует изменения в базах данных руководителя. Из-за синхронизации данных возможны задержки доступа к данным продолжительностью от нескольких секунд до нескольких минут. Продолжительность временной задержки зависит от общего размера метаданных базы данных руководителя. Базы данных руководителя и подписчиков используют одну учетную запись хранения для выборки данных. Владельцем хранилища является руководитель базы данных. База данных подписчика считывает данные без необходимости их приема. Поскольку присоединенная база данных доступна только для чтения, данные, таблицы и политики в базе данных нельзя изменить, за исключением политики кэширования, субъектов и разрешений. Подключенные базы данных нельзя удалить. Сначала руководитель или подписчик должен отключить их, и только после этого их можно удалить.

Присоединение базы данных к другому кластеру с помощью функции подписчиков используется в качестве инфраструктуры для обмена данными между организациями и группами. Эта функция полезна для разделения вычислительных ресурсов и защиты рабочей среды от использования не по назначению. Функцию подписчиков можно использовать для связи стоимости кластера Azure Data Explorer со стороной, которая выполняет запросы по данным.

На какие базы данных можно подписываться?

  • Кластер может подписываться к одной базе данных, нескольким базам данных или всем базам данных в кластере руководителя.
  • Один кластер может подписываться на базы данных из нескольких серверов руководителя.
  • Кластер может содержать как базы данных подписчиков, так и базы данных руководителя.
  • Кластеры EngineV3 могут подписываться только на кластеры EngineV3, как и кластеры EngineV2 могут подписываться только на кластеры EngineV2.

Предварительные требования

Присоединение базы данных

Существует несколько методов для присоединения базы данных. В этой статье обсуждается подключение базы данных с помощью C#, Python, PowerShell или шаблона Azure Resource Manager. Чтобы присоединить базу данных, необходимо иметь учетную запись пользователя, группы, субъекта-службы или управляемое удостоверение по крайней мере с ролью участника в кластере руководителя и в кластере подписчика. Добавьте или удалите назначения ролей с помощью портала Azure, PowerShell, Azure CLI и шаблона ARM. Узнайте больше об управлении доступом на основе ролей Azure (Azure RBAC) и различных ролях.

Общий доступ на уровне таблиц

При присоединении базы данных подписчики также могут читать все таблицы, внешние таблицы и материализованные представления. Вы можете предоставить общий доступ к конкретным таблицам, внешним таблицам или материализованным представлениям, настроив параметр TableLevelSharingProperties.

TableLevelSharingProperties содержит восемь массивов строк: tablesToInclude, tablesToExclude, , externalTablesToIncludeexternalTablesToExclude, materializedViewsToInclude, materializedViewsToExcludefunctionsToInclude, и functionsToExclude. Максимальное число записей во всех массивах равно 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
);

Управление субъектами, разрешениями и политикой кэширования

Управление субъектами

При присоединении базы данных укажите параметр тип изменения субъектов по умолчанию. По умолчанию переопределяемые полномочные субъекты объединяются с коллекцией баз данных ведущего кластера, включающей полномочные субъекты.

Вид Описание
Union Присоединенные субъекты базы данных всегда включают исходные субъекты базы данных и другие новые субъекты, добавленные в базу данных подписчиков.
Заменить Нет наследования субъектов от исходной базы данных. Для присоединенной базы данных необходимо создать новые субъекты.
None Присоединенные субъекты базы данных включают только субъекты исходной базы данных без других субъектов.

Дополнительные сведения об использовании команд управления для настройки уполномоченных субъектов см. в разделе Команды управления кластером подписчиков.

Управление разрешениями

Управление разрешением на доступ к базе данных только для чтения осуществляется так же, как и для всех типов баз данных. См. Управление разрешениями на портале Azure.

Настройка политики кэширования

Администратор базы данных подписчиков может изменить политику кэширования присоединенной базы данных или любой из ее таблиц в кластере размещения. По умолчанию базы данных-источника в базе данных ведущего кластера и политики кэширования на уровне таблиц объединяются с политиками, определенными в базе данных, и политиками переопределения на уровне таблиц. Например, можно использовать политику кэширования на протяжении 30 дней в базе данных руководителя для ежемесячного создания отчетов и политику кэширования на протяжении трех дней в базе данных подписчиков, чтобы запрашивать только последние данные по устранению неполадок. Дополнительные сведения об использовании команд управления для настройки политики кэширования в базе данных или таблице подписчиков см. в разделе Команды управления кластером подписчиков.

Примечания

  • При возникновении конфликтов между базами данных в кластерах руководителя и подписчиков, если за всеми базами данных следит кластер подписчиков, они разрешаются следующим образом:
    • База данных с именем DB, созданная в кластере подписчиков, имеет приоритет над базой данных с тем же именем, которая была создана в кластере руководителя. Именно поэтому необходимо удалить или переименовать базу данных DB в кластере подписчиков, чтобы включить базу данных DB руководителя.
    • База данных с именем DB, за которой следят два или больше кластеров руководителя, произвольно выбирается из одного из кластеров руководителя и отслеживается не более одного раза.
  • Команды для отображения журнала и истории действий в кластере, выполняются в кластере подписчиков и показывают активность и историю в кластере подписчиков, и их результирующие наборы не будут содержать результаты кластеров руководителя.
    • Например, команда .show queries, выполняемая в кластере подписчиков, позволяет просмотреть только запросы, запущенные в базах данных, за которыми следит кластер подписчиков, но не запросы, выполняемые в той же базе данных в кластере руководителя.

Ограничения

  • Кластеры подписчиков и руководителя должны находиться в одном регионе.
  • Если для отслеживаемой базы данных применяется Потоковый прием данных, кластер подписчиков также должен использовать потоковый прием данных, чтобы обрабатывать отслеживание данных потокового приема.
  • Шифрование данных с помощью управляемых клиентом ключей не поддерживается ни в кластерах руководителя, ни в кластерах подписчиков.
  • Невозможно удалить базу данных, присоединенную к другому кластеру, не отсоединив ее.
  • Невозможно удалить кластер, к которому присоединена база данных, присоединенная к другому кластеру, не отсоединив ее.
  • Общий доступ на уровне таблиц не поддерживается при подписке на все базы данных.

Дальнейшие действия