Använda uppföljningsdatabaser

Med följande databasfunktion kan du koppla en databas som finns i ett annat kluster till ditt Azure Data Explorer-kluster. Följdatabasen är ansluten i skrivskyddat läge, vilket gör det möjligt att visa data och köra frågor på de data som matades in i ledardatabasen. Uppföljningsdatabasen synkroniserar ändringar i ledardatabaserna. På grund av synkroniseringen finns det en datafördröjning på några sekunder till några minuter i datatillgängligheten. Längden på tidsfördröjningen beror på den totala storleken på leaderdatabasens metadata. Databaserna för ledare och följare använder samma lagringskonto för att hämta data. Lagringen ägs av leader-databasen. Den följande databasen visar data utan att behöva mata in dem. Eftersom den anslutna databasen är en skrivskyddad databas kan data, tabeller och principer i databasen inte ändras förutom för cachelagringsprinciper, huvudkonton och behörigheter. Det går inte att ta bort anslutna databaser. De måste kopplas från av ledaren eller följaren och först då kan de tas bort.

Att koppla en databas till ett annat kluster med hjälp av uppföljningsfunktionen används som infrastruktur för att dela data mellan organisationer och team. Funktionen är användbar för att särskilja beräkningsresurser för att skydda en produktionsmiljö från användningsfall utanför produktion. Följare kan också användas för att associera kostnaden för Azure Data Explorer kluster med den part som kör frågor på data.

Kodexempel baserade på tidigare SDK-versioner finns i den arkiverade artikeln.

Vilka databaser följs?

  • Ett kluster kan följa en databas, flera databaser eller alla databaser i ett ledarkluster.
  • Ett enda kluster kan följa databaser från flera ledarkluster.
  • Ett kluster kan innehålla både uppföljningsdatabaser och ledardatabaser.

Förutsättningar

Ansluta en databas

Det finns olika metoder som du kan använda för att koppla en databas. I den här artikeln diskuterar vi hur du kopplar en databas med hjälp av C#, Python, PowerShell eller en Azure Resource Manager-mall. Om du vill koppla en databas måste du ha användare, grupp, tjänstens huvudnamn eller hanterad identitet med minst deltagarroll i leader-klustret och följarklustret. Lägg till eller ta bort rolltilldelningar med hjälp av mallen Azure Portal, PowerShell, Azure CLI och ARM. Läs mer om rollbaserad åtkomstkontroll i Azure (Azure RBAC) och de olika rollerna.

Delning på tabellnivå

När du kopplar databasen till alla tabeller följs även externa tabeller och materialiserade vyer. Du kan dela specifika tabeller/externa tabeller/materialiserade vyer genom att konfigurera TableLevelSharingProperties.

TableLevelSharingProperties innehåller åtta matriser med strängar: tablesToInclude, tablesToExclude, externalTablesToInclude, externalTablesToExclude, materializedViewsToInclude, materializedViewsToExclude, , functionsToIncludeoch functionsToExclude. Det maximala antalet poster i alla matriser tillsammans är 100.

Anteckning

  • Delning på tabellnivå stöds inte när du använder notationen "*" för alla databaser.
  • När materialiserade vyer ingår inkluderas även deras källtabeller.

Exempel

  1. Inkludera alla tabeller. Ingen *- krävs eftersom alla tabeller följs av standardinställningen:

    tablesToInclude = []
    
  2. Inkludera alla tabeller med namn som börjar med "Loggar":

    tablesToInclude = ["Logs*"]
    
  3. Exkludera alla externa tabeller:

    externalTablesToExclude = ["*"]
    
  4. Undanta alla materialiserade vyer:

    materializedViewsToExclude=["*"]
    

Åsidosättning av databasnamn

Du kan också göra databasnamnet i uppföljningsklustret annorlunda än leaderklustret. Du kanske till exempel vill koppla samma databasnamn från flera leaderkluster till ett följarkluster. Om du vill ange ett annat databasnamn konfigurerar du egenskapen DatabaseNameOverride eller DatabaseNamePrefix.

Koppla en databas med C#

Nödvändiga NuGet-paket

C#-exempel

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);

Kontrollera att databasen har kopplats

Om du vill kontrollera att databasen har anslutits hittar du dina anslutna databaser i Azure Portal. Du kan kontrollera att databaserna har anslutits i antingen uppföljnings - eller ledarklustren .

Kontrollera ditt uppföljningskluster

  1. Bläddra till uppföljningsklustret och välj Databaser.

  2. Sök efter nya skrivskyddade databaser i databaslistan.

    Skärmbild av skrivskyddade efterföljardatabaser i portalen.

    Du kan också visa den här listan på översiktssidan för databasen:

    Skärmbild av översiktssidan för databaser med en lista över följarkluster.

Kontrollera ditt ledarkluster

  1. Bläddra till leaderklustret och välj Databaser

  2. Kontrollera att relevanta databaser har markerats som DELADE MED ANDRA>Ja

  3. Växla relationslänken för att visa information.

    Skärmbild av databaser som delas med andra för att kontrollera leaderklustret.

    Du kan också visa detta på översiktssidan för databasen:

    Skärmbild av översikt med en lista över databaser som delas med andra.

Koppla från efterföljardatabasen

Anteckning

Om du vill koppla från en databas från uppföljnings- eller ledarsidan måste du ha användare, grupp, tjänsthuvudnamn eller hanterad identitet med minst deltagarroll i klustret som du kopplar från databasen från. I exemplet nedan använder vi tjänstens huvudnamn.

Koppla från den anslutna följardatabasen från uppföljningsklustret med C#**

Följeklustret kan koppla från alla anslutna uppföljningsdatabaser på följande sätt:

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);

Koppla från den anslutna uppföljningsdatabasen från leader-klustret med hjälp av C#

Leader-klustret kan koppla från alla anslutna databaser på följande sätt:

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);

Hantera principer för huvudkonton, behörigheter och cachelagring

Hantera huvudkonton

När du kopplar en databas anger du "standardhuvudnamnens ändringstyp". Standardinställningen är att kombinera åsidosättningsauktoriserade huvudkonton med leaderdatabassamlingen av auktoriserade huvudkonton

Variant Beskrivning
Unionen De anslutna databashuvudkontona innehåller alltid de ursprungliga databashuvudkontona plus andra nya huvudnamn som läggs till i efterföljardatabasen.
Ersätt Inget arv av huvudkonton från den ursprungliga databasen. Nya huvudkonton måste skapas för den anslutna databasen.
Ingen De kopplade databashuvudkontona omfattar endast huvudnamnen för den ursprungliga databasen utan några andra huvudkonton.

Mer information om hur du använder hanteringskommandon för att konfigurera auktoriserade huvudkonton finns i Hanteringskommandon för att hantera ett uppföljningskluster.

Hantera behörigheter

Hantering av skrivskyddad databasbehörighet är samma som för alla databastyper. Information om hur du tilldelar behörigheter finns i Hantera databasbehörigheter i Azure Portal eller använd hanteringskommandon för att hantera databassäkerhetsroller.

Konfigurera cachelagringsprincip

Den följande databasadministratören kan ändra cachelagringsprincipen för den anslutna databasen eller någon av dess tabeller i värdklustret. Standardinställningen är att kombinera källdatabasen i leader-klusterdatabasen och cachelagringsprinciper på tabellnivå med de principer som definieras i principerna för åsidosättning på databas- och tabellnivå. Du kan till exempel ha en 30-dagars cachelagringsprincip i leaderdatabasen för att köra månadsrapportering och en tre dagars cachelagringsprincip i den följande databasen för att endast fråga efter de senaste data för felsökning. Mer information om hur du använder hanteringskommandon för att konfigurera cachelagringsprincipen i uppföljningsdatabasen eller tabellen finns i Hanteringskommandon för att hantera ett uppföljningskluster.

Kommentarer

  • Om det finns konflikter mellan databaser med leader/follower-kluster, när alla databaser följs av uppföljningsklustret, löses de på följande sätt:
    • En databas med namnet DB som skapats i uppföljningsklustret har företräde framför en databas med samma namn som skapades i leaderklustret. Därför måste databasdatabasen i följeklustret tas bort eller byta namn för att följarklustret ska inkludera ledarens databasdatabas.
    • En databas med namnet DB följt av två eller flera leaderkluster väljs godtyckligt från ett av leaderkluster och följs inte mer än en gång.
  • Kommandon för att visa klusteraktivitetsloggen och historiken som körs i ett uppföljningskluster visar aktiviteten och historiken i det följande klustret, och deras resultatuppsättningar inkluderar inte dessa resultat från leaderklustret eller -klustren.
    • Till exempel: ett .show queries kommando som körs i uppföljningsklustret visar bara frågor som körs på databaser följt av uppföljningskluster och inte frågor som körs mot samma databas i leader-klustret.

Begränsningar

  • Följaren och leaderklustren måste finnas i samma region.
  • Om direktuppspelningsinmatning används på en databas som följs, bör följarklustret aktiveras för inmatning av direktuppspelning så att följande strömmande inmatningsdata tillåts.
  • Att följa ett kluster med datakryptering med kundhanterade nycklar (CMK) stöds med följande begränsningar:
    • Varken efterföljarklustret eller leaderklustret följer andra kluster.
    • Om ett efterföljarkluster följer ett leader-kluster med CMK aktiverat och ledarens åtkomst till nyckeln återkallas, kommer både ledare och följarkluster att pausas. I det här fallet kan du antingen lösa CMK-problemet och sedan återuppta efterföljarklustret, eller så kan du koppla från de följande databaserna från uppföljningsklustret och återuppta det oberoende av leader-klustret.
  • Du kan inte ta bort en databas som är kopplad till ett annat kluster innan du kopplar från den.
  • Du kan inte ta bort ett kluster som har en databas kopplad till ett annat kluster innan du kopplar från det.
  • Delningsegenskaper på tabellnivå stöds inte när du följer alla databaser.
  • För att köra frågor mot externa tabeller som använder en hanterad identitet som autentiseringsmetod i följande databaser måste den hanterade identiteten läggas till i uppföljningsklustret. Den här funktionen fungerar inte när leader- och uppföljningskluster etableras i olika klientorganisationer.

Nästa steg