Övning – Utforska hur Citus distribuerar tabeller

Slutförd

I den här övningen skapar du en Azure Cosmos DB för PostgreSQL-databas med flera noder. Sedan skapar du några tabeller innan du kör några frågor mot databasen för att lära dig mer om den distribuerade arkitekturen som tillhandahålls av Citus-tillägget för PostgreSQL.

Skapa en Azure Cosmos DB för PostgreSQL-databas

För att slutföra den här övningen måste du skapa en Azure Cosmos DB för PostgreSQL-klustret. Klustret kommer att ha:

  • En koordinatornod med 4 virtuella kärnor, 16 GiB RAM och 512 GiBM lagring
  • Två arbetsnoder, var och en med 4 virtuella kärnor, 32-GiB RAM och 512 GiBM lagring
  1. Gå till Azure-portalen i en webbläsare.

  2. I Azure-portalen väljer du Skapa en resurs, databaser och Azure Cosmos DB. Du kan också använda sökfunktionen för att hitta resursen.

    Screenshot of the Azure portal's create a resource screen where Databases and Azure Cosmos DB are highlighted.

  3. På skärmen Välj API-alternativ väljer du Skapa i panelen Azure Cosmos DB for PostgreSQL.

    Screenshot of the Azure Cosmos DB for PostgreSQL tile that is highlighted on the Azure Cosmos DB Select API option dialog.

    Kommentar

    När du har valt Skapa visas en databaskonfigurationsskärm i portalen.

  4. På fliken Grundläggande anger du följande information:

    Parameter Värde
    Projektinformation
    Prenumeration Välj din Azure-prenumeration.
    Resursgrupp Välj Skapa ny och ge resursgruppen learn-cosmosdb-postgresqlnamnet .
    Klusterinformation
    Klusternamn Ange ett globalt unikt namn, till exempel learn-cosmosdb-postgresql.
    Location Lämna standardvärdet eller använd en region nära dig.
    Skala Se konfigurationsinställningar i nästa steg.
    PostgreSQL-version Låt standardversionen (15) vara markerad.
    Administratörskonto
    Användarnamn för administratör Det här användarnamnet är inställt på citus och kan inte redigeras.
    Password Ange och bekräfta ett starkt lösenord.

    Screenshot of the Basics tab of the Create an Azure Cosmos DB - PostgreSQL cluster dialog. The fields are populated with the values specified in the exercise.

    Anteckna lösenordet för senare användning.

  5. För skalningsinställningen väljer du Konfigurera och anger följande på nodkonfigurationssidan:

    Parameter Värde
    Noder
    Nodantal Välj 2 noder.
    Beräkning per nod Välj 4 virtuella kärnor, 32 GiB RAM-minne.
    Lagring per nod Välj 512 GiBM.
    Samordnare (Du kan behöva expandera det här avsnittet)
    Koordinatorberäkning Välj 4 virtuella kärnor, 16 GiB RAM-minne.
    Koordinatorlagring Välj 512 GiBM.

    Funktionerna för hög tillgänglighet och automatisk redundans ligger utanför omfånget för den här övningen, så låt kryssrutan Hög tillgänglighet vara avmarkerad.

    Screenshot of the Create an Azure Cosmos DB - PostgreSQL cluster configuration dialog.

  6. Välj Spara på skalningssidan för att återgå till klusterkonfigurationen.

  7. Välj knappen Nästa: Nätverk > för att gå vidare till fliken Nätverk i konfigurationsdialogrutan.

  8. På fliken Nätverk anger du metoden Anslut ivity till Offentlig åtkomst (tillåtna IP-adresser) och markerar rutan Tillåt offentlig åtkomst från Azure-tjänster och resurser i Azure till det här klustret.

    Screenshot of the Create an Azure Cosmos DB - PostgreSQL cluster Networking tab. The settings specified in the exercise are highlighted.

  9. Välj knappen Granska + skapa och välj sedan Skapa på granskningsskärmen för att skapa klustret.

Anslut till databasen med psql i Azure Cloud Shell

  1. När azure Cosmos DB for PostgreSQL-klustret har slutfört etableringen går du till resursen i Azure-portalen.

  2. I den vänstra navigeringsmenyn väljer du Anslut ionssträngar under Inställningar och kopierar anslutningssträng märkt psql.

    Screenshot of the Connection strings page of the Azure Cosmos DB Cluster resource.

    På sidan Anslut ionssträngar är knappen kopiera till Urklipp till höger om psql-anslutningssträng markerad.

  3. Klistra in anslutningssträng i en textredigerare som Anteckningar och ersätt {your_password} token med det lösenord som du tilldelade citus användaren när du skapade klustret. Kopiera den uppdaterade anslutningssträng för användning nedan.

  4. Öppna Azure Cloud Shell i en webbläsare.

  5. Välj Bash som miljö.

    Screenshot of the welcome page of Azure Cloud Shell with a prompt to choose an environment between Bash or PowerShell. Bash is highlighted.

  6. Om du uppmanas till det väljer du den prenumeration som du använde för ditt Azure Cosmos DB för PostgreSQL-konto. Välj sedan Skapa lagring.

    Screenshot of the Azure Cloud Shell wizard showing no storage mounted is displayed. Azure Subscription is showing in the Subscription dropdown.

  7. Använd nu kommandoradsverktyget psql för att ansluta till databasen. Klistra in den uppdaterade anslutningssträng (den som innehåller rätt lösenord) i kommandotolken i Cloud Shell och kör sedan kommandot, som bör se ut ungefär som följande kommando:

    psql "host=c.learn-cosmosdb-postgresql.postgres.database.azure.com port=5432 dbname=citus user=citus password=P@ssword.123! sslmode=require"
    

Identifiera information om noderna i klustret

Koordinatormetadatatabellerna innehåller information om arbetsnoder i klustret.

  1. Kör följande fråga mot arbetsnodtabellen pg_dist_node för att visa information om noderna i klustret:

    -- Turn on expanded display to pivot the results 
    \x
    
    -- Retrieve node details
    SELECT * FROM pg_dist_node;
    
  2. Granska frågeutdata för mer information, inklusive ID, namn och port som är associerad med varje nod. Dessutom kan du se om noden är aktiv och bör innehålla shards, bland annat information.

    -[ RECORD 1 ]----+-----------------------------------------------------------------
    nodeid           | 2
    groupid          | 2
    nodename         | private-w1.learn-cosmosdb-postgresql.postgres.database.azure.com
    nodeport         | 5432
    noderack         | default
    hasmetadata      | t
    isactive         | t
    noderole         | primary
    nodecluster      | default
    metadatasynced   | t
    shouldhaveshards | t
    -[ RECORD 2 ]----+-----------------------------------------------------------------
    nodeid           | 3
    groupid          | 3
    nodename         | private-w0.learn-cosmosdb-postgresql.postgres.database.azure.com
    nodeport         | 5432
    noderack         | default
    hasmetadata      | t
    isactive         | t
    noderole         | primary
    nodecluster      | default
    metadatasynced   | t
    shouldhaveshards | t
    -[ RECORD 3 ]----+-----------------------------------------------------------------
    nodeid           | 4
    groupid          | 0
    nodename         | private-c.learn-cosmosdb-postgresql.postgres.database.azure.com
    nodeport         | 5432
    noderack         | default
    hasmetadata      | t
    isactive         | t
    noderole         | primary
    nodecluster      | default
    metadatasynced   | t
    shouldhaveshards | f
    

    Du kan använda nodnamnen och portnumren som anges i utdata för att ansluta direkt till arbetare, vilket är vanligt vid justering av frågeprestanda. Anslut direkt till arbetsnoder kräver Aktivera åtkomst till arbetsnoderna genom att markera kryssrutan på sidan Nätverk för din Azure Cosmos DB for PostgreSQL-resurs i Azure-portalen.

    Screenshot of the enable access to the worker nodes option in the Networking section. Networking is highlighted and selected in the left-hand navigation menu.

Skapa distribuerade tabeller

Nu när du är ansluten till databasen kan du börja fylla i databasen. Du använder psql för att:

  • Skapa användare och betalningstabeller.
  • Instruera Citus att distribuera båda tabellerna och partitionera dem mellan arbetsnoderna.

Distribuerade tabeller partitioneras vågrätt över tillgängliga arbetsnoder. Den här fördelningen innebär att tabellens rader lagras på olika noder i fragmenttabeller som kallas shards.

  1. I Cloud Shell kör du följande fråga för att skapa tabellerna payment_users och payment_events :

    CREATE TABLE payment_users
    (
        user_id bigint PRIMARY KEY,
        url text,
        login text,
        avatar_url text
    );
    
    CREATE TABLE payment_events
    (
        event_id bigint,
        event_type text,
        user_id bigint,
        merchant_id bigint,
        event_details jsonb,
        created_at timestamp,
        -- Create a compound primary key so that user_id can be set as the distribution column
        PRIMARY KEY (event_id, user_id)
    );
    

    Tilldelningen PRIMARY KEYpayment_events för tabellen är en sammansatt nyckel som gör att fältet user_id kan tilldelas som distributionskolumn.

  2. CREATE TABLE När kommandona körs skapas lokala tabeller på koordinatornoden. Om du vill distribuera tabellerna till arbetsnoderna måste du köra create_distributed_table funktionen för varje tabell och ange vilken distributionskolumn som ska användas vid horisontell partitionering av dem. Kör följande fråga i Cloud Shell för att distribuera dina payment_events och payment_users tabeller mellan arbetsnoderna:

    SELECT create_distributed_table('payment_users', 'user_id');
    SELECT create_distributed_table('payment_events', 'user_id');
    

    Både tabellerna payment_events och payment_users tilldelades samma distributionskolumn, vilket resulterade i att relaterade data för båda tabellerna samlokaliserades på samma nod. Information om hur du väljer rätt distributionskolumn ligger utanför omfånget för den här utbildningsmodulen. Du kan ändå lära dig mer om det genom att läsa artikeln Välj distributionskolumner i Azure Cosmos DB for PostgreSQL i Microsoft-dokumenten.

Skapa en referenstabell

Sedan använder psql du för att:

  • Skapa köpmannatabellen.
  • Instruera Citus att distribuera hela tabellen som en referenstabell på varje arbetsnod.

En referenstabell är en distribuerad tabell vars hela innehåll är koncentrerat till en enda shard som replikeras på varje arbetare. Frågor om alla arbetare kan komma åt referensinformationen lokalt utan nätverkskostnaderna för att begära rader från en annan nod. Referenstabeller kräver inte specifikationen av en distributionskolumn eftersom det inte finns något behov av att skilja mellan olika shards per rad. Referenstabeller är vanligtvis små och används för att lagra data som är relevanta för frågor som körs på alla arbetsnoder.

  1. I Cloud Shell kör du följande fråga för att skapa payment_merchants tabellen:

    CREATE TABLE payment_merchants
    (
        merchant_id bigint PRIMARY KEY,
        name text,
        url text
    );
    
  2. create_reference_table() Använd sedan funktionen för att distribuera tabellen till varje arbetsnod.

    SELECT create_reference_table('payment_merchants');
    

Läsa in data i händelsetabellen

Woodgrove Bank har försett dig med sina historiska händelsedata i en CSV-fil, så du har vissa data att arbeta med när du installerar och testar de begärda tilläggen. De tillhandahåller användardata via ett säkert Azure Blob Storage-konto så att du kan fylla payment_users i tabellen i nästa övning. Filen events.csv är tillgänglig via en offentligt tillgänglig URL.

Du kan använda COPY kommandot för att utföra en engångsinläsning av dessa data i payment_events tabellen.

  1. Kör följande kommando för att ladda ned CSV-filer som innehåller användar- och betalningsinformation och använd COPY sedan kommandot för att läsa in data från de nedladdade CSV-filerna till de distribuerade tabellerna och payment_userspayment_events:

    SET CLIENT_ENCODING TO 'utf8';
    
    \COPY payment_events FROM PROGRAM 'curl https://raw.githubusercontent.com/MicrosoftDocs/mslearn-create-connect-postgresHyperscale/main/events.csv' WITH CSV
    

    I kommandot COPY som utfärdas FROM PROGRAM informerar -satsen koordinatorn om att hämta datafilerna från ett program som körs på koordinatorn, i det här fallet curl. Alternativet WITH CSV innehåller information om formatet på filen som matas in.

  2. Kör följande kommandon för att verifiera att data har lästs in i payment_events tabellen med hjälp av COPY kommandot .

    SELECT COUNT(*) FROM payment_events;
    

Visa information om dina distribuerade tabeller

Nu när du har skapat några distribuerade tabeller ska vi använda citus_tables vyn för att inspektera dessa tabeller.

  1. Kör följande fråga för att visa information om dina distribuerade tabeller:

    SELECT table_name, citus_table_type, distribution_column, table_size, shard_count FROM citus_tables;
    
  2. Observera utdata från frågan och den information som den innehåller.

    table_name        | citus_table_type | distribution_column | table_size | shard_count 
    ------------------+------------------+---------------------+------------+-------------
    payment_events    | distributed      | user_id             | 26 MB      |          32
    payment_merchants | reference        | <none>              | 48 kB      |           1
    payment_users     | distributed      | user_id             | 512 kB     |          32
    

    Kommentar

    shard_count Observera skillnaden och mellan hur många shards som används för distribuerade tabeller jämfört med referenstabeller. Den här skillnaden ger en inblick i hur Citus hanterar fördelningen av data internt. Vyn citus_table innehåller också information om storleken på dina tabeller.

Granska tabellsharding

Titta sedan på de shards Citus skapade för att distribuera varje tabells data:

  1. Metadatatabellen pg_dist_shard innehåller information om shards i klustret. Kör följande fråga för att visa de shards som skapats för var och en av dina tabeller:

    SELECT * from pg_dist_shard;
    
  2. Granska utdata från ovanstående fråga. Kom ihåg att tabellen payment_merchants finns i ett enda fragment. Jämför det med tabellerna payment_events och payment_users som var och en innehåller 32 shards.

  3. Om du vill se hur Citus hanterar referenstabeller för horisontell partitionering kan du använda citus_shards vyn för att visa platsen för shards på arbetsnoder. Kör följande fråga:

    SELECT table_name, shardid, citus_table_type, nodename FROM citus_shards WHERE table_name = 'payment_merchants'::regclass;
    

    I utdata payment_merchants distribueras tabellens enda fragment över varje nod i klustret.

    table_name        | shardid | citus_table_type |                             nodename                             
    ------------------+---------+------------------+-----------------------------------------------------------------
    payment_merchants |  102072 | reference        | private-w0.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_merchants |  102072 | reference        | private-w1.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_merchants |  102072 | reference        | private-c.learn-cosmosdb-postgresql.postgres.database.azure.com
    
  4. Om du vill jämföra kör du följande fråga för att visa fördelningen av shards för payment_events tabellen:

    SELECT table_name, shardid, citus_table_type, nodename FROM citus_shards WHERE table_name = 'payment_events'::regclass;
    

    För distributed tabeller visas var och shardid en bara en gång i resultatet och varje shard finns bara på en enda nod.

    table_name     | shardid | citus_table_type |                             nodename                             
    ---------------+---------+------------------+-----------------------------------------------------------------
    payment_events |  102040 | distributed      | private-w0.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102041 | distributed      | private-w1.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102042 | distributed      | private-w0.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102043 | distributed      | private-w1.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102044 | distributed      | private-w0.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102045 | distributed      | private-w1.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102046 | distributed      | private-w0.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102047 | distributed      | private-w1.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102048 | distributed      | private-w0.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102049 | distributed      | private-w1.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102050 | distributed      | private-w0.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102051 | distributed      | private-w1.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102052 | distributed      | private-w0.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102053 | distributed      | private-w1.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102054 | distributed      | private-w0.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102055 | distributed      | private-w1.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102056 | distributed      | private-w0.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102057 | distributed      | private-w1.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102058 | distributed      | private-w0.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102059 | distributed      | private-w1.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102060 | distributed      | private-w0.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102061 | distributed      | private-w1.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102062 | distributed      | private-w0.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102063 | distributed      | private-w1.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102064 | distributed      | private-w0.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102065 | distributed      | private-w1.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102066 | distributed      | private-w0.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102067 | distributed      | private-w1.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102068 | distributed      | private-w0.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102069 | distributed      | private-w1.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102070 | distributed      | private-w0.learn-cosmosdb-postgresql.postgres.database.azure.com
    payment_events |  102071 | distributed      | private-w1.learn-cosmosdb-postgresql.postgres.database.azure.com
    

    Gratulerar! Du har skapat en distribuerad databas med flera noder med Hjälp av Azure Cosmos DB for PostgreSQL. Med hjälp av metadatatabeller och vyer utforskade du hur Citus-tillägget distribuerar data och ger ytterligare funktioner till PostgreSQL.

  5. I Cloud Shell kör du följande kommando för att koppla från databasen:

    \q
    

    Du kan hålla Cloud Shell öppet och gå vidare till nästa enhet.