Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 nelle istanze del server flessibile di Database di Azure per PostgreSQL offrono due tipi di partizionamento orizzontale dei dati: basato su righe e basato su schema. Ogni opzione comporta determinati compromessi e consente di 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. Il tenant è determinato mediante la determinazione di una colonna di distribuzione, che consente di dividere una tabella orizzontalmente.
Il partizionamento orizzontale basato su righe è il metodo più efficiente a livello di 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 migliori.
- Migliore densità del tenant per nodo.
Svantaggi:
- Richiede modifiche allo schema.
- Richiede modifiche alle query dell'applicazione.
- Richiede che tutti i tenant condividano lo stesso schema.
Partizionamento orizzontale basato su schema
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 (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-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 |