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 PostgreSQLOra 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 GRATISCome 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.