Al giorno d'oggi, Docker è 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. Potrebbe essere considerata 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.
Nel caso di Docker Images, vengono fornite con una versione del sistema operativo predefinita e i pacchetti vengono installati in un modo deciso dalla persona che ha creato l'immagine. È possibile che tu voglia utilizzare un sistema operativo diverso o forse desideri installare i pacchetti in un modo diverso. In questi casi, dovresti utilizzare un'immagine Docker del sistema operativo pulita e installare il software da zero.
La replica è una funzionalità comune in un ambiente di database, quindi dopo aver distribuito le immagini Docker di TimescaleDB, se desideri configurare un'impostazione di replica, dovrai farlo manualmente dal contenitore, utilizzando un file Docker o anche uno script. Questa attività potrebbe essere complessa se non hai conoscenze di Docker.
In questo blog vedremo come distribuire TimescaleDB tramite Docker utilizzando un'immagine Docker TimescaleDB, quindi vedremo come installarlo da zero utilizzando un'immagine Docker CentOS e ClusterControl.
Come distribuire TimescaleDB con un'immagine Docker
Per prima cosa, vediamo come distribuire TimescaleDB utilizzando un'immagine Docker disponibile su Docker Hub.
$ docker search timescaledb
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
timescale/timescaledb An open-source time-series database optimize… 52
Prenderemo il primo risultato. Quindi, dobbiamo estrarre questa immagine:
$ docker pull timescale/timescaledb
Ed esegui i container del nodo mappando una porta locale alla porta del database nel container:
$ docker run -d --name timescaledb1 -p 7551:5432 timescale/timescaledb
$ docker run -d --name timescaledb2 -p 7552:5432 timescale/timescaledb
Dopo aver eseguito questi comandi, dovresti aver creato questo ambiente Docker:
$ 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
Ora puoi accedere a ciascun nodo con i seguenti comandi:
$ docker exec -ti [db-container] bash
$ su postgres
$ psql
psql (9.6.13)
Type "help" for help.
postgres=#
Come puoi vedere, questa Docker Image contiene una versione TimescaleDB 9.6 per impostazione predefinita ed è installata su Alpine Linux v3.9. Puoi utilizzare una versione di TimescaleDB diversa modificando il tag:
$ docker pull timescale/timescaledb:latest-pg11
Quindi, puoi creare un utente del database, modificare la configurazione in base alle tue esigenze o configurare manualmente la replica tra i nodi.
Come distribuire TimescaleDB con ClusterControl
Ora, vediamo come distribuire TimescaleDB con Docker utilizzando un'immagine Docker CentOS (centos) 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 possiamo aprire l'interfaccia utente di ClusterControl all'indirizzo http://[Docker_Host]:5000/clustercontrol e creare un utente e una password amministratore predefiniti.
L'immagine Docker ufficiale di CentOS viene fornita senza il servizio SSH, quindi la installeremo e consentiremo la connessione dal nodo ClusterControl senza password utilizzando una chiave SSH.
$ docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 5378 [OK]
Quindi, estrarremo l'immagine Docker ufficiale di CentOS.
$ docker pull centos
E poi, eseguiremo due container di nodi, timescale1 e timescale2, collegati a ClusterControl e mapperemo una porta locale per la connessione al database (opzionale).
$ 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
Poiché è necessario installare e configurare il servizio SSH, è necessario eseguire il contenitore con i parametri privilegiati e /usr/sbin/init per poter gestire il servizio all'interno del contenitore.
Dopo aver eseguito questi comandi, dovremmo creare questo ambiente Docker:
$ 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
Possiamo accedere a ogni nodo con il seguente comando:
$ docker exec -ti [db-container] bash
Come accennato in precedenza, dobbiamo installare il servizio SSH, quindi installiamolo, consentiamo l'accesso come root e impostiamo la password di root per ogni contenitore di database:
$ 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
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.5",
Quindi, collega alla console interattiva del contenitore ClusterControl:
$ docker exec -it clustercontrol bash
E copia la chiave SSH in tutti i contenitori del database:
$ ssh-copy-id 172.17.0.5
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 all'indirizzo http://[Docker_Host]:5000/clustercontrol, quindi seleziona l'opzione "Deploy" e segui le istruzioni visualizzate.
Quando selezioniamo TimescaleDB, 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.
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.
Tieni presente che, se desideri aggiungere più nodi in standby, puoi farlo dall'interfaccia utente di ClusterControl nel menu Azioni del cluster.
Allo stesso modo, se hai il tuo cluster TimescaleDB in esecuzione su Docker e desideri che ClusterControl lo gestisca per poter utilizzare tutte le funzionalità di questo sistema come monitoraggio, backup, failover automatico e altro ancora, puoi semplicemente eseguire il 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.
Un possibile problema nell'esecuzione dei contenitori è l'assegnazione dell'indirizzo IP o del nome host. Senza uno strumento di orchestrazione come Kubernetes, l'indirizzo IP o il nome host potrebbero essere diversi se interrompi i nodi e crei nuovi contenitori prima di riavviarli. Avrai un indirizzo IP diverso per i vecchi nodi e ClusterControl presuppone che tutti i nodi siano in esecuzione in un ambiente con un indirizzo IP o un nome host dedicato, quindi dopo la modifica dell'indirizzo IP, dovresti reimportare il cluster in ClusterControl. Esistono molte soluzioni alternative per questo problema, puoi controllare questo link per utilizzare Kubernetes con StatefulSet o questo per eseguire container senza lo strumento di orchestrazione.
Conclusione
Come abbiamo potuto vedere, la distribuzione di TimescaleDB con Docker dovrebbe essere semplice se non si desidera configurare un ambiente di replica o failover e se non si desidera apportare modifiche alla versione del sistema operativo o all'installazione dei pacchetti di database.
Con ClusterControl, puoi importare o distribuire il tuo cluster TimescaleDB con Docker utilizzando l'immagine del sistema operativo che preferisci, nonché automatizzare le attività di monitoraggio e gestione come il backup e il failover/ripristino automatico.