sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man distribuerar PostgreSQL till en Docker-container med ClusterControl

Docker har blivit det vanligaste verktyget för att skapa, distribuera och köra applikationer med hjälp av behållare. Det tillåter oss att paketera en applikation med alla delar den behöver, såsom bibliotek och andra beroenden, och skicka ut allt som ett paket. Docker kan betraktas som en virtuell maskin, men istället för att skapa ett helt virtuellt operativsystem tillåter Docker applikationer att använda samma Linux-kärna som systemet de körs på och kräver bara att applikationer skickas med saker som inte redan körs på värddatorn. Detta ger en betydande prestandaökning och minskar storleken på applikationen.

I den här bloggen kommer vi att se hur vi enkelt kan distribuera en PostgreSQL-installation via Docker, och hur vi vänder vår installation till en primär/standby-replikeringsinställning med hjälp av ClusterControl.

Hur man distribuerar PostgreSQL med Docker

Låt oss först se hur du distribuerar PostgreSQL med Docker manuellt genom att använda en PostgreSQL Docker Image.

Bilden är tillgänglig på Docker Hub och du kan hitta den från kommandoraden:

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

Vi tar det första resultatet. Den officiella. Så vi måste dra bilden:

$ docker pull postgres

Och kör nodbehållarna som mappar en lokal port till databasporten i behållaren:

$ 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

Efter att ha kört dessa kommandon bör du skapa denna Docker-miljö:

$ 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 kan du komma åt varje nod med följande kommando:

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

Sedan kan du skapa en databasanvändare, ändra konfigurationen enligt dina krav eller konfigurera replikering mellan noderna manuellt.

Hur du importerar dina PostgreSQL-behållare till ClusterControl

Relaterade resurser ClusterControl for PostgreSQL Distribuera PostgreSQL på en Docker Container Använda Kubernetes för att distribuera PostgreSQL

Nu när du har ställt in ditt PostgreSQL-kluster behöver du fortfarande övervaka det, varna vid prestandaproblem, hantera säkerhetskopior, upptäcka fel och automatiskt failover till en frisk server.

Om du redan har ett PostgreSQL-kluster som körs på Docker och du vill att ClusterControl ska hantera det, kan du helt enkelt köra ClusterControl-behållaren i samma Docker-nätverk som databasbehållarna. Det enda kravet är att säkerställa att målbehållarna har SSH-relaterade paket installerade (openssh-server, openssh-clients). Tillåt sedan lösenordslös SSH från ClusterControl till databasbehållarna. När du är klar använder du funktionen "Importera befintlig server/kluster" och klustret bör importeras till ClusterControl.

Låt oss först installera OpenSSH-relaterade paket på databasbehållarna, tillåta rotinloggningen, starta den och ställa in root-lösenordet:

$ 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

Starta ClusterControl-behållaren (om den inte har startat) och vidarebefordra port 80 på behållaren till port 5000 på värden:

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

Kontrollera att ClusterControl-behållaren är uppe:

$ 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

Öppna en webbläsare, gå till http://[Docker_Host]:5000/clustercontrol och skapa en standardadminanvändare och ett lösenord. Du bör nu se ClusterControls huvudsida.

Det sista steget är att ställa in den lösenordslösa SSH för alla databasbehållare. För detta behöver vi veta IP-adressen för varje databasnod. För att veta det kan vi köra följande kommando för varje nod:

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

Fäst sedan till ClusterControl-behållarens interaktiva konsol:

$ docker exec -it clustercontrol bash

Kopiera SSH-nyckeln till alla databasbehållare:

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

Nu kan vi börja importera klustret till ClusterControl. Öppna en webbläsare och gå till Dockers fysiska värd-IP-adress med den mappade porten, t.ex. http://192.168.100.150:5000/clustercontrol , klicka på "Importera befintlig server/kluster" och lägg sedan till följande information.

Vi måste ange användare, nyckel eller lösenord och port för att ansluta med SSH till våra servrar. Vi behöver också ett namn för vårt nya kluster.

Efter att ha ställt in SSH-åtkomstinformationen måste vi definiera databasanvändare, version, baseir och IP-adress eller värdnamn för varje databasnod.

Se till att du får den gröna bocken när du anger värdnamnet eller IP-adressen, vilket indikerar att ClusterControl kan kommunicera med noden. Klicka sedan på knappen Importera och vänta tills ClusterControl slutför sitt jobb. Du kan övervaka processen i ClusterControl Activity Section.

Databasklustret kommer att listas under ClusterControl-instrumentpanelen när det har importerats.

Observera att om du bara har en PostgreSQL-masternod kan du lägga till den i ClusterControl. Sedan kan du lägga till standbynoderna från ClusterControl UI så att ClusterControl kan konfigurera dem åt dig.

ClusterControlSingle Console för hela din databasinfrastrukturTa reda på vad mer som är nytt i ClusterControlInstallera ClusterControl GRATIS

Hur du distribuerar dina PostgreSQL-behållare med ClusterControl

Låt oss nu se hur du distribuerar PostgreSQL med Docker genom att använda en CentOS Docker Image (severalnines/centos-ssh) och en ClusterControl Docker Image (severalnines/clustercontrol).

Först kommer vi att distribuera en ClusterControl Docker Container med den senaste versionen, så vi måste dra fleranines/clustercontrol Docker Image.

$ docker pull severalnines/clustercontrol

Sedan kör vi ClusterControl-behållaren och publicerar port 5000 för att komma åt den.

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

Nu kan du öppna ClusterControl UI på http://[Docker_Host]:5000/clustercontrol och skapa en standardadminanvändare och ett lösenord.

Flera nines/centos-ssh kommer med, förutom SSH-tjänsten aktiverad, en automatisk distributionsfunktion, men den är bara giltig för Galera Cluster. PostgreSQL stöds inte ännu. Så vi sätter variabeln AUTO_DEPLOYMENT i 0 i docker run-kommandot för att skapa databasens noder.

$ 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

Efter att ha kört dessa kommandon bör vi ha följande Docker-miljö:

$ 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

Vi behöver veta IP-adressen för varje databasnod. För att veta det kan vi köra följande kommando för varje nod:

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

Nu har vi servernoderna igång, vi måste distribuera vårt databaskluster. För att göra det på ett enkelt sätt använder vi ClusterControl.

För att utföra en distribution från ClusterControl, öppna ClusterControl UI på http://[Docker_Host]:5000/clustercontrol , välj sedan alternativet "Distribuera" och följ instruktionerna som visas.

När vi väljer PostgreSQL måste vi ange Användare, Nyckel eller Lösenord och port för att ansluta med SSH till våra servrar. Vi behöver också ett namn för vårt nya kluster och om vi vill att ClusterControl ska installera motsvarande programvara och konfigurationer åt oss.

Efter att ha ställt in SSH-åtkomstinformationen måste vi definiera databasanvändare, version och datadir (valfritt). Vi kan också specificera vilket arkiv som ska användas.

I nästa steg måste vi lägga till våra servrar i klustret som vi ska skapa.

När vi lägger till våra servrar kan vi ange IP eller värdnamn. Här måste vi använda IP-adressen som vi fick från varje container tidigare.

I det sista steget kan vi välja om vår replikering ska vara Synchronous eller Asynchronous.

Vi kan övervaka statusen för skapandet av vårt nya kluster från ClusterControl-aktivitetsmonitorn.

När uppgiften är klar kan vi se vårt kluster på huvudskärmen för ClusterControl.

Slutsats

Som vi kunde se kan distributionen av PostgreSQL med Docker vara lätt i början men det kommer att kräva lite mer arbete att konfigurera replikering. Slutligen bör du övervaka ditt kluster för att se vad som händer. Med ClusterControl kan du importera eller distribuera ditt PostgreSQL-kluster med Docker, samt automatisera övervaknings- och hanteringsuppgifter som säkerhetskopiering och automatisk failover/återställning. Prova det.


  1. Säkerhetskopiera PostgreSQL med pg_dump och pg_dumpall

  2. PostgresSQL-installationen misslyckades:initiering av databaskluster misslyckades MAC OS

  3. RDBMS vs NoSQL

  4. Skillnad mellan tidsstämplar med/utan tidszon i PostgreSQL