sql >> Databasteknik >  >> RDS >> Database

En guide för att distribuera TimescaleDB med Docker

Nuförtiden är Docker 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. Det 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.

När det gäller Docker Images kommer de med en fördefinierad OS-version och paketen installeras på ett sätt som bestämts av personen som skapade bilden. Det är möjligt att du vill använda ett annat operativsystem eller att du kanske vill installera paketen på ett annat sätt. I dessa fall bör du använda en ren OS Docker Image och installera programvaran från början.

Replikering är en vanlig funktion i en databasmiljö, så efter att ha implementerat TimescaleDB Docker Images, om du vill konfigurera en replikeringsinställning, måste du göra det manuellt från behållaren, genom att använda en Docker-fil eller till och med ett skript. Den här uppgiften kan vara komplex om du inte har Docker-kunskap.

I den här bloggen kommer vi att se hur vi kan distribuera TimescaleDB via Docker genom att använda en TimescaleDB Docker Image, och sedan kommer vi att se hur man installerar den från början genom att använda en CentOS Docker Image och ClusterControl.

Hur man distribuerar TimescaleDB med en Docker Image

Låt oss först se hur du distribuerar TimescaleDB genom att använda en Docker Image tillgänglig på Docker Hub.

$ docker search timescaledb
NAME                                       DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
timescale/timescaledb                      An open-source time-series database optimize…   52

Vi tar det första resultatet. Så vi måste dra den här bilden:

$ docker pull timescale/timescaledb

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

$ docker run -d --name timescaledb1 -p 7551:5432 timescale/timescaledb
$ docker run -d --name timescaledb2 -p 7552:5432 timescale/timescaledb

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

$ docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                    NAMES
6d3bfc75fe39        timescale/timescaledb   "docker-entrypoint.s…"   15 minutes ago      Up 15 minutes       0.0.0.0:7552->5432/tcp   timescaledb2
748d5167041f        timescale/timescaledb   "docker-entrypoint.s…"   16 minutes ago      Up 16 minutes       0.0.0.0:7551->5432/tcp   timescaledb1

Nu kan du komma åt varje nod med följande kommandon:

$ docker exec -ti [db-container] bash
$ su postgres
$ psql
psql (9.6.13)
Type "help" for help.
postgres=#

Som du kan se innehåller denna Docker-bild en TimescaleDB 9.6-version som standard, och den är installerad på Alpine Linux v3.9. Du kan använda en annan TimescaleDB-version genom att ändra taggen:

$ docker pull timescale/timescaledb:latest-pg11

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

Hur man distribuerar TimescaleDB med ClusterControl

Låt oss nu se hur man distribuerar TimescaleDB med Docker genom att använda en CentOS Docker Image (centos) 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 vi öppna ClusterControl UI på http://[Docker_Host]:5000/clustercontrol och skapa en standardadminanvändare och ett lösenord.

CentOS Official Docker Image kommer utan SSH-tjänst, så vi installerar den och tillåter anslutning från ClusterControl-noden med lösenordslös genom att använda en SSH-nyckel.

$ docker search centos
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                             The official build of CentOS.                   5378                [OK]

Så vi tar fram CentOS Official Docker Image.

$ docker pull centos

Sedan kör vi två nodbehållare, timescale1 och timescale2, länkade med ClusterControl och vi mappar en lokal port för att ansluta till databasen (valfritt).

$ docker run -dt --privileged --name timescale1 -p 8551:5432 --link clustercontrol:clustercontrol centos /usr/sbin/init
$ docker run -dt --privileged --name timescale2 -p 8552:5432 --link clustercontrol:clustercontrol centos /usr/sbin/init

Eftersom vi behöver installera och konfigurera SSH-tjänsten måste vi köra behållaren med privilegierade och /usr/sbin/init-parametrar för att kunna hantera tjänsten inuti behållaren.

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

$ docker ps
CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS                       PORTS                                                                                     NAMES
230686d8126e        centos                        "/usr/sbin/init"    4 seconds ago       Up 3 seconds                 0.0.0.0:8552->5432/tcp                                                                    timescale2
c0e7b245f7fe        centos                        "/usr/sbin/init"    23 seconds ago      Up 22 seconds                0.0.0.0:8551->5432/tcp                                                                    timescale1
7eadb6bb72fb        severalnines/clustercontrol   "/entrypoint.sh"    2 weeks ago         Up About an hour (healthy)   22/tcp, 443/tcp, 3306/tcp, 9500-9501/tcp, 9510-9511/tcp, 9999/tcp, 0.0.0.0:5000->80/tcp   clustercontrol

Vi kan komma åt varje nod med följande kommando:

$ docker exec -ti [db-container] bash

Som vi nämnde tidigare måste vi installera SSH-tjänsten, så låt oss installera den, tillåta root-åtkomst och ställa in root-lösenordet för varje databasbehållare:

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

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.5",

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

$ docker exec -it clustercontrol bash

Och kopiera SSH-nyckeln till alla databasbehållare:

$ ssh-copy-id 172.17.0.5

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 "Deploy" och följ instruktionerna som visas.

När vi väljer TimescaleDB 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.

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.

Observera att om du vill lägga till fler standbynoder kan du göra det från ClusterControl UI på menyn Cluster Actions.

På samma sätt, om du har ditt TimescaleDB-kluster igång på Docker och du vill att ClusterControl ska hantera det för att kunna använda alla funktioner i detta system som övervakning, säkerhetskopiering, automatisk failover och ännu mer, kan du helt enkelt köra ClusterControl-behållare 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.

Ett möjligt problem med att köra behållare är IP-adressen eller värdnamnstilldelningen. Utan ett orkestreringsverktyg som Kubernetes kan IP-adressen eller värdnamnet vara annorlunda om du stoppar noderna och skapar nya behållare innan du startar dem igen. Du kommer att ha en annan IP-adress för de gamla noderna och ClusterControl antar att alla noder körs i en miljö med en dedikerad IP-adress eller värdnamn, så efter att IP-adressen ändrats bör du importera om klustret till ClusterControl. Det finns många lösningar för det här problemet, du kan kolla den här länken för att använda Kubernetes med StatefulSet, eller den här för att köra containrar utan orkestreringsverktyg.

Slutsats

Som vi kunde se bör driftsättningen av TimescaleDB med Docker vara lätt om du inte vill konfigurera en replikerings- eller failover-miljö och om du inte vill göra några ändringar i OS-versionen eller installationen av databaspaket.

Med ClusterControl kan du importera eller distribuera ditt TimescaleDB-kluster med Docker genom att använda den OS-avbildning som du föredrar, samt automatisera övervaknings- och hanteringsuppgifter som säkerhetskopiering och automatisk failover/återställning.


  1. SQL Server Trigger:Förståelse och alternativ

  2. Hur kontrollerar man om en sträng är en unik identifierare?

  3. Ett tabellnamn som en variabel

  4. Utför regex (ersätt) i en SQL-fråga