Modelli di partizionamento in cluster elastici nel server flessibile di Database di Azure 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.

I cluster elastici in Database di Azure per PostgreSQL - Server flessibile offrono due tipi di partizionamento orizzontale dei dati: basato sulle righe e basato sullo schema. Ogni opzione è dotata di compromessi specifici, quindi è possibile scegliere l'approccio più adatto ai requisiti dell'applicazione.

Partizionamento orizzontale basato su righe

Le tabelle vengono partizionate orizzontalmente nel modello di schema condiviso a database singolo, noto anche come partizionamento orizzontale basato su righe, in cui i tenant coesistono come righe all'interno della stessa tabella. Si definisce una colonna di distribuzione per determinare il tenant, che suddivide una tabella orizzontalmente.

Il partizionamento orizzontale basato su righe è il metodo più efficiente per l'hardware. I nodi nel cluster ospitano numerosi tenant e li distribuiscono. Tuttavia, questo approccio richiede la certezza che tutte le tabelle dello schema abbiano la colonna di distribuzione e che tutte le query nel filtro dell'applicazione vengano filtrate in base a tale colonna. Il partizionamento orizzontale basato su righe funziona bene nei carichi di lavoro IoT e per ottenere il miglior margine di utilizzo dell'hardware.

Vantaggi:

  • Prestazioni migliori.
  • Migliore densità del tenant per nodo.

Svantaggi:

  • Richiede modifiche allo schema.
  • Richiede modifiche alle query dell'applicazione.
  • Richiede che tutti i tenant condividono lo stesso schema.

Partizionamento orizzontale basato su schema

Il partizionamento orizzontale basato su schema usa un database condiviso e un modello di schema separato. Ogni schema funge da partizione logica all'interno del database. Le app multi-tenant possono usare uno schema per ogni tenant per partizionare facilmente lungo la dimensione del tenant. Non è necessario modificare le query e l'applicazione richiede solo una piccola modifica per impostare il corretto search_path quando si passa da un tenant all'altro. Il partizionamento orizzontale basato su schema è una soluzione ideale per i microservizi e per gli ISV (Independent Software Vendors) 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.
  • Non è richiesta nessuna modifica dello schema.
  • 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-10.000 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 Yes
Definizioni di tabella personalizzate per tenant Yes NO
Controllo di accesso Autorizzazioni dello schema Autorizzazioni dello 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 Consente di assegnare a specifici ID tenant un proprio gruppo di shard tramite isolate_tenant_to_new_shard