A volte è difficile gestire una grande quantità di dati in un'azienda, soprattutto con l'incremento esponenziale dell'analisi dei dati e dell'utilizzo dell'IoT. A seconda delle dimensioni, questa quantità di dati potrebbe influire sulle prestazioni dei tuoi sistemi e probabilmente dovrai ridimensionare i tuoi database o trovare un modo per risolverlo. Esistono diversi modi per ridimensionare i database PostgreSQL e uno di questi è lo Sharding. In questo blog vedremo cos'è lo Sharding e come configurarlo in PostgreSQL utilizzando ClusterControl per semplificare l'attività.
Cos'è lo Sharding?
Il partizionamento orizzontale è l'azione di ottimizzazione di un database separando i dati da una tabella grande in più tabelle piccole. Le tabelle più piccole sono Shard (o partizioni). Partizionamento e partizionamento orizzontale sono concetti simili. La differenza principale è che il partizionamento orizzontale implica che i dati siano distribuiti su più computer mentre il partizionamento riguarda il raggruppamento di sottoinsiemi di dati all'interno di una singola istanza del database.
Ci sono due tipi di Sharding:
-
Sharding orizzontale:ogni nuova tabella ha lo stesso schema della tabella grande ma righe univoche. È utile quando le query tendono a restituire un sottoinsieme di righe che sono spesso raggruppate insieme.
-
Sharding verticale:ogni nuova tabella ha uno schema che è un sottoinsieme dello schema della tabella originale. È utile quando le query tendono a restituire solo un sottoinsieme di colonne dei dati.
Vediamo un esempio:
Tabella Originale
ID | Nome | Età | Paese |
---|---|---|---|
1 | James Smith | 26 | Stati Uniti |
2 | Mary Johnson | 31 | Germania |
3 | Robert Williams | 54 | Canada |
4 | Jennifer Brown | 47 | Francia |
Sharding verticale
Shard1 | Shard2 | |||
---|---|---|---|---|
ID | Nome | Età | ID | Paese |
1 | James Smith | 26 | 1 | Stati Uniti |
2 | Mary Johnson | 31 | 2 | Germania |
3 | Robert Williams | 54 | 3 | Canada |
4 | Jennifer Brown | 47 | 4 | Francia |
Sharding orizzontale
Shard1 | Shard2 | ||||||
---|---|---|---|---|---|---|---|
ID | Nome | Età | Paese | ID | Nome | Età | Paese |
1 | James Smith | 26 | Stati Uniti | 3 | Robert Williams | 54 | Canada |
2 | Mary Johnson | 31 | Germania | 4 | Jennifer Brown | 47 | Francia |
Ora che abbiamo esaminato alcuni concetti di sharding, procediamo al passaggio successivo.
Come distribuire un cluster PostgreSQL?
Utilizzeremo ClusterControl per questa attività. Se non stai ancora utilizzando ClusterControl, puoi installarlo e distribuire o importare il tuo attuale database PostgreSQL selezionando l'opzione "Importa" e segui i passaggi per sfruttare tutte le funzionalità di ClusterControl come backup, failover automatico, avvisi, monitoraggio e altro .
Per eseguire un deployment da ClusterControl, seleziona semplicemente l'opzione "Deploy" e segui le istruzioni che appaiono.
![](http://www.sqldat.com/article/uploadfiles/202205/2022051214360814.png)
Quando si seleziona PostgreSQL, è necessario specificare Utente, Chiave o Password e Porta per connetterti tramite SSH ai tuoi server. Puoi anche aggiungere un nome per il tuo nuovo cluster e, se lo desideri, puoi anche utilizzare ClusterControl per installare il software e le configurazioni corrispondenti per te.
![](http://www.sqldat.com/article/uploadfiles/202205/2022051214360957.png)
Dopo aver impostato le informazioni di accesso SSH, è necessario definire le credenziali del database , versione e datadir (opzionale). Puoi anche specificare quale repository utilizzare.
Per il passaggio successivo, devi aggiungere i tuoi server al cluster che creerai utilizzando l'indirizzo IP o il nome host.
![](http://www.sqldat.com/article/uploadfiles/202205/2022051214360907.png)
Nell'ultimo passaggio, puoi scegliere se la tua replica sarà Sincrona o Asincrono, quindi premi semplicemente su "Distribuisci".
![](http://www.sqldat.com/article/uploadfiles/202205/2022051214361045.png)
Una volta terminata l'attività, vedrai il tuo nuovo cluster PostgreSQL nel schermata principale di ClusterControl.
![](http://www.sqldat.com/article/uploadfiles/202205/2022051214361042.png)
Ora che hai creato il tuo cluster, puoi eseguire diverse attività su di esso come aggiungere un sistema di bilanciamento del carico (HAProxy), un pool di connessioni (pgBouncer) o una nuova replica.
Ripeti il processo per avere almeno due cluster PostgreSQL separati per configurare lo Sharding, che è il passaggio successivo.
Come configurare lo sharding di PostgreSQL?
Ora configureremo lo Sharding usando le partizioni PostgreSQL e il Foreign Data Wrapper (FDW). Questa funzionalità consente a PostgreSQL di accedere ai dati archiviati in altri server. È un'estensione disponibile per impostazione predefinita nell'installazione comune di PostgreSQL.
Utilizzeremo il seguente ambiente:
Servers: Shard1 - 10.10.10.137, Shard2 - 10.10.10.138
Database User: admindb
Table: customers
Per abilitare l'estensione FDW, devi solo eseguire il seguente comando nel tuo server principale, in questo caso, Shard1:
postgres=# CREATE EXTENSION postgres_fdw;
CREATE EXTENSION
Ora creiamo la tabella clienti partizionata per data di registrazione:
postgres=# CREATE TABLE customers (
id INT NOT NULL,
name VARCHAR(30) NOT NULL,
registered DATE NOT NULL
)
PARTITION BY RANGE (registered);
E le seguenti partizioni:
postgres=# CREATE TABLE customers_2021
PARTITION OF customers
FOR VALUES FROM ('2021-01-01') TO ('2022-01-01');
postgres=# CREATE TABLE customers_2020
PARTITION OF customers
FOR VALUES FROM ('2020-01-01') TO ('2021-01-01');
Queste partizioni sono locali. Ora inseriamo alcuni valori di test e controlliamoli:
postgres=# INSERT INTO customers (id, name, registered) VALUES (1, 'James', '2020-05-01');
postgres=# INSERT INTO customers (id, name, registered) VALUES (2, 'Mary', '2021-03-01');
Qui puoi interrogare la partizione principale per vedere tutti i dati:
postgres=# SELECT * FROM customers;
id | name | registered
----+-------+------------
1 | James | 2020-05-01
2 | Mary | 2021-03-01
(2 rows)
O anche interrogare la partizione corrispondente:
postgres=# SELECT * FROM customers_2021;
id | name | registered
----+------+------------
2 | Mary | 2021-03-01
(1 row)
postgres=# SELECT * FROM customers_2020;
id | name | registered
----+-------+------------
1 | James | 2020-05-01
(1 row)
Come puoi vedere, i dati sono stati inseriti in partizioni diverse, in base alla data di registrazione. Ora, nel nodo remoto, in questo caso Shard2, creiamo un'altra tabella:
postgres=# CREATE TABLE customers_2019 (
id INT NOT NULL,
name VARCHAR(30) NOT NULL,
registered DATE NOT NULL);
Devi creare questo server Shard2 in Shard1 in questo modo:
postgres=# CREATE SERVER shard2 FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '10.10.10.138', dbname 'postgres');
E l'utente per accedervi:
postgres=# CREATE USER MAPPING FOR admindb SERVER shard2 OPTIONS (user 'admindb', password 'Passw0rd');
Ora, crea la TABELLA ESTERA in Shard1:
postgres=# CREATE FOREIGN TABLE customers_2019
PARTITION OF customers
FOR VALUES FROM ('2019-01-01') TO ('2020-01-01')
SERVER shard2;
E inseriamo i dati in questa nuova tabella remota da Shard1:
postgres=# INSERT INTO customers (id, name, registered) VALUES (3, 'Robert', '2019-07-01');
INSERT 0 1
postgres=# INSERT INTO customers (id, name, registered) VALUES (4, 'Jennifer', '2019-11-01');
INSERT 0 1
Se tutto è andato bene, dovresti essere in grado di accedere ai dati sia da Shard1 che da Shard2:
Shard1:
postgres=# SELECT * FROM customers;
id | name | registered
----+----------+------------
3 | Robert | 2019-07-01
4 | Jennifer | 2019-11-01
1 | James | 2020-05-01
2 | Mary | 2021-03-01
(4 rows)
postgres=# SELECT * FROM customers_2019;
id | name | registered
----+----------+------------
3 | Robert | 2019-07-01
4 | Jennifer | 2019-11-01
(2 rows)
Shard2:
postgres=# SELECT * FROM customers_2019;
id | name | registered
----+----------+------------
3 | Robert | 2019-07-01
4 | Jennifer | 2019-11-01
(2 rows)
Ecco fatto. Ora stai usando Sharding nel tuo cluster PostgreSQL.
Conclusione
Il partizionamento e lo sharding in PostgreSQL sono buone caratteristiche. Ti aiuta nel caso in cui sia necessario separare i dati in una grande tabella per migliorare le prestazioni o anche per eliminare i dati in modo semplice, tra le altre situazioni. Un punto importante quando si utilizza Sharding è scegliere una buona chiave shard che distribuisca i dati tra i nodi nel modo migliore. Inoltre, puoi utilizzare ClusterControl per semplificare la distribuzione di PostgreSQL e sfruttare alcune funzionalità come monitoraggio, avvisi, failover automatico, backup, ripristino point-in-time e altro.