Modelli di partizionamento orizzontale
SI APPLICA A: Azure Cosmos DB for PostgreSQL (con tecnologia basata su estensione di database Citus per PostgreSQL)
Il partizionamento orizzontale è una tecnica usata nei sistemi di database e nell'elaborazione distribuita per partizionare orizzontalmente i dati tra più server o nodi. Comporta la suddivisione di un database o di un set di dati di grandi dimensioni in parti più piccole e gestibili denominate partizioni. Una partizione contiene un subset dei dati e insieme le partizioni formano il set di dati completo.
Azure Cosmos DB for PostgreSQL offre due tipi di partizionamento orizzontale dei dati, ovvero basati su righe e basati su schema. Ogni opzione comprende determinati compromessi di partizionamento orizzontale, consentendo di scegliere l'approccio più adatto ai requisiti dell'applicazione.
Partizionamento orizzontale basato su righe
Il modo tradizionale in cui le tabelle di partizioni di Azure Cosmos DB for PostgreSQL è il database singolo, il modello di schema condiviso noto anche come partizionamento orizzontale basato su righe, e i tenant coesistono come righe all'interno della stessa tabella. Il tenant è determinato mediante la determinazione di una colonna di distribuzione, che consente di dividere una tabella orizzontalmente.
Il tipo basato su righe è il modo più efficiente di partizionamento orizzontale hardware. I tenant sono densamente compressi e distribuiti tra i nodi del cluster. Questo approccio richiede tuttavia la certezza che tutte le tabelle nello schema abbiano la colonna di distribuzione e che tutte le query nel filtro dell'applicazione vengano filtrate in base a essa. Il partizionamento orizzontale basato su righe è ideale per i carichi di lavoro IoT e riesce a ottenere il miglior margine di utilizzo dell'hardware.
Vantaggi:
- Prestazioni ottimali
- Migliore densità del tenant per nodo
Svantaggi:
- Richiede modifiche allo schema
- Richiede modifiche alle query dell'applicazione
- Tutti i tenant devono condividere lo stesso schema
Partizionamento orizzontale basato su schema
Disponibile con Citus 12.0 in Azure Cosmos DB for PostgreSQL, il partizionamento orizzontale basato su schema è il database condiviso, un modello di schema separato, in cui lo schema diventa la partizione logica all'interno del database. Le app multi-tenant possono usare uno schema per tenant per eseguire facilmente la partizione lungo la dimensione del tenant. Le modifiche alle query non sono necessarie e l'applicazione richiede solo una piccola modifica per impostare il search_path appropriato per la commutazione del tenant. Il partizionamento orizzontale basato su schema è una soluzione ideale per i microservizi e per gli ISV che distribuiscono applicazioni e che non possono subire le modifiche necessarie per eseguire l'onboarding del partizionamento orizzontale basato su righe.
Vantaggi:
- I tenant possono avere schemi eterogenei
- Nessuna modifica dello schema necessaria
- Non sono necessarie modifiche alle query dell'applicazione
- Migliore compatibilità SQL del partizionamento orizzontale basato su schema rispetto al partizionamento orizzontale basato su righe
Svantaggi:
- Numero di tenant per nodo minore rispetto al partizionamento orizzontale basato su righe
Compromessi del partizionamento orizzontale
Partizionamento orizzontale basato su schema | Partizionamento orizzontale basato su righe | |
---|---|---|
Modello multi-tenancy | Schema separato per tenant | Tabelle condivise con colonne ID tenant |
Versione Citus | 12.0+ | Tutte le versioni |
Passaggi aggiuntivi raffrontati con Vanilla PostgreSQL | Nessuno, solo una modifica di configurazione | Usare create_distributed_table in ogni tabella per distribuire e raggruppare le tabelle in base all'ID tenant |
Numero di tenant | 1-10k | 1-1 M+ |
Requisito di modellazione dei dati | Nessuna chiave esterna tra schemi distribuiti | È necessario includere una colonna ID tenant (una colonna di distribuzione, nota anche come chiave di partizionamento) in ogni tabella e nelle chiavi primarie e chiavi esterne |
Requisito SQL per le query a nodo singolo | Usare un singolo schema distribuito per query | I join e le clausole WHERE devono includere una colonna tenant_id |
Query tra tenant parallele | No | Sì |
Definizioni di tabella personalizzate per tenant | Sì | No |
Controllo di accesso | Autorizzazioni per schema | Autorizzazioni per schema |
Condivisione dei dati tra tenant | Sì, usando tabelle di riferimento (in uno schema separato) | Sì, usando tabelle di riferimento |
Isolamento da tenant a partizione | Ogni tenant ha un proprio gruppo di partizioni per definizione | Può assegnare ID tenant specifici al proprio gruppo di partizioni tramite isolate_tenant_to_new_shard |