La scalabilità è la proprietà di un sistema per gestire una quantità crescente di richieste aggiungendo risorse. Le ragioni di questa quantità di richieste potrebbero essere temporanee, ad esempio, se si lancia uno sconto su una vendita, o permanenti, per un aumento di clienti o dipendenti. In ogni caso, dovresti essere in grado di aggiungere o rimuovere risorse per gestire questi cambiamenti in base alle richieste o all'aumento del traffico.
Sono disponibili diversi approcci per ridimensionare il database. In questo blog, esamineremo quali sono questi approcci e come ridimensionare il database PostgreSQL utilizzando Connection Pooler e Load Balancer.
Ridimensionamento orizzontale e verticale
Ci sono due modi principali per ridimensionare il tuo database.
- Ridimensionamento orizzontale (scale-out):viene eseguito aggiungendo più nodi di database creando o aumentando un cluster di database. Può aiutarti a migliorare le prestazioni di lettura bilanciando il traffico tra i nodi.
- Ridimensionamento verticale (scale-up):viene eseguito aggiungendo più risorse hardware (CPU, memoria, disco) a un nodo di database esistente. Potrebbe essere necessario modificare alcuni parametri di configurazione per consentire a PostgreSQL di utilizzare una risorsa hardware nuova o migliore.
Collegamenti di connessione e bilanciatori di carico
Nel ridimensionamento orizzontale e verticale, potrebbe essere utile aggiungere uno strumento esterno per ridurre il carico sul database e migliorare le prestazioni. Forse non basta, ma è un buon punto di partenza. Per questo, è una buona idea implementare un pool di connessioni e un bilanciamento del carico. Ho detto "e" perché sono progettati per ruoli diversi.
Un pool di connessioni è un metodo per creare un pool di connessioni e riutilizzarle evitando di aprire continuamente nuove connessioni al database, il che aumenterà considerevolmente le prestazioni delle tue applicazioni. PgBouncer è un popolare pool di connessioni progettato per PostgreSQL.
L'utilizzo di un Load Balancer è un modo per avere un'elevata disponibilità nella topologia del database ed è anche utile per aumentare le prestazioni bilanciando il traffico tra i nodi disponibili. Per questo, HAProxy è una buona opzione per PostgreSQL, in quanto è un proxy open source che può essere utilizzato per implementare alta disponibilità, bilanciamento del carico e proxy per applicazioni basate su TCP e HTTP.
Come implementare una combinazione di HAProxy, PgBouncer e PostgreSQL
Una combinazione di entrambe le tecnologie, HAProxy e PgBouncer, è probabilmente il modo migliore per scalare e migliorare le prestazioni nel tuo ambiente PostgreSQL. Quindi, vedremo come implementarlo utilizzando la seguente architettura:
Supponiamo che tu abbia installato ClusterControl, in caso contrario puoi andare a il sito ufficiale, o anche fare riferimento alla documentazione ufficiale per installarlo.
Per prima cosa, devi distribuire il tuo cluster PostgreSQL con HAProxy davanti ad esso. Per questo, segui i passaggi in questo post del blog per distribuire sia PostgreSQL che HAProxy utilizzando ClusterControl.
A questo punto, avrai qualcosa del genere:
Ora puoi installare PgBouncer su ogni nodo del database o su un computer esterno .
Per ottenere il software PgBouncer puoi andare nella sezione download di PgBouncer, oppure utilizzare i repository RPM o DEB. Per questo esempio, utilizzeremo CentOS 8 e lo installeremo dal repository PostgreSQL ufficiale.
Per prima cosa, scarica e installa il repository corrispondente dal sito PostgreSQL (se non lo hai ancora installato):
$ wget https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
$ rpm -Uvh pgdg-redhat-repo-latest.noarch.rpm
Quindi, installa il pacchetto PgBouncer:
$ yum install pgbouncer
Al termine, avrai un nuovo file di configurazione che si trova in /etc/pgbouncer/pgbouncer.ini. Come file di configurazione predefinito puoi usare il seguente esempio:
$ cat /etc/pgbouncer/pgbouncer.ini
[databases]
world = host=127.0.0.1 port=5432 dbname=world
[pgbouncer]
logfile = /var/log/pgbouncer/pgbouncer.log
pidfile = /var/run/pgbouncer/pgbouncer.pid
listen_addr = *
listen_port = 6432
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
admin_users = admindb
E il file di autenticazione:
$ cat /etc/pgbouncer/userlist.txt
"admindb" "root123"
Questo è solo un esempio di base. Per ottenere tutti i parametri disponibili, puoi consultare la documentazione ufficiale.
Quindi, in questo caso, ho installato PgBouncer nello stesso nodo del database, ascoltando tutti gli indirizzi IP, e si connette a un database PostgreSQL chiamato "world". Gestisco anche gli utenti consentiti nel file userlist.txt con una password in testo semplice che può essere crittografata se necessario.
Per avviare il servizio PgBouncer è sufficiente eseguire il seguente comando:
$ pgbouncer -d /etc/pgbouncer/pgbouncer.ini
Ora, esegui il seguente comando usando le tue informazioni locali (porta, host, nome utente e nome del database) per accedere al database PostgreSQL:
$ psql -p 6432 -h 127.0.0.1 -U admindb world
Password for user admindb:
psql (12.4)
Type "help" for help.
world=#
Questa è una topologia di base. Puoi migliorarlo, ad esempio, aggiungendo due o più nodi di bilanciamento del carico per evitare un singolo punto di errore e utilizzando alcuni strumenti come "Keepalived", per garantire la disponibilità. Può anche essere fatto utilizzando ClusterControl.
Per ulteriori informazioni su PgBouncer e su come utilizzarlo, puoi fare riferimento a questo post del blog.
Conclusione
Se è necessario ridimensionare il cluster PostgreSQL, l'aggiunta di HAProxy e PgBouncer è un buon modo per aumentare e diminuire contemporaneamente, poiché puoi aggiungere più nodi hot standby per bilanciare il traffico e migliorerai le prestazioni riutilizzando le connessioni aperte.
ClusterControl offre un'intera gamma di funzionalità, da monitoraggio, avvisi, failover automatico, backup, ripristino point-in-time, verifica del backup e ridimensionamento delle repliche di lettura. Questo può aiutarti a ridimensionare il tuo database PostgreSQL in modo orizzontale o verticale da un'interfaccia utente amichevole e intuitiva.