Oefening: Een gemigreerde database beveiligen, bewaken en afstemmen

Voltooid

U werkt als databaseontwikkelaar voor de AdventureWorks-organisatie. AdventureWorks verkoopt al meer dan tien jaar fietsen en fietsonderdelen rechtstreeks aan eindgebruikers en distributeurs. Hun systemen slaan gegevens op in een database die u eerder hebt gemigreerd naar Azure Database for PostgreSQL.

Nadat u de migratie hebt uitgevoerd, wilt u controleren of het systeem goed presteert. U besluit de Beschikbare Azure-hulpprogramma's te gebruiken om de server te bewaken. Om de kans op trage reactietijden te verlichten die worden veroorzaakt door conflicten en latentie, besluit u leesreplicatie te implementeren. U moet het resulterende systeem bewaken en de resultaten vergelijken met de flexibele serverarchitectuur.

In deze oefening voert u de volgende taken uit:

  1. Configureer metrische Gegevens van Azure voor uw Azure Database for PostgreSQL-service.
  2. Voer een voorbeeldtoepassing uit die meerdere gebruikers simuleert die query's uitvoeren op de database.
  3. Bekijk de metrische gegevens.

De omgeving instellen

Voer deze Azure CLI-opdrachten uit in Cloud Shell om een Azure-database voor PostgreSQL te maken, met een kopie van de adventureworks-database. Met de laatste opdrachten wordt de servernaam afgedrukt.

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

Metrische Gegevens van Azure configureren voor uw Azure Database for PostgreSQL-service

  1. Open in een webbrowser een nieuw tabblad en navigeer naar Azure Portal.

  2. Selecteer Alle resources in Azure Portal.

  3. Selecteer de naam van de Azure Database for PostgreSQL-server die begint met adventureworks.

  4. Selecteer Metrische gegevens onder Bewaking.

  5. Voeg op de grafiekpagina de volgende metrische gegevens toe:

    Eigenschappen Weergegeven als
    Bereik adventureworks[nnn]
    Metrische naamruimte Metrische standaardgegevens van PostgreSQL-server
    Metric Actieve Verbinding maken ions
    Statistische functie Avg

    Met deze metrische waarde wordt het gemiddelde aantal verbindingen weergegeven dat elke minuut met de server is gemaakt.

  6. Selecteer Metrische gegevens toevoegen en voeg de volgende metrische waarde toe:

    Eigenschappen Weergegeven als
    Bereik adventureworks[nnn]
    Metrische naamruimte Metrische standaardgegevens van PostgreSQL-server
    Metric CPU-percentage
    Statistische functie Avg
  7. Selecteer Metrische gegevens toevoegen en voeg de volgende metrische waarde toe:

    Eigenschappen Weergegeven als
    Bereik adventureworks[nnn]
    Metrische naamruimte Metrische standaardgegevens van PostgreSQL-server
    Metric Geheugenpercentage
    Statistische functie Avg
  8. Selecteer Metrische gegevens toevoegen en voeg de volgende metrische waarde toe:

    Eigenschappen Weergegeven als
    Bereik adventureworks[nnn]
    Metrische naamruimte Metrische standaardgegevens van PostgreSQL-server
    Metric IO-percentage
    Statistische functie Avg

    Deze laatste drie metrische gegevens laten zien hoe resources worden gebruikt door de testtoepassing.

  9. Stel het tijdsbereik voor de grafiek in op Afgelopen 30 minuten.

  10. Selecteer Vastmaken aan dashboard en selecteer Vervolgens Vastmaken.

Een voorbeeldtoepassing uitvoeren waarmee meerdere gebruikers query's uitvoeren op de database

  1. Selecteer in Azure Portal, op de pagina voor uw Azure Database for PostgreSQL-server, onder Instellingen, Verbinding maken ion Strings. Kopieer de verbindingsreeks voor ADO.NET naar het klembord.

  2. Ga naar de map ~/workshop/migration_samples/code/postgresql/AdventureWorksSoakTest .

    cd ~/workshop/migration_samples/code/postgresql/AdventureWorksSoakTest
    
  3. Open het App.config-bestand met behulp van de code-editor:

    code App.config
    
  4. Vervang de waarde van Database door azureadworks en vervang ConectionString0 door de verbindingsreeks van het klembord. Wijzig de gebruikers-id in azureuser@adventureworks[nnn] en stel het wachtwoord in op Pa55w.rd. Het voltooide bestand moet er ongeveer uitzien als in het onderstaande voorbeeld:

    <?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>
    

    Notitie

    Negeer de instellingen Verbinding maken ionString1 en Verbinding maken ionString2 voorlopig. U werkt deze items later in het lab bij.

  5. Sla de wijzigingen op en sluit de editor.

  6. Voer bij de Cloud Shell-prompt de volgende opdracht uit om de app te bouwen en uit te voeren:

    dotnet run
    

    Wanneer de app wordt gestart, wordt er een aantal threads weergegeven, waarbij elke thread een gebruiker simuleert. De threads voeren een lus uit en voeren een reeks query's uit. U ziet berichten zoals de berichten die hieronder worden weergegeven:

    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
    

    Laat de app actief terwijl u de volgende stappen uitvoert.

De metrische gegevens weergeven

  1. Ga terug naar Azure Portal.

  2. Selecteer Dashboard in het linkerdeelvenster.

    U ziet nu de grafiek met de metrische gegevens voor uw Azure Database for PostgreSQL-service.

  3. Selecteer de grafiek om deze te openen in het deelvenster Metrische gegevens .

  4. Sta toe dat de app enkele minuten kan worden uitgevoerd (hoe langer des te beter). Wanneer de tijd is verstreken, moeten de metrische gegevens in de grafiek lijken op het patroon dat wordt geïllustreerd in de volgende afbeelding:

    Image showing the metrics gathered while the sample app is running

    In deze grafiek worden de volgende punten gemarkeerd:

    • De CPU wordt uitgevoerd op volledige capaciteit; het gebruik bereikt 100% zeer snel.
    • Het aantal verbindingen neemt langzaam toe. De voorbeeldtoepassing is ontworpen om 101 clients snel achter elkaar te starten, maar de server kan slechts enkele verbindingen tegelijk openen. Het aantal verbindingen dat bij elke stap in de grafiek wordt toegevoegd, wordt kleiner en de tijd tussen 'stappen' neemt toe. Na ongeveer 45 minuten kon het systeem slechts 70 clientverbindingen tot stand brengen.
    • Het geheugengebruik neemt in de loop van de tijd consistent toe.
    • I/O-gebruik ligt dicht bij nul. Alle gegevens die door de clienttoepassingen zijn vereist, worden momenteel in de cache opgeslagen in het geheugen.

    Als u de toepassing lang genoeg laat werken, ziet u dat verbindingen mislukken, met de foutberichten die worden weergegeven in de volgende afbeelding.

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

  5. Druk in Cloud Shell op Enter om de toepassing te stoppen.

De server configureren voor het verzamelen van queryprestatiesgegevens

  1. Selecteer serverparameters in Azure Portal op de pagina voor uw Azure Database for PostgreSQL-server, onder Instellingen.

  2. Stel op de pagina Serverparameters de volgende parameters in op de waarden die zijn opgegeven in de onderstaande tabel.

    Parameter Weergegeven als
    pg_qs.max_query_text_length 6000
    pg_qs.query_capture_mode ALL
    pg_qs.replace_parameter_placeholders OP
    pg_qs.retention_period_in_days 7
    pg_qs.track_utility OP
    pg_stat_statements.track ALL
    pgms_wait_sampling.history_period 100
    pgms_wait_sampling.query_capture_mode ALL
  3. Selecteer Opslaan.

De query's onderzoeken die door de toepassing worden uitgevoerd met Behulp van Query Store

  1. Ga terug naar Cloud Shell en start de voorbeeld-app opnieuw:

    dotnet run
    

    Laat de app 5 minuten of zo worden uitgevoerd voordat u doorgaat.

  2. Laat de app actief en schakel over naar Azure Portal

  3. Selecteer op de pagina voor uw Azure Database for PostgreSQL-server, onder Intelligente prestaties, Query Performance Insight.

  4. Stel op de pagina Query Performance Insight op het tabblad Langlopende query's het aantal query's in op 10, stel Geselecteerd op gemiddelde in en stel de periode in op Afgelopen 6 uur.

  5. Selecteer boven de grafiek inzoomen (het vergrootglaspictogram met het +-teken) om in te zoomen op de meest recente gegevens.

    Afhankelijk van hoe lang u de toepassing hebt laten uitvoeren, ziet u een grafiek die vergelijkbaar is met de grafiek die hieronder wordt weergegeven. Query Store voegt de statistieken voor query's elke 15 minuten samen, dus elke balk toont de relatieve tijd die wordt verbruikt door elke query in elke periode van 15 minuten:

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

  6. Beweeg de muisaanwijzer over elke balk om de statistieken voor de query's in die periode weer te geven. De drie query's die door het systeem worden uitgevoerd, zijn:

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

    Deze informatie is handig voor een beheerder die een systeem bewaakt. Als u inzicht hebt in de query's die worden uitgevoerd door gebruikers en apps, kunt u inzicht krijgen in de workloads die worden uitgevoerd en kunt u mogelijk aanbevelingen doen aan toepassingsontwikkelaars over hoe ze hun code kunnen verbeteren. Is het bijvoorbeeld echt nodig dat een toepassing alle 121.000 rijen uit de tabel sales.salesorderdetail ophaalt?

Bekijk eventuele wachttijden die optreden met Behulp van Query Store

  1. Selecteer het tabblad Wachtstatistieken .

  2. Stel de periode in op Afgelopen 6 uur, stel Groeperen op in op Gebeurtenis en stel het maximum aantal groepen in op 5.

    Net als bij het tabblad Langlopende query's worden de gegevens elke 15 minuten samengevoegd. In de onderstaande tabel ziet u dat het systeem het onderwerp is geweest van twee soorten wachtgebeurtenis:

    • Client: ClientWrite. Deze wacht gebeurtenis treedt op wanneer de server gegevens (resultaten) terug schrijft naar de client. Het geeft geen wachttijden aan die zijn gemaakt tijdens het schrijven naar de database.
    • Client: ClientRead. Deze wacht gebeurtenis treedt op wanneer de server wacht op het lezen van gegevens (queryaanvragen of andere opdrachten) van een client. Het is niet gekoppeld aan de tijd die is besteed aan het lezen van de database.

    Image showing the wait statistics captured by using Query Store

    Notitie

    Lees- en schrijfbewerkingen naar de database worden aangegeven door IO-gebeurtenissen in plaats van client-gebeurtenissen . Voor de voorbeeldtoepassing worden geen IO-wachttijden uitgevoerd omdat alle gegevens die nodig zijn, in de cache worden opgeslagen in het geheugen na de eerste leesbewerking. Als uit de metrische gegevens blijkt dat het geheugen laag was, ziet u waarschijnlijk dat er IO-wachtgebeurtenissen optreden.

  3. Ga terug naar Cloud Shell en druk op Enter om de voorbeeldtoepassing te stoppen.

Replica's toevoegen aan de Azure Database for PostgreSQL-service

  1. Selecteer Replicatie in Azure Portal op de pagina voor uw Azure Database for PostgreSQL-server, onder Instellingen.

  2. Selecteer + Replica toevoegen op de pagina Replicatie.

  3. Typ op de pagina PostgreSQL-server in het vak Servernaam adventureworks[nnn]-replica1 en selecteer VERVOLGENS OK.

  4. Wanneer de eerste replica is gemaakt (dit duurt enkele minuten), herhaalt u de vorige stap en voegt u een andere replica toe met de naam adventureworks[nnn]-replica2.

  5. Wacht totdat de status van beide replica's verandert van Implementeren naar Beschikbaar voordat u doorgaat.

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

De replica's configureren om clienttoegang in te schakelen

  1. Selecteer de naam van de replica adventureworks[nnn]-replica1 . U gaat naar de pagina voor de azure Database for PostgreSQL-pagina voor deze replica.
  2. Selecteer Verbinding maken ion-beveiliging onder Instellingen.
  3. Stel op de pagina Verbinding maken ionbeveiliging toegang tot Azure-services toestaan in op AAN en selecteer Opslaan. Met deze instelling kunnen toepassingen die u uitvoert met behulp van Cloud Shell toegang krijgen tot de server.
  4. Wanneer de instelling is opgeslagen, herhaalt u de vorige stappen en geeft u Azure-services toegang tot de replica adventureworks[nnn]-replica2 .

Elke server opnieuw opstarten

Notitie

Voor het configureren van replicatie hoeft u geen server opnieuw op te starten. Het doel van deze taak is om geheugen en eventuele overbodige verbindingen van elke server te wissen, zodat de metrische gegevens die worden verzameld bij het opnieuw uitvoeren van de toepassing schoon zijn.

  1. Ga naar de pagina voor de adventureworks[nnn] -server.
  2. Selecteer Opnieuw opstarten op de pagina Overzicht.
  3. Selecteer Ja in het dialoogvenster Server opnieuw opstarten.
  4. Wacht tot de server opnieuw is opgestart voordat u doorgaat.
  5. Start volgens dezelfde procedure de servers adventureworks[nnn]-replica1 en adventureworks[nnn]-replica2 opnieuw.

De voorbeeldtoepassing opnieuw configureren voor het gebruik van de replica's

  1. Bewerk in Cloud Shell het App.config-bestand.

    code App.config
    
  2. Voeg de verbindingsreeksen toe voor de instellingen Verbinding maken ionString1 en Verbinding maken ionString2. Deze waarden moeten hetzelfde zijn als die van Verbinding maken ionString0, maar door de tekst adventureworks[nnn] vervangen door adventureworks[nnn]-replica1 en adventureworks[nnn]-replica2 in de elementen Server en Gebruikers-id.

  3. Stel de instelling NumReplicas in op 3.

    Het bestand App.config moet er nu ongeveer als volgt uitzien:

    <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. Sla het bestand op en sluit de editor.

  5. Start de app opnieuw:

    dotnet run
    

    De toepassing wordt uitgevoerd zoals voorheen. Deze keer worden de aanvragen echter verdeeld over de drie servers.

  6. Sta toe dat de app enkele minuten kan worden uitgevoerd voordat u doorgaat.

De app bewaken en de verschillen in de metrische prestatiegegevens bekijken

  1. Laat de app actief en ga terug naar Azure Portal.

  2. Selecteer Dashboard in het linkerdeelvenster.

  3. Selecteer de grafiek om deze te openen in het deelvenster Metrische gegevens .

    Houd er rekening mee dat in deze grafiek de metrische gegevens worden weergegeven voor de adventureworks*[nnn]*-server, maar niet voor de replica's. De belasting voor elke replica moet veel hetzelfde zijn.

    In de voorbeeldgrafiek ziet u de metrische gegevens die zijn verzameld voor de toepassing gedurende een periode van 30 minuten, vanaf het opstarten. In de grafiek ziet u dat het CPU-gebruik nog steeds hoog was, maar dat het geheugengebruik lager was. Bovendien had het systeem na ongeveer 25 minuten verbindingen tot stand gebracht voor meer dan 30 verbindingen. Dit lijkt misschien geen gunstige vergelijking met de vorige configuratie, die 70 verbindingen na 45 minuten ondersteunde. De workload was nu echter verdeeld over drie servers, die allemaal op hetzelfde niveau werden uitgevoerd, en alle 101 verbindingen waren tot stand gebracht. Bovendien kon het systeem actief blijven zonder dat er verbindingsfouten zijn gerapporteerd.

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

    U kunt het probleem van CPU-gebruik oplossen door omhoog te schalen naar een hogere prijscategorie met meer CPU-kernen. Het voorbeeldsysteem dat in dit lab wordt gebruikt, wordt uitgevoerd met behulp van de Basic-prijscategorie met 2 kerngeheugens. Als u overgaat naar de prijscategorie Algemeen gebruik , krijgt u maximaal 64 kernen.

  4. Ga terug naar Cloud Shell en druk op Enter om de app te stoppen.

U hebt nu gezien hoe u serveractiviteiten kunt bewaken met behulp van de hulpprogramma's die beschikbaar zijn in Azure Portal. U hebt ook geleerd hoe u replicatie configureert en hebt gezien hoe het maken van alleen-lezen replica's de workload kan distribueren in leesintensieve gegevensscenario's.