Dela via


Horisontell partitionering av modeller

GÄLLER FÖR: Azure Cosmos DB for PostgreSQL (drivs av Citus-databastillägget till PostgreSQL)

Horisontell partitionering är en teknik som används i databassystem och distribuerad databehandling för horisontell partitionering av data över flera servrar eller noder. Det innebär att dela upp en stor databas eller datauppsättning i mindre, mer hanterbara delar som kallas Shards. En shard innehåller en delmängd av data och tillsammans bildar shards hela datamängden.

Azure Cosmos DB for PostgreSQL erbjuder två typer av datasharding, nämligen radbaserad och schemabaserad. Varje alternativ levereras med sina egna kompromisser för horisontell partitionering, så att du kan välja den metod som bäst överensstämmer med programmets krav.

Radbaserad horisontell partitionering

Det traditionella sättet på vilket Azure Cosmos DB for PostgreSQL shards-tabeller är den enskilda databasen, delad schemamodell som även kallas radbaserad horisontell partitionering, klientorganisationer samexisterar som rader i samma tabell. Klientorganisationen bestäms genom att definiera en distributionskolumn, vilket gör det möjligt att dela upp en tabell vågrätt.

Radbaserad är det mest maskinvarueffektiva sättet att partitionera. Klientorganisationer är tätt packade och distribuerade mellan noderna i klustret. Den här metoden kräver dock att alla tabeller i schemat har distributionskolumnen och att alla frågor i programmet filtrerar efter den. Radbaserad horisontell partitionering lyser i IoT-arbetsbelastningar och för att uppnå bästa möjliga marginal av maskinvaruanvändning.

Fördelar:

  • Bästa prestanda
  • Bästa klienttäthet per nod

Nackdelar:

  • Kräver schemaändringar
  • Kräver programfrågeändringar
  • Alla klienter måste dela samma schema

Schemabaserad horisontell partitionering

Tillgänglig med Citus 12.0 i Azure Cosmos DB för PostgreSQL, schemabaserad horisontell partitionering är den delade databasen, separat schemamodell, schemat blir den logiska fragmentet i databasen. Appar med flera klienter kan använda ett schema per klientorganisation för att enkelt fragmentera längs klientdimensionen. Frågeändringar krävs inte och programmet behöver bara en liten ändring för att ange rätt search_path vid växling av klientorganisationer. Schemabaserad horisontell partitionering är en idealisk lösning för mikrotjänster och för ISV:er som distribuerar program som inte kan genomgå de ändringar som krävs för att registrera radbaserad horisontell partitionering.

Fördelar:

  • Klienter kan ha heterogena scheman
  • Inga schemaändringar krävs
  • Inga programfrågeändringar krävs
  • Schemabaserad SQL-kompatibilitet med horisontell partitionering är bättre jämfört med radbaserad horisontell partitionering

Nackdelar:

  • Färre klienter per nod jämfört med radbaserad horisontell partitionering

Kompromisser för horisontell partitionering

Schemabaserad horisontell partitionering Radbaserad horisontell partitionering
Modell för flera innehavare Separat schema per klientorganisation Delade tabeller med klientorganisations-ID-kolumner
Citus-version 12.0+ Alla versioner
Extra steg jämfört med vanilj PostgreSQL Ingen, endast en konfigurationsändring Använd create_distributed_table i varje tabell för att distribuera och samplacera tabeller efter klientorganisations-ID
Antal klienter 1-10k 1-1 M+
Krav för datamodellering Inga sekundärnycklar i distribuerade scheman Behöver inkludera en klientorganisations-ID-kolumn (en distributionskolumn, även kallad partitioneringsnyckel) i varje tabell och i primära nycklar, sekundärnycklar
SQL-krav för frågor med en enda nod Använda ett enda distribuerat schema per fråga Kopplingar och WHERE-satser bör innehålla tenant_id kolumn
Parallella frågor mellan klientorganisationer Nej Ja
Anpassade tabelldefinitioner per klientorganisation Ja Nej
Åtkomstkontroll Schemabehörigheter Schemabehörigheter
Datadelning mellan klienter Ja, med hjälp av referenstabeller (i ett separat schema) Ja, med hjälp av referenstabeller
Isolering av klientorganisation till shard Varje klientorganisation har en egen fragmentgrupp per definition Kan ge specifika klient-ID:n en egen shardgrupp via isolate_tenant_to_new_shard