sql >> Database >  >> RDS >> PostgreSQL

Hoe PostgreSQL in een Docker-container te implementeren met ClusterControl

Docker is de meest gebruikte tool geworden voor het maken, implementeren en uitvoeren van applicaties met behulp van containers. Het stelt ons in staat om een ​​applicatie te verpakken met alle onderdelen die het nodig heeft, zoals bibliotheken en andere afhankelijkheden, en het allemaal als één pakket te verzenden. Docker kan worden beschouwd als een virtuele machine, maar in plaats van een heel virtueel besturingssysteem te creëren, stelt Docker applicaties in staat om dezelfde Linux-kernel te gebruiken als het systeem waarop ze draaien en vereist alleen dat applicaties worden geleverd met dingen die nog niet draaien op de hostcomputer. Dit geeft een aanzienlijke prestatieverbetering en verkleint de applicatie.

In deze blog laten we zien hoe we eenvoudig een PostgreSQL-setup kunnen implementeren via Docker en hoe we onze setup kunnen omzetten in een primaire/standby-replicatie-setup met behulp van ClusterControl.

Hoe PostgreSQL te implementeren met Docker

Laten we eerst eens kijken hoe u PostgreSQL met Docker handmatig kunt implementeren met behulp van een PostgreSQL Docker-image.

De afbeelding is beschikbaar op Docker Hub en u kunt deze vinden vanaf de opdrachtregel:

$ docker search postgres
NAME                                         DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
postgres                                     The PostgreSQL object-relational database sy…   6519                [OK]

We nemen het eerste resultaat. De officiële. Dus we moeten de afbeelding eruit halen:

$ docker pull postgres

En voer de nodecontainers uit die een lokale poort toewijzen aan de databasepoort in de container:

$ docker run -d --name node1 -p 6551:5432 postgres
$ docker run -d --name node2 -p 6552:5432 postgres
$ docker run -d --name node3 -p 6553:5432 postgres

Nadat u deze opdrachten hebt uitgevoerd, zou u deze Docker-omgeving moeten hebben gemaakt:

$ docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS                 PORTS                                                                                     NAMES
51038dbe21f8        postgres                      "docker-entrypoint.s…"   About an hour ago   Up About an hour       0.0.0.0:6553->5432/tcp                                                                    node3
b7a4211744e3        postgres                      "docker-entrypoint.s…"   About an hour ago   Up About an hour       0.0.0.0:6552->5432/tcp                                                                    node2
229c6bd23ff4        postgres                      "docker-entrypoint.s…"   About an hour ago   Up About an hour       0.0.0.0:6551->5432/tcp                                                                    node1

Nu heb je toegang tot elk knooppunt met het volgende commando:

$ docker exec -ti [db-container] bash
$ su postgres
$ psql
psql (11.2 (Debian 11.2-1.pgdg90+1))
Type "help" for help.
postgres=#

Vervolgens kunt u een databasegebruiker maken, de configuratie wijzigen volgens uw vereisten of de replicatie tussen de knooppunten handmatig configureren.

Hoe u uw PostgreSQL-containers in ClusterControl kunt importeren

Gerelateerde bronnen ClusterControl voor PostgreSQL PostgreSQL implementeren op een Docker-container Kubernetes gebruiken om PostgreSQL te implementeren

Nu u uw PostgreSQL-cluster heeft ingesteld, moet u deze nog steeds bewaken, waarschuwen in geval van prestatieproblemen, back-ups beheren, fouten detecteren en automatisch een failover naar een gezonde server uitvoeren.

Als u al een PostgreSQL-cluster op Docker hebt draaien en u wilt dat ClusterControl dit beheert, kunt u de ClusterControl-container eenvoudig in hetzelfde Docker-netwerk uitvoeren als de databasecontainers. De enige vereiste is om ervoor te zorgen dat de doelcontainers SSH-gerelateerde pakketten hebben geïnstalleerd (openssh-server, openssh-clients). Sta vervolgens wachtwoordloze SSH van ClusterControl toe aan de databasecontainers. Als u klaar bent, gebruikt u de functie "Bestaande server/cluster importeren" en moet het cluster worden geïmporteerd in ClusterControl.

Laten we eerst OpenSSH-gerelateerde pakketten op de databasecontainers installeren, de root-login toestaan, opstarten en het root-wachtwoord instellen:

$ docker exec -ti [db-container] apt-get update
$ docker exec -ti [db-container] apt-get install -y openssh-server openssh-client
$ docker exec -it [db-container] sed -i 's|^PermitRootLogin.*|PermitRootLogin yes|g' /etc/ssh/sshd_config
$ docker exec -it [db-container] sed -i 's|^#PermitRootLogin.*|PermitRootLogin yes|g' /etc/ssh/sshd_config
$ docker exec -ti [db-container] service ssh start
$ docker exec -it [db-container] passwd

Start de ClusterControl-container (als deze niet is gestart) en stuur poort 80 op de container door naar poort 5000 op de host:

$ docker run -d --name clustercontrol -p 5000:80 severalnines/clustercontrol

Controleer of de ClusterControl-container up is:

$ docker ps | grep clustercontrol
7eadb6bb72fb        severalnines/clustercontrol   "/entrypoint.sh"         4 hours ago         Up 4 hours (healthy)   22/tcp, 443/tcp, 3306/tcp, 9500-9501/tcp, 9510-9511/tcp, 9999/tcp, 0.0.0.0:5000->80/tcp   clustercontrol

Open een webbrowser, ga naar http://[Docker_Host]:5000/clustercontrol en maak een standaard admin-gebruiker en wachtwoord aan. U zou nu de hoofdpagina van ClusterControl moeten zien.

De laatste stap is het instellen van de wachtwoordloze SSH voor alle databasecontainers. Hiervoor moeten we het IP-adres voor elk databaseknooppunt weten. Om dit te weten, kunnen we de volgende opdracht uitvoeren voor elk knooppunt:

$ docker inspect [db-container] |grep IPAddress
            "IPAddress": "172.17.0.6",

Koppel vervolgens aan de interactieve ClusterControl-containerconsole:

$ docker exec -it clustercontrol bash

Kopieer de SSH-sleutel naar alle databasecontainers:

$ ssh-copy-id 172.17.0.6
$ ssh-copy-id 172.17.0.7
$ ssh-copy-id 172.17.0.8

Nu kunnen we beginnen met het importeren van het cluster in ClusterControl. Open een webbrowser en ga naar Docker's fysieke host-IP-adres met de toegewezen poort, bijvoorbeeld http://192.168.100.150:5000/clustercontrol , klik op "Bestaande server/cluster importeren" en voeg vervolgens de volgende informatie toe.

We moeten Gebruiker, Sleutel of Wachtwoord en poort specificeren om via SSH verbinding te maken met onze servers. We hebben ook een naam nodig voor ons nieuwe cluster.

Na het instellen van de SSH-toegangsinformatie, moeten we de databasegebruiker, versie, basedir en het IP-adres of de hostnaam voor elk databaseknooppunt definiëren.

Zorg ervoor dat u het groene vinkje krijgt bij het invoeren van de hostnaam of het IP-adres, wat aangeeft dat ClusterControl kan communiceren met het knooppunt. Klik vervolgens op de knop Importeren en wacht tot ClusterControl klaar is met zijn taak. U kunt het proces volgen in de sectie ClusterControl-activiteiten.

Het databasecluster wordt weergegeven onder het ClusterControl-dashboard zodra het is geïmporteerd.

Merk op dat, als u alleen een PostgreSQL-hoofdknooppunt heeft, u dit aan ClusterControl kunt toevoegen. Vervolgens kunt u de stand-by-knooppunten toevoegen vanuit de gebruikersinterface van ClusterControl zodat ClusterControl ze voor u kan configureren.

ClusterControlSingle Console voor uw gehele database-infrastructuurOntdek wat er nog meer nieuw is in ClusterControlInstalleer ClusterControl GRATIS

Hoe u uw PostgreSQL-containers kunt implementeren met ClusterControl

Laten we nu eens kijken hoe PostgreSQL met Docker kan worden geïmplementeerd met behulp van een CentOS Docker-image (severalnines/centos-ssh) en een ClusterControl Docker-image (severalnines/clustercontrol).

Eerst zullen we een ClusterControl Docker-container implementeren met de nieuwste versie, dus we moeten de Docker Image met verschillende negens/clustercontrol ophalen.

$ docker pull severalnines/clustercontrol

Vervolgens zullen we de ClusterControl-container uitvoeren en de poort 5000 publiceren om er toegang toe te krijgen.

$ docker run -d --name clustercontrol -p 5000:80 severalnines/clustercontrol

Nu kunt u de gebruikersinterface van ClusterControl openen op http://[Docker_Host]:5000/clustercontrol en maak een standaard admin-gebruiker en wachtwoord aan.

De meerdere negens/centos-ssh wordt geleverd met, naast de ingeschakelde SSH-service, een Auto Deployment-functie, maar deze is alleen geldig voor Galera Cluster. PostgreSQL wordt nog niet ondersteund. We zullen dus de variabele AUTO_DEPLOYMENT op 0 zetten in de opdracht docker run om de databaseknooppunten te maken.

$ docker run -d --name postgres1 -p 5551:5432 --link clustercontrol:clustercontrol -e AUTO_DEPLOYMENT=0 severalnines/centos-ssh
$ docker run -d --name postgres2 -p 5552:5432 --link clustercontrol:clustercontrol -e AUTO_DEPLOYMENT=0 severalnines/centos-ssh
$ docker run -d --name postgres3 -p 5553:5432 --link clustercontrol:clustercontrol -e AUTO_DEPLOYMENT=0 severalnines/centos-ssh

Na het uitvoeren van deze commando's zouden we de volgende Docker-omgeving moeten hebben:

$ docker ps
CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS                    PORTS                                                                                     NAMES
0df916b918a9        severalnines/centos-ssh       "/entrypoint.sh"    4 seconds ago       Up 3 seconds              22/tcp, 3306/tcp, 9999/tcp, 27107/tcp, 0.0.0.0:5553->5432/tcp                             postgres3
4c1829371b5e        severalnines/centos-ssh       "/entrypoint.sh"    11 seconds ago      Up 10 seconds             22/tcp, 3306/tcp, 9999/tcp, 27107/tcp, 0.0.0.0:5552->5432/tcp                             postgres2
79d4263dd7a1        severalnines/centos-ssh       "/entrypoint.sh"    32 seconds ago      Up 31 seconds             22/tcp, 3306/tcp, 9999/tcp, 27107/tcp, 0.0.0.0:5551->5432/tcp                             postgres1
7eadb6bb72fb        severalnines/clustercontrol   "/entrypoint.sh"    38 minutes ago      Up 38 minutes (healthy)   22/tcp, 443/tcp, 3306/tcp, 9500-9501/tcp, 9510-9511/tcp, 9999/tcp, 0.0.0.0:5000->80/tcp   clustercontrol

We moeten het IP-adres voor elk databaseknooppunt weten. Om dit te weten, kunnen we de volgende opdracht uitvoeren voor elk knooppunt:

$ docker inspect [db-container] |grep IPAddress
            "IPAddress": "172.17.0.3",

Nu we de serverknooppunten in gebruik hebben, moeten we ons databasecluster implementeren. Om het op een makkelijke manier te doen gebruiken we ClusterControl.

Om een ​​implementatie uit te voeren vanuit ClusterControl, opent u de ClusterControl UI op http://[Docker_Host]:5000/clustercontrol , selecteer vervolgens de optie "Deploy" en volg de instructies die verschijnen.

Bij het selecteren van PostgreSQL moeten we Gebruiker, Sleutel of Wachtwoord en poort specificeren om via SSH verbinding te maken met onze servers. We hebben ook een naam nodig voor ons nieuwe cluster en als we willen dat ClusterControl de bijbehorende software en configuraties voor ons installeert.

Na het instellen van de SSH-toegangsinformatie, moeten we de databasegebruiker, -versie en datadir (optioneel) definiëren. We kunnen ook specificeren welke repository we moeten gebruiken.

In de volgende stap moeten we onze servers toevoegen aan het cluster dat we gaan maken.

Bij het toevoegen van onze servers kunnen we IP of hostnaam invoeren. Hier moeten we het IP-adres gebruiken dat we eerder van elke container hebben gekregen.

In de laatste stap kunnen we kiezen of onze replicatie synchroon of asynchroon zal zijn.

We kunnen de status van het maken van ons nieuwe cluster volgen via de ClusterControl-activiteitenmonitor.

Zodra de taak is voltooid, kunnen we onze cluster zien in het hoofdscherm van ClusterControl.

Conclusie

Zoals we konden zien, zou de implementatie van PostgreSQL met Docker in het begin eenvoudig kunnen zijn, maar het zal wat meer werk vergen om replicatie te configureren. Ten slotte moet u uw cluster controleren om te zien wat er gebeurt. Met ClusterControl kunt u uw PostgreSQL-cluster importeren of implementeren met Docker, evenals de bewakings- en beheertaken zoals back-up en automatische failover/recovery automatiseren. Probeer het uit.


  1. Hoe kan ik een rij in een tabel BIJWERKEN of INVOEREN als deze niet bestaat?

  2. SQL Server gebruikt een hoge CPU bij het zoeken in nvarchar-strings

  3. PG::UndefinedTable:ERROR:relatie bestaat niet met een juiste Rails-naamgeving en -conventie

  4. Hoe u uw ProxySQL-loadbalancers kunt clusteren