Övning: Skydda, övervaka och finjustera en migrerad databas

Slutförd

Du arbetar som databasutvecklare för AdventureWorks-organisationen. AdventureWorks har sålt cyklar och cykeldelar direkt till slutanvändare och distributörer i över ett decennium. Deras system lagrar information i en databas som du tidigare har migrerat till Azure Database for PostgreSQL.

När du har utfört migreringen vill du ha en försäkran om att systemet fungerar bra. Du bestämmer dig för att använda de Azure-verktyg som är tillgängliga för att övervaka servern. För att minska risken för långsamma svarstider som orsakas av konkurrens och svarstid bestämmer du dig för att implementera läsreplikering. Du måste övervaka det resulterande systemet och jämföra resultaten med den flexibla serverarkitekturen.

I den här övningen utför du följande uppgifter:

  1. Konfigurera Azure-mått för din Azure Database for PostgreSQL-tjänst.
  2. Kör ett exempelprogram som simulerar flera användare som kör frågor mot databasen.
  3. Visa måtten.

Konfigurera miljön

Kör dessa Azure CLI-kommandon i Cloud Shell för att skapa en Azure-databas för PostgreSQL med en kopia av databasen adventureworks. De sista kommandona skriver ut servernamnet.

SERVERNAME="adventureworks$((10000 + RANDOM % 99999))"
PUBLICIP=$(wget http://ipecho.net/plain -O - -q)
git clone https://github.com/MicrosoftLearning/DP-070-Migrate-Open-Source-Workloads-to-Azure.git workshop

az postgres server create \
    --resource-group <rgn>[sandbox resource group name]</rgn> \
    --name $SERVERNAME \
    --location westus \
    --admin-user awadmin \
    --admin-password Pa55w.rdDemo \
    --version 10 \
    --storage-size 5120

az postgres db create \
    --name azureadventureworks \
    --server-name $SERVERNAME \
    --resource-group <rgn>[sandbox resource group name]</rgn>

az postgres server firewall-rule create \
    --resource-group <rgn>[sandbox resource group name]</rgn> \
    --server $SERVERNAME \
    --name AllowMyIP \
    --start-ip-address $PUBLICIP --end-ip-address $PUBLICIP

PGPASSWORD=Pa55w.rdDemo psql -h $SERVERNAME.postgres.database.azure.com -U awadmin@$SERVERNAME -d postgres -f workshop/migration_samples/setup/postgresql/adventureworks/create_user.sql

PGPASSWORD=Pa55w.rd psql -h $SERVERNAME.postgres.database.azure.com -U azureuser@$SERVERNAME -d azureadventureworks -f workshop/migration_samples/setup/postgresql/adventureworks/adventureworks.sql 2> /dev/null

echo "Your PostgreSQL server name is:\n"
echo $SERVERNAME.postgres.database.azure.com

Konfigurera Azure-mått för din Azure Database for PostgreSQL-tjänst

  1. Öppna en ny flik med hjälp av en webbläsare och gå till Azure-portalen.

  2. Välj Alla resurser i Azure-portalen.

  3. Välj namnet på Azure Database for PostgreSQL-servern från och med adventureworks.

  4. Gå till Övervakning och välj Mått.

  5. Lägg till följande mått på diagramsidan:

    Property Värde
    Omfång adventureworks[nnn]
    Namnrymd för mått PostgreSQL-serverstandardmått
    Metric Aktiva Anslut ioner
    Aggregering Avg

    Det här måttet visar det genomsnittliga antalet anslutningar som görs till servern varje minut.

  6. Välj Lägg till mått och lägg till följande mått:

    Property Värde
    Omfång adventureworks[nnn]
    Namnrymd för mått PostgreSQL-serverstandardmått
    Metric CPU-procent
    Aggregering Avg
  7. Välj Lägg till mått och lägg till följande mått:

    Property Värde
    Omfång adventureworks[nnn]
    Namnrymd för mått PostgreSQL-serverstandardmått
    Metric Minnesprocent
    Aggregering Avg
  8. Välj Lägg till mått och lägg till följande mått:

    Property Värde
    Omfång adventureworks[nnn]
    Namnrymd för mått PostgreSQL-serverstandardmått
    Metric I/O-procent
    Aggregering Avg

    De här sista tre måtten visar hur resurser förbrukas av testprogrammet.

  9. Ange tidsintervallet för diagrammet till Senaste 30 minuterna.

  10. Välj Fäst på instrumentpanelen och välj sedan Fäst.

Kör ett exempelprogram som simulerar flera användare som kör frågor mot databasen

  1. Välj Anslut ionssträngar under Inställningar på sidan för Azure Database for PostgreSQL-servern. Kopiera ADO.NET-anslutningssträngen till Urklipp.

  2. Flytta till mappen ~/workshop/migration_samples/code/postgresql/AdventureWorksSoakTest .

    cd ~/workshop/migration_samples/code/postgresql/AdventureWorksSoakTest
    
  3. Öppna filen App.config med hjälp av kodredigeraren:

    code App.config
    
  4. Ersätt värdet för Database med azureadventureworks och ersätt ConectionString0 med anslutningssträng från Urklipp. Ändra användar-IDtill azureuser@adventureworks[nnn] och ange Lösenordet till Pa55w.rd. Den färdiga filen bör se ut ungefär som exemplet nedan:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <appSettings>
            <add key="ConnectionString0" value="Server=adventureworks101.postgres.database.azure.com;Database=azureadventureworks;Port=5432;User Id=azureuser@adventureworks101;Password=Pa55w.rd;Ssl Mode=Require;" />
            <add key="ConnectionString1" value="INSERT CONNECTION STRING HERE" />
            <add key="ConnectionString2" value="INSERT CONNECTION STRING HERE" />
            <add key="NumClients" value="100" />
            <add key="NumReplicas" value="1"/>
        </appSettings>
    </configuration>
    

    Kommentar

    Ignorera inställningarna Anslut ionString1 och Anslut ionString2 för tillfället. Du uppdaterar dessa objekt senare i labbet.

  5. Spara ändringarna och stäng redigeraren.

  6. I Cloud Shell-prompten kör du följande kommando för att skapa och köra appen:

    dotnet run
    

    När appen startar skapas ett antal trådar, där varje tråd simulerar en användare. Trådarna utför en loop som kör en serie frågor. Du ser meddelanden som de som visas nedan börjar visas:

    Client 48 : SELECT * FROM purchasing.vendor
    Response time: 630 ms
    
    Client 48 : SELECT * FROM sales.specialoffer
    Response time: 702 ms
    
    Client 43 : SELECT * FROM purchasing.vendor
    Response time: 190 ms
    
    Client 57 : SELECT * FROM sales.salesorderdetail
    Client 68 : SELECT * FROM production.vproductanddescription
    Response time: 51960 ms
    
    Client 55 : SELECT * FROM production.vproductanddescription
    Response time: 160212 ms
    
    Client 59 : SELECT * FROM person.person
    Response time: 186026 ms
    
    Response time: 2191 ms
    
    Client 37 : SELECT * FROM person.person
    Response time: 168710 ms
    

    Låt appen vara igång medan du utför nästa steg.

Visa måtten

  1. Gå tillbaka till Azure-portalen.

  2. I den vänstra rutan väljer du Instrumentpanel.

    Du bör se diagrammet som visar måtten för din Azure Database for PostgreSQL-tjänst.

  3. Välj diagrammet för att öppna det i fönstret Mått .

  4. Låt appen köras i flera minuter (desto längre desto bättre). När tiden går bör måtten i diagrammet likna mönstret som illustreras i följande bild:

    Image showing the metrics gathered while the sample app is running

    Det här diagrammet visar följande punkter:

    • Processorn körs med full kapacitet. användning når 100 % mycket snabbt.
    • Antalet anslutningar ökar långsamt. Exempelprogrammet är utformat för att starta 101 klienter i snabb följd, men servern klarar bara av att öppna några anslutningar i taget. Antalet anslutningar som läggs till vid varje "steg" i diagrammet blir mindre och tiden mellan "steg" ökar. Efter cirka 45 minuter kunde systemet bara upprätta 70 klientanslutningar.
    • Minnesanvändningen ökar konsekvent över tid.
    • I/O-användningen är nära noll. Alla data som krävs av klientprogrammen cachelagras för närvarande i minnet.

    Om du låter programmet köras tillräckligt länge ser du att anslutningarna börjar misslyckas, med felmeddelandena som visas i följande bild.

    Image showing the connection errors that can occur when the server has insufficient resources available

  5. I Cloud Shell trycker du på Retur för att stoppa programmet.

Konfigurera servern för att samla in frågeprestandadata

  1. Välj Serverparametrar under Inställningar på sidan för Din Azure Database for PostgreSQL-server i Azure-portalen.

  2. På sidan Serverparametrar anger du följande parametrar till de värden som anges i tabellen nedan.

    Parameter Värde
    pg_qs.max_query_text_length 6000
    pg_qs.query_capture_mode ALL
    pg_qs.replace_parameter_placeholders
    pg_qs.retention_period_in_days 7
    pg_qs.track_utility
    pg_stat_statements.track ALL
    pgms_wait_sampling.history_period 100
    pgms_wait_sampling.query_capture_mode ALL
  3. Välj Spara.

Granska frågorna som körs av programmet med hjälp av Query Store

  1. Gå tillbaka till Cloud Shell och starta om exempelappen:

    dotnet run
    

    Tillåt att appen körs i 5 minuter eller så innan du fortsätter.

  2. Låt appen köras och växla till Azure-portalen

  3. På sidan för din Azure Database for PostgreSQL-server går du till Intelligenta prestanda och väljer Query Performance Insight.

  4. På sidan Query Performance Insightfliken Tidskrävande frågor anger du Antal frågor till 10, anger Valda efter till genomsnittlig och anger tidsperioden till Senaste 6 timmar.

  5. Ovanför diagrammet väljer du Zooma in (förstoringsglasikonen med "+"-tecknet) ett par gånger för att komma hem med de senaste data.

    Beroende på hur länge du har låtit programmet köras visas ett diagram som liknar det som visas nedan. Query Store aggregerar statistiken för frågor var 15:e minut, så varje stapel visar den relativa tid som förbrukas av varje fråga under varje 15-minuters period:

    Image showing the statistics for long running queries captured by using Query Store

  6. Hovra musen över varje stapel i tur och ordning för att visa statistiken för frågorna under den tidsperioden. De tre frågor som systemet ägnar större delen av sin tid till att utföra är:

    SELECT * FROM sales.salesorderdetail
    SELECT * FROM sales.salesorderheader
    SELECT * FROM person.person
    

    Den här informationen är användbar för en administratör som övervakar ett system. Med en inblick i de frågor som körs av användare och appar kan du förstå de arbetsbelastningar som utförs och eventuellt ge rekommendationer till programutvecklare om hur de kan förbättra sin kod. Är det till exempel verkligen nödvändigt för ett program att hämta alla 121 000+ rader från tabellen sales.salesorderdetail ?

Granska eventuella väntetider som inträffar med hjälp av Query Store

  1. Välj fliken Vänta statistik .

  2. Ange tidsperioden till Senaste 6 timmar, ange Gruppera efter till Händelse och ange Maximalt antal grupper till 5.

    Precis som på fliken Tidskrävande frågor aggregeras data var 15:e minut. Tabellen under diagrammet visar att systemet har varit föremål för två typer av väntehändelser:

    • Klient: ClientWrite. Den här väntehändelsen inträffar när servern skriver tillbaka data (resultat) till klienten. Det anger inte väntetider som uppstår när du skriver till databasen.
    • Klient: ClientRead. Den här väntehändelsen inträffar när servern väntar på att läsa data (frågebegäranden eller andra kommandon) från en klient. Det är inte associerat med tidsåtgången för läsning från databasen.

    Image showing the wait statistics captured by using Query Store

    Kommentar

    Läsning och skrivningar till databasen indikeras av I/O-händelser i stället för klienthändelser . Exempelprogrammet medför inga I/O-väntetider eftersom alla data som krävs cachelagras i minnet efter den första läsningen. Om måtten visade att minnet höll på att ta slut skulle du förmodligen se att I/O-väntehändelser börjar inträffa.

  3. Gå tillbaka till Cloud Shell och tryck på Retur för att stoppa exempelprogrammet.

Lägga till repliker i Azure Database for PostgreSQL-tjänsten

  1. I Azure-portalen går du till sidan för Din Azure Database for PostgreSQL-server och under Inställningar väljer du Replikering.

  2. På sidan Replikering väljer du + Lägg till replik.

  3. På sidan PostgreSQL-server skriver du adventureworks[nnn]-replica1 i rutan Servernamn och väljer sedan OK.

  4. När den första repliken har skapats (det tar flera minuter) upprepar du föregående steg och lägger till en annan replik med namnet adventureworks[nnn]-replica2.

  5. Vänta tills statusen för båda replikerna ändras från Distribution till Tillgänglig innan du fortsätter.

    Image showing the Replication page for Azure Database for PostgreSQL. Two replicas have been added.

Konfigurera replikerna för att aktivera klientåtkomst

  1. Välj namnet på adventureworks[nnn]-replica1-repliken . Du kommer till sidan för Azure Database for PostgreSQL-sidan för den här repliken.
  2. Under Inställningar väljer du Anslut ionssäkerhet.
  3. På sidan Anslut ionsäkerhet anger du Tillåt åtkomst till Azure-tjänster till och väljer sedan Spara. Med den här inställningen kan program som du kör med Cloud Shell komma åt servern.
  4. När inställningen har sparats upprepar du föregående steg och låter Azure-tjänster komma åt adventureworks[nnn]-replica2-repliken .

Starta om varje server

Kommentar

Om du konfigurerar replikering behöver du inte starta om en server. Syftet med den här uppgiften är att rensa minne och eventuella onödiga anslutningar från varje server, så att måtten som samlas in när programmet körs igen är rena.

  1. Gå till sidan för adventureworks[nnn] -servern.
  2. På sidan Översikt väljer du Starta om.
  3. I dialogrutan Starta om server väljer du Ja.
  4. Vänta tills servern har startats om innan du fortsätter.
  5. Efter samma procedur startar du om servrarna adventureworks[nnn]-replica1 och adventureworks[nnn]-replica2 .

Konfigurera om exempelprogrammet för att använda replikerna

  1. I Cloud Shell redigerar du filen App.config.

    code App.config
    
  2. Lägg till anslutningssträngarna för inställningarna Anslut ionString1 och Anslut ionString2. Dessa värden bör vara samma som för Anslut ionString0, men med texten adventureworks[nnn] ersatt med adventureworks[nnn]-replica1 och adventureworks[nnn]-replica2 i elementen Server och Användar-ID.

  3. Ange inställningen NumReplicas till 3.

    App.config-filen bör nu se ut ungefär så här:

    <configuration>
        <appSettings>
            <add key="ConnectionString0" value="Server=adventureworks101.postgres.database.azure.com;Database=azureadventureworks;Port=5432;User Id=azureuser@adventureworks101;Password=Pa55w.rd;Ssl Mode=Require;" />
            <add key="ConnectionString1" value="Server=adventureworks101-replica1.postgres.database.azure.com;Database=azureadventureworks;Port=5432;User Id=azureuser@adventureworks101-replica1;Password=Pa55w.rd;Ssl Mode=Require;" />
            <add key="ConnectionString2" value="Server=adventureworks101-replica2.postgres.database.azure.com;Database=azureadventureworks;Port=5432;User Id=azureuser@adventureworks101-replica2;Password=Pa55w.rd;Ssl Mode=Require;" />
            <add key="NumClients" value="100" />
            <add key="NumReplicas" value="3"/>
        </appSettings>
    </configuration>
    
  4. Spara filen och stäng redigeringsprogrammet.

  5. Starta appen igång igen:

    dotnet run
    

    Programmet körs som tidigare. Men den här gången distribueras begäranden mellan de tre servrarna.

  6. Tillåt att appen körs i några minuter innan du fortsätter.

Övervaka appen och observera skillnaderna i prestandamåtten

  1. Låt appen köras och gå tillbaka till Azure-portalen.

  2. I den vänstra rutan väljer du Instrumentpanel.

  3. Välj diagrammet för att öppna det i fönstret Mått .

    Kom ihåg att det här diagrammet visar måtten för adventureworks*[nnn]* servern, men inte replikerna. Belastningen för varje replik bör vara ungefär densamma.

    Exempeldiagrammet illustrerar de mått som samlats in för programmet under en 30-minuters period, från start. Diagrammet visar att processoranvändningen fortfarande var hög, men minnesanvändningen var lägre. Efter cirka 25 minuter hade systemet dessutom upprättat anslutningar för över 30 anslutningar. Detta kanske inte verkar vara en bra jämförelse med den tidigare konfigurationen, som stödde 70 anslutningar efter 45 minuter. Men arbetsbelastningen var nu spridd över tre servrar, som alla presterade på samma nivå, och alla 101 anslutningar hade upprättats. Dessutom kunde systemet fortsätta att köras utan att rapportera några anslutningsfel.

    Image showing the metrics for the Azure Database for PostgreSQL server while running the application, after replication was configured

    Du kan åtgärda problemet med CPU-användning genom att skala upp till en högre prisnivå med fler CPU-kärnor. Exempelsystemet som används i den här labbuppgiften körs med prisnivån Basic med 2 kärnor. Om du ändrar till prisnivån Generell användning får du upp till 64 kärnor.

  4. Gå tillbaka till Cloud Shell och tryck på Retur för att stoppa appen.

Nu har du sett hur du övervakar serveraktivitet med hjälp av de verktyg som är tillgängliga i Azure-portalen. Du har också lärt dig hur du konfigurerar replikering och sett hur skrivskyddade repliker kan distribuera arbetsbelastningen i läsintensiva datascenarier.