Välj distributionskolumner i Azure Cosmos DB för PostgreSQL
GÄLLER FÖR: Azure Cosmos DB for PostgreSQL (drivs av Citus-databastillägget till PostgreSQL)
Att välja distributionskolumn för varje tabell är ett av de viktigaste besluten om modellering. Azure Cosmos DB for PostgreSQL lagrar rader i fragment baserat på värdet för radernas distributionskolumn.
Rätt val grupperar relaterade data på samma fysiska noder, vilket gör frågor snabba och lägger till stöd för alla SQL-funktioner. Ett felaktigt val gör att systemet körs långsamt.
Allmänna tips
Här är fyra kriterier för att välja den perfekta distributionskolumnen för dina distribuerade tabeller.
Välj en kolumn som är en central del i programarbetsbelastningen.
Du kanske ser den här kolumnen som "hjärta", "central bit" eller "naturlig dimension" för partitionering av data.
Exempel:
device_id
i en IoT-arbetsbelastningsecurity_id
för en finansiell app som spårar värdepapperuser_id
i användaranalystenant_id
för ett SaaS-program för flera klientorganisationer
Välj en kolumn med anständig kardinalitet och en jämn statistisk fördelning.
Kolumnen bör ha många värden och distribueras noggrant och jämnt mellan alla shards.
Exempel:
- Kardinalitet över 1000
- Välj inte en kolumn som har samma värde på en stor procentandel rader (dataförskjutning)
- I en SaaS-arbetsbelastning kan en klientorganisation som är mycket större än resten orsaka datasnedvridning. I den här situationen kan du använda klientisolering för att skapa en dedikerad shard för att hantera klientorganisationen.
Välj en kolumn som gynnar dina befintliga frågor.
För en transaktions- eller driftarbetsbelastning (där de flesta frågor bara tar några millisekunder) väljer du en kolumn som visas som ett filter i
WHERE
satser för minst 80 % av frågorna. Till exempeldevice_id
kolumnen iSELECT * FROM events WHERE device_id=1
.För en analytisk arbetsbelastning (där de flesta frågor tar 1–2 sekunder) väljer du en kolumn som gör att frågor kan parallelliseras mellan arbetsnoder. Till exempel en kolumn som ofta förekommer i GROUP BY-satser eller som efterfrågas över flera värden samtidigt.
Välj en kolumn som finns i de flesta stora tabeller.
Tabeller över 50 GB ska distribueras. Genom att välja samma distributionskolumn för alla kan du samplaceera data för kolumnen på arbetsnoder. Samplacering gör det effektivt att köra JON:er och sammanslagningar och framtvinga sekundärnycklar.
De andra (mindre) tabellerna kan vara lokala tabeller eller referenstabeller. Om den mindre tabellen behöver kopplas till distribuerade tabeller gör du den till en referenstabell.
Exempel på användningsfall
Vi har sett allmänna kriterier för att välja distributionskolumnen. Nu ska vi se hur de gäller för vanliga användningsfall.
Appar för flera klienter
Arkitekturen för flera klientorganisationer använder en form av hierarkisk databasmodellering för att distribuera frågor mellan noder i klustret. Överst i datahierarkin kallas klientorganisations-ID och måste lagras i en kolumn i varje tabell.
Azure Cosmos DB for PostgreSQL inspekterar frågor för att se vilket klient-ID de involverar och hittar matchande tabellshard. Den dirigerar frågan till en enda arbetsnod som innehåller fragmentet. Att köra en fråga med alla relevanta data placerade på samma nod kallas samlokalisering.
Följande diagram illustrerar samlokalisering i datamodellen för flera klientorganisationer. Den innehåller två tabeller, Konton och kampanjer, som var och en distribueras av account_id
. De skuggade rutorna representerar shards. Gröna shards lagras tillsammans på en arbetsnod och blå shards lagras på en annan arbetsnod. Observera hur en kopplingsfråga mellan konton och kampanjer har alla nödvändiga data på en nod när båda tabellerna är begränsade till samma account_id.
Om du vill använda den här designen i ditt eget schema kan du identifiera vad som utgör en klientorganisation i ditt program. Vanliga instanser är företag, konto, organisation eller kund. Kolumnnamnet kommer att vara ungefär som company_id
eller customer_id
. Granska var och en av dina frågor och fråga dig själv, skulle det fungera om det hade fler WHERE-satser för att begränsa alla tabeller som ingår till rader med samma klient-ID? Frågor i modellen med flera klientorganisationer är begränsade till en klientorganisation. Frågor om försäljning eller inventering är till exempel begränsade i ett visst lager.
Bästa praxis
- Distribuera tabeller med en gemensam tenant_id kolumn. I ett SaaS-program där klientorganisationer är företag är tenant_id sannolikt company_id.
- Konvertera små tabeller mellan klientorganisationer till referenstabeller. När flera klienter delar en liten tabell med information distribuerar du den som en referenstabell.
- Begränsa filtreringen av alla programfrågor efter tenant_id. Varje fråga bör begära information för en klient i taget.
Läs självstudien för flera klientorganisationer för ett exempel på hur du skapar den här typen av program.
Realtidsappar
Arkitekturen för flera klientorganisationer introducerar en hierarkisk struktur och använder datasamlokalisering för att dirigera frågor per klientorganisation. Däremot är realtidsarkitekturer beroende av specifika distributionsegenskaper för sina data för att uppnå mycket parallell bearbetning.
Vi använder "entitets-ID" som en term för distributionskolumner i realtidsmodellen. Typiska entiteter är användare, värdar eller enheter.
Realtidsfrågor frågar vanligtvis efter numeriska aggregeringar grupperade efter datum eller kategori. Azure Cosmos DB for PostgreSQL skickar dessa frågor till varje shard för partiella resultat och sammanställer det slutliga svaret på koordinatornoden. Frågor körs snabbast när så många noder som möjligt bidrar, och när ingen enskild nod måste utföra en oproportionerlig mängd arbete.
Bästa praxis
- Välj en kolumn med hög kardinalitet som distributionskolumn. Som jämförelse är ett statusfält i en ordertabell med värdena New, Paid och Shipped ett dåligt val av distributionskolumn. Det förutsätter endast de få värden som begränsar antalet shards som kan innehålla data och antalet noder som kan bearbeta dem. Bland kolumner med hög kardinalitet är det också bra att välja de kolumner som ofta används i grupp-by-satser eller som kopplingsnycklar.
- Välj en kolumn med jämn fördelning. Om du distribuerar en tabell i en kolumn som är skev till vissa vanliga värden tenderar data i tabellen att ackumuleras i vissa shards. Noderna som innehåller dessa shards gör mer arbete än andra noder.
- Distribuera fakta- och dimensionstabeller på sina vanliga kolumner. Faktatabellen kan bara ha en distributionsnyckel. Tabeller som ansluter till en annan nyckel kommer inte att samplaceeras med faktatabellen. Välj en dimension för att samplacera baserat på hur ofta den är ansluten och storleken på de sammanfogade raderna.
- Ändra vissa dimensionstabeller till referenstabeller. Om en dimensionstabell inte kan samallokeras med faktatabellen kan du förbättra frågeprestandan genom att distribuera kopior av dimensionstabellen till alla noder i form av en referenstabell.
Läs självstudien för instrumentpanelen i realtid för ett exempel på hur du skapar den här typen av program.
Tidsseriedata
I en tidsseriearbetsbelastning frågar program efter den senaste informationen medan de arkiverar gammal information.
Det vanligaste misstaget vid modellering av tidsserieinformation i Azure Cosmos DB for PostgreSQL är att använda själva tidsstämpeln som distributionskolumn. En hash-fördelning baserat på tid distribuerar tider till synes slumpmässigt till olika shards i stället för att hålla ihop tidsintervall i fragment. Frågor som omfattar tid refererar vanligtvis till tidsintervall, till exempel de senaste data. Den här typen av hashdistribution leder till nätverksomkostnader.
Bästa praxis
- Välj inte en tidsstämpel som distributionskolumn. Välj en annan distributionskolumn. I en app för flera klientorganisationer använder du klient-ID:t eller i en realtidsapp använder du entitets-ID:t.
- Använd PostgreSQL-tabellpartitionering för tid i stället. Använd tabellpartitionering för att dela upp en stor tabell med tidsbeställda data i flera ärvda tabeller med varje tabell som innehåller olika tidsintervall. När du distribuerar en Postgres-partitionerad tabell skapas shards för de ärvda tabellerna.
Nästa steg
- Lär dig hur samlokalisering mellan distribuerade data hjälper frågor att köras snabbt.
- Identifiera distributionskolumnen i en distribuerad tabell och andra användbara diagnostikfrågor.