PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come distribuire PostgreSQL in un contenitore Docker utilizzando ClusterControl

Docker è diventato lo strumento più comune per creare, distribuire ed eseguire applicazioni utilizzando i container. Ci consente di impacchettare un'applicazione con tutte le parti di cui ha bisogno, come librerie e altre dipendenze, e spedire tutto come un unico pacchetto. Docker potrebbe essere considerato come una macchina virtuale, ma invece di creare un intero sistema operativo virtuale, Docker consente alle applicazioni di utilizzare lo stesso kernel Linux del sistema su cui sono in esecuzione e richiede solo che le applicazioni vengano spedite con elementi non già in esecuzione il computer host. Ciò offre un notevole incremento delle prestazioni e riduce le dimensioni dell'applicazione.

In questo blog vedremo come distribuire facilmente una configurazione PostgreSQL tramite Docker e come trasformare la nostra configurazione in una configurazione di replica primaria/standby utilizzando ClusterControl.

Come distribuire PostgreSQL con Docker

Per prima cosa, vediamo come distribuire PostgreSQL con Docker manualmente utilizzando un'immagine Docker PostgreSQL.

L'immagine è disponibile su Docker Hub e puoi trovarla dalla riga di comando:

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

Prenderemo il primo risultato. Quello Ufficiale. Quindi, dobbiamo estrarre l'immagine:

$ docker pull postgres

Ed esegui i container del nodo mappando una porta locale alla porta del database nel 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

Dopo aver eseguito questi comandi, dovresti aver creato questo ambiente Docker:

$ 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

Ora puoi accedere a ciascun nodo con il seguente comando:

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

Quindi, puoi creare un utente del database, modificare la configurazione in base alle tue esigenze o configurare manualmente la replica tra i nodi.

Come importare i tuoi contenitori PostgreSQL in ClusterControl

Risorse correlate ClusterControl per PostgreSQL Distribuzione di PostgreSQL su un contenitore Docker Utilizzo di Kubernetes per distribuire PostgreSQL

Ora che hai configurato il tuo cluster PostgreSQL, devi ancora monitorarlo, avvisare in caso di problemi di prestazioni, gestire i backup, rilevare gli errori e eseguire automaticamente il failover su un server integro.

Se hai già un cluster PostgreSQL in esecuzione su Docker e desideri che ClusterControl lo gestisca, puoi semplicemente eseguire il contenitore ClusterControl nella stessa rete Docker dei contenitori del database. L'unico requisito è garantire che i contenitori di destinazione abbiano pacchetti relativi a SSH installati (openssh-server, openssh-clients). Quindi consentire SSH senza password da ClusterControl ai contenitori del database. Una volta terminato, utilizza la funzione "Importa server/cluster esistente" e il cluster deve essere importato in ClusterControl.

Innanzitutto, installiamo i pacchetti relativi a OpenSSH sui contenitori del database, consentiamo l'accesso come root, avviamolo e impostiamo la password di root:

$ 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

Avvia il contenitore ClusterControl (se non è avviato) e inoltra la porta 80 del contenitore alla porta 5000 dell'host:

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

Verifica che il contenitore ClusterControl sia attivo:

$ 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

Apri un browser web, vai a http://[Docker_Host]:5000/clustercontrol e creare un utente e una password amministratore predefiniti. Ora dovresti vedere la pagina principale di ClusterControl.

L'ultimo passaggio consiste nell'impostare l'SSH senza password su tutti i contenitori di database. Per questo, abbiamo bisogno di conoscere l'indirizzo IP per ogni nodo del database. Per saperlo, possiamo eseguire il seguente comando per ogni nodo:

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

Quindi, collega alla console interattiva del contenitore ClusterControl:

$ docker exec -it clustercontrol bash

Copia la chiave SSH in tutti i contenitori del database:

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

Ora possiamo iniziare a importare il cluster in ClusterControl. Apri un browser web e vai all'indirizzo IP dell'host fisico di Docker con la porta mappata, ad esempio http://192.168.100.150:5000/clustercontrol , fai clic su "Importa server/cluster esistente", quindi aggiungi le seguenti informazioni.

Dobbiamo specificare Utente, Chiave o Password e la porta per la connessione tramite SSH ai nostri server. Abbiamo anche bisogno di un nome per il nostro nuovo cluster.

Dopo aver impostato le informazioni di accesso SSH, è necessario definire l'utente del database, la versione, il basedir e l'indirizzo IP o il nome host per ciascun nodo del database.

Assicurati di avere il segno di spunta verde quando inserisci il nome host o l'indirizzo IP, a indicare che ClusterControl è in grado di comunicare con il nodo. Quindi fare clic sul pulsante Importa e attendere che ClusterControl termini il proprio lavoro. Puoi monitorare il processo nella Sezione Attività ClusterControl.

Il cluster di database verrà elencato nella dashboard ClusterControl una volta importato.

Nota che, se hai solo un nodo master PostgreSQL, puoi aggiungerlo a ClusterControl. Quindi puoi aggiungere i nodi di standby dall'interfaccia utente di ClusterControl per consentire a ClusterControl di configurarli per te.

ClusterControlSingle Console per l'intera infrastruttura di databaseScopri cos'altro c'è di nuovo in ClusterControlInstalla ClusterControl GRATIS

Come distribuire i tuoi contenitori PostgreSQL con ClusterControl

Ora, vediamo come distribuire PostgreSQL con Docker utilizzando un'immagine Docker CentOS (diverselnines/centos-ssh) e un'immagine Docker ClusterControl (diverselnines/clustercontrol).

Per prima cosa, distribuiremo un ClusterControl Docker Container utilizzando l'ultima versione, quindi dobbiamo estrarre l'immagine Docker manynines/clustercontrol.

$ docker pull severalnines/clustercontrol

Quindi, eseguiremo il contenitore ClusterControl e pubblicheremo la porta 5000 per accedervi.

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

Ora puoi aprire l'interfaccia utente di ClusterControl su http://[Docker_Host]:5000/clustercontrol e crea un utente e una password amministratore predefiniti.

Il manynines/centos-ssh viene fornito con, oltre al servizio SSH abilitato, una funzione di distribuzione automatica, ma è valida solo per Galera Cluster. PostgreSQL non è ancora supportato. Quindi, imposteremo la variabile AUTO_DEPLOYMENT su 0 nel comando docker run per creare i nodi del database.

$ 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

Dopo aver eseguito questi comandi, dovremmo avere il seguente ambiente Docker:

$ 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

Abbiamo bisogno di conoscere l'indirizzo IP per ogni nodo del database. Per saperlo, possiamo eseguire il seguente comando per ogni nodo:

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

Ora che i nodi del server sono attivi e funzionanti, dobbiamo distribuire il nostro cluster di database. Per farlo in modo semplice useremo ClusterControl.

Per eseguire una distribuzione da ClusterControl, apri l'interfaccia utente di ClusterControl su http://[Docker_Host]:5000/clustercontrol , quindi seleziona l'opzione "Distribuisci" e segui le istruzioni visualizzate.

Quando selezioniamo PostgreSQL, dobbiamo specificare Utente, Chiave o Password e la porta per la connessione tramite SSH ai nostri server. Abbiamo anche bisogno di un nome per il nostro nuovo cluster e se vogliamo che ClusterControl installi per noi il software e le configurazioni corrispondenti.

Dopo aver impostato le informazioni di accesso SSH, è necessario definire l'utente, la versione e la datadir del database (opzionale). Possiamo anche specificare quale repository utilizzare.

Nel passaggio successivo, dobbiamo aggiungere i nostri server al cluster che creeremo.

Quando aggiungiamo i nostri server, possiamo inserire IP o nome host. Qui dobbiamo utilizzare l'indirizzo IP che abbiamo ottenuto in precedenza da ciascun container.

Nell'ultimo passaggio, possiamo scegliere se la nostra replica sarà Sincrona o Asincrona.

Possiamo monitorare lo stato della creazione del nostro nuovo cluster dal monitor attività ClusterControl.

Al termine dell'attività, possiamo vedere il nostro cluster nella schermata principale di ClusterControl.

Conclusione

Come abbiamo potuto vedere, la distribuzione di PostgreSQL con Docker potrebbe essere facile all'inizio, ma richiederà un po' più di lavoro per configurare la replica. Infine, dovresti monitorare il tuo cluster per vedere cosa sta succedendo. Con ClusterControl, puoi importare o distribuire il tuo cluster PostgreSQL con Docker, nonché automatizzare le attività di monitoraggio e gestione come il backup e il failover/ripristino automatico. Provalo.