Schaalbaarheid is de eigenschap van een systeem om een groeiend aantal eisen aan te kunnen door resources toe te voegen. De redenen voor dit aantal eisen kunnen tijdelijk zijn, bijvoorbeeld als u een korting lanceert op een uitverkoop, of permanent, voor een toename van klanten of medewerkers. In ieder geval moet u middelen kunnen toevoegen of verwijderen om deze wijzigingen te beheren op basis van de eisen of toename van het verkeer.
Er zijn verschillende benaderingen beschikbaar om uw database te schalen. In deze blog bekijken we wat deze benaderingen zijn en hoe u uw PostgreSQL-database kunt schalen met behulp van Connection Poolers en Load Balancers.
Horizontaal en verticaal schalen
Er zijn twee manieren om uw database te schalen.
- Horizontaal schalen (scale-out):het wordt uitgevoerd door meer databaseknooppunten toe te voegen om een databasecluster te maken of te vergroten. Het kan u helpen de leesprestaties te verbeteren door het verkeer tussen de knooppunten in evenwicht te brengen.
- Verticaal schalen (opschalen):het wordt uitgevoerd door meer hardwarebronnen (CPU, geheugen, schijf) toe te voegen aan een bestaand databaseknooppunt. Het kan nodig zijn om een configuratieparameter te wijzigen zodat PostgreSQL een nieuwe of betere hardwarebron kan gebruiken.
Connection Poolers en Load Balancers
In zowel Horizontale als Verticale Scaling kan het handig zijn om een externe tool toe te voegen om de belasting van uw database te verminderen, wat de prestaties zal verbeteren. Misschien is het niet genoeg, maar het is een goed uitgangspunt. Hiervoor is het een goed idee om een verbindingspooler en een load balancer te implementeren. Ik zei "en" omdat ze zijn ontworpen voor verschillende rollen.
Een pooling van verbindingen is een methode om een pool van verbindingen te maken en deze opnieuw te gebruiken, waarbij wordt vermeden dat er steeds nieuwe verbindingen met de database moeten worden geopend, wat de prestaties van uw toepassingen aanzienlijk zal verbeteren. PgBouncer is een populaire pooler voor verbindingen die is ontworpen voor PostgreSQL.
Het gebruik van een Load Balancer is een manier om hoge beschikbaarheid in uw databasetopologie te hebben en het is ook handig om de prestaties te verbeteren door het verkeer tussen de beschikbare knooppunten te verdelen. Hiervoor is HAProxy een goede optie voor PostgreSQL, omdat het een open-source proxy is die kan worden gebruikt voor het implementeren van hoge beschikbaarheid, taakverdeling en proxying voor op TCP en HTTP gebaseerde applicaties.
Een combinatie van HAProxy, PgBouncer en PostgreSQL implementeren
Een combinatie van beide technologieën, HAProxy en PgBouncer, is waarschijnlijk de beste manier om de prestaties in uw PostgreSQL-omgeving te schalen en te verbeteren. We zullen dus zien hoe we het kunnen implementeren met behulp van de volgende architectuur:
We gaan ervan uit dat ClusterControl is geïnstalleerd, zo niet, ga dan naar de officiële site, of raadpleeg zelfs de officiële documentatie om het te installeren.
Eerst moet u uw PostgreSQL-cluster implementeren met HAProxy ervoor. Volg hiervoor de stappen in deze blogpost om zowel PostgreSQL als HAProxy te implementeren met ClusterControl.
Op dit punt heb je zoiets als dit:
Nu kunt u PgBouncer op elk databaseknooppunt of op een externe machine installeren .
Om de PgBouncer-software te krijgen, kun je naar de PgBouncer-downloadsectie gaan of de RPM- of DEB-repositories gebruiken. Voor dit voorbeeld gebruiken we CentOS 8 en installeren we het vanuit de officiële PostgreSQL-repository.
Download en installeer eerst de bijbehorende repository van de PostgreSQL-site (als je deze nog niet hebt geïnstalleerd):
$ 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
Installeer vervolgens het PgBouncer-pakket:
$ yum install pgbouncer
Als het klaar is, heb je een nieuw configuratiebestand in /etc/pgbouncer/pgbouncer.ini. Als standaard configuratiebestand kunt u het volgende voorbeeld gebruiken:
$ 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
En het authenticatiebestand:
$ cat /etc/pgbouncer/userlist.txt
"admindb" "root123"
Dit is slechts een eenvoudig voorbeeld. Om alle beschikbare parameters te krijgen, kun je de officiële documentatie raadplegen.
Dus in dit geval heb ik PgBouncer in hetzelfde databaseknooppunt geïnstalleerd, luisterend naar alle IP-adressen, en het maakt verbinding met een PostgreSQL-database genaamd "world". Ik beheer ook de toegestane gebruikers in het bestand userlist.txt met een wachtwoord in platte tekst dat indien nodig kan worden versleuteld.
Om de PgBouncer-service te starten, hoeft u alleen maar de volgende opdracht uit te voeren:
$ pgbouncer -d /etc/pgbouncer/pgbouncer.ini
Voer nu de volgende opdracht uit met uw lokale gegevens (poort, host, gebruikersnaam en databasenaam) om toegang te krijgen tot de PostgreSQL-database:
$ psql -p 6432 -h 127.0.0.1 -U admindb world
Password for user admindb:
psql (12.4)
Type "help" for help.
world=#
Dit is een basistopologie. U kunt het verbeteren, bijvoorbeeld door twee of meer load balancer-knooppunten toe te voegen om een enkel storingspunt te voorkomen, en het gebruik van een tool zoals "Keepalived" om de beschikbaarheid te garanderen. Het kan ook worden gedaan met ClusterControl.
Voor meer informatie over PgBouncer en het gebruik ervan, kun je dit blogbericht raadplegen.
Conclusie
Als u uw PostgreSQL-cluster moet schalen, is het toevoegen van HAProxy en PgBouncer een goede manier om tegelijkertijd uit te schalen en op te schalen, aangezien u meer hot standby-knooppunten kunt toevoegen om het verkeer in evenwicht te brengen en u verbetert de prestaties door geopende verbindingen opnieuw te gebruiken.
ClusterControl biedt een hele reeks functies, van monitoring, waarschuwingen, automatische failover, back-up, point-in-time herstel, back-upverificatie tot het schalen van leesreplica's. Dit kan u helpen uw PostgreSQL-database horizontaal of verticaal te schalen vanuit een gebruiksvriendelijke en intuïtieve gebruikersinterface.