De nos jours, Docker est l'outil le plus courant pour créer, déployer et exécuter des applications à l'aide de conteneurs. Cela nous permet de regrouper une application avec toutes les parties dont elle a besoin, telles que des bibliothèques et d'autres dépendances, et de l'expédier dans un seul package. Il pourrait être considéré comme une machine virtuelle, mais au lieu de créer un système d'exploitation virtuel complet, Docker permet aux applications d'utiliser le même noyau Linux que le système sur lequel elles s'exécutent et ne nécessite que des applications livrées avec des éléments qui ne fonctionnent pas déjà sur l'ordinateur hôte. Cela améliore considérablement les performances et réduit la taille de l'application.
Dans le cas des images Docker, elles sont livrées avec une version de système d'exploitation prédéfinie et les packages sont installés d'une manière qui a été décidée par la personne qui a créé l'image. Il est possible que vous souhaitiez utiliser un système d'exploitation différent ou que vous souhaitiez installer les packages d'une manière différente. Dans ces cas, vous devez utiliser une image Docker du système d'exploitation propre et installer le logiciel à partir de zéro.
La réplication est une fonctionnalité courante dans un environnement de base de données, donc après avoir déployé les images TimescaleDB Docker, si vous souhaitez configurer une configuration de réplication, vous devrez le faire manuellement à partir du conteneur, en utilisant un fichier Docker ou même un script. Cette tâche peut être complexe si vous ne connaissez pas Docker.
Dans ce blog, nous verrons comment nous pouvons déployer TimescaleDB via Docker en utilisant une image TimescaleDB Docker, puis nous verrons comment l'installer à partir de zéro en utilisant une image CentOS Docker et ClusterControl.
Comment déployer TimescaleDB avec une image Docker
Voyons d'abord comment déployer TimescaleDB en utilisant une image Docker disponible sur Docker Hub.
$ docker search timescaledb
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
timescale/timescaledb An open-source time-series database optimize… 52
Nous prendrons le premier résultat. Nous devons donc extraire cette image :
$ docker pull timescale/timescaledb
Et exécutez les conteneurs de nœuds mappant un port local au port de la base de données dans le conteneur :
$ docker run -d --name timescaledb1 -p 7551:5432 timescale/timescaledb
$ docker run -d --name timescaledb2 -p 7552:5432 timescale/timescaledb
Après avoir exécuté ces commandes, vous devriez avoir créé cet environnement 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
Maintenant, vous pouvez accéder à chaque nœud avec les commandes suivantes :
$ docker exec -ti [db-container] bash
$ su postgres
$ psql
psql (9.6.13)
Type "help" for help.
postgres=#
Comme vous pouvez le voir, cette image Docker contient une version TimescaleDB 9.6 par défaut, et elle est installée sur Alpine Linux v3.9. Vous pouvez utiliser une autre version de TimescaleDB en changeant la balise :
$ docker pull timescale/timescaledb:latest-pg11
Ensuite, vous pouvez créer un utilisateur de base de données, modifier la configuration en fonction de vos besoins ou configurer manuellement la réplication entre les nœuds.
Comment déployer TimescaleDB avec ClusterControl
Voyons maintenant comment déployer TimescaleDB avec Docker en utilisant une image CentOS Docker (centos) et une image ClusterControl Docker (severalnines/clustercontrol).
Tout d'abord, nous allons déployer un conteneur Docker ClusterControl à l'aide de la dernière version, nous devons donc extraire l'image Docker de manynines/clustercontrol.
$ docker pull severalnines/clustercontrol
Ensuite, nous exécuterons le conteneur ClusterControl et publierons le port 5000 pour y accéder.
$ docker run -d --name clustercontrol -p 5000:80 severalnines/clustercontrol
Maintenant, nous pouvons ouvrir l'interface utilisateur de ClusterControl à l'adresse http://[Docker_Host]:5000/clustercontrol et créer un utilisateur et un mot de passe administrateur par défaut.
L'image Docker officielle CentOS est livrée sans service SSH, nous allons donc l'installer et autoriser la connexion depuis le nœud ClusterControl sans mot de passe en utilisant une clé SSH.
$ docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 5378 [OK]
Nous allons donc extraire l'image Docker officielle de CentOS.
$ docker pull centos
Et puis, nous exécuterons deux conteneurs de nœuds, timescale1 et timescale2, liés à ClusterControl et nous mapperons un port local pour se connecter à la base de données (facultatif).
$ 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
Comme nous devons installer et configurer le service SSH, nous devons exécuter le conteneur avec les paramètres privilégiés et /usr/sbin/init pour pouvoir gérer le service à l'intérieur du conteneur.
Après avoir exécuté ces commandes, nous devrions créer cet environnement 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
Nous pouvons accéder à chaque nœud avec la commande suivante :
$ docker exec -ti [db-container] bash
Comme nous l'avons mentionné précédemment, nous devons installer le service SSH, alors installons-le, autorisons l'accès root et définissons le mot de passe root pour chaque conteneur de base de données :
$ 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
La dernière étape consiste à configurer le SSH sans mot de passe pour tous les conteneurs de base de données. Pour cela, nous devons connaître l'adresse IP de chaque nœud de base de données. Pour le savoir, nous pouvons exécuter la commande suivante pour chaque nœud :
$ docker inspect [db-container] |grep IPAddress
"IPAddress": "172.17.0.5",
Attachez ensuite à la console interactive du conteneur ClusterControl :
$ docker exec -it clustercontrol bash
Et copiez la clé SSH dans tous les conteneurs de base de données :
$ ssh-copy-id 172.17.0.5
Maintenant que les nœuds de serveur sont opérationnels, nous devons déployer notre cluster de base de données. Pour le rendre plus simple, nous utiliserons ClusterControl.
Pour effectuer un déploiement à partir de ClusterControl, ouvrez l'interface utilisateur de ClusterControl à l'adresse http://[Docker_Host]:5000/clustercontrol, puis sélectionnez l'option "Déployer" et suivez les instructions qui s'affichent.
Lors de la sélection de TimescaleDB, nous devons spécifier l'utilisateur, la clé ou le mot de passe et le port pour se connecter par SSH à nos serveurs. Nous avons également besoin d'un nom pour notre nouveau cluster et si nous voulons que ClusterControl installe le logiciel et les configurations correspondants pour nous.
Après avoir configuré les informations d'accès SSH, nous devons définir l'utilisateur, la version et le datadir de la base de données (facultatif). Nous pouvons également spécifier quel référentiel utiliser.
Dans l'étape suivante, nous devons ajouter nos serveurs au cluster que nous allons créer.
Ici, nous devons utiliser l'adresse IP que nous avons précédemment obtenue de chaque conteneur.
Dans la dernière étape, nous pouvons choisir si notre réplication sera synchrone ou asynchrone.
Nous pouvons surveiller l'état de la création de notre nouveau cluster à partir du moniteur d'activité ClusterControl.
Une fois la tâche terminée, nous pouvons voir notre cluster dans l'écran principal de ClusterControl.
Notez que si vous souhaitez ajouter d'autres nœuds de secours, vous pouvez le faire à partir de l'interface utilisateur de ClusterControl dans le menu Actions de cluster.
De la même manière, si vous avez votre cluster TimescaleDB en cours d'exécution sur Docker et que vous souhaitez que ClusterControl le gère pour pouvoir utiliser toutes les fonctionnalités de ce système comme la surveillance, la sauvegarde, le basculement automatique, et plus encore, vous pouvez simplement exécuter le Conteneur ClusterControl dans le même réseau Docker que les conteneurs de base de données. La seule exigence est de s'assurer que les conteneurs cibles ont des packages liés à SSH installés (openssh-server, openssh-clients). Autorisez ensuite SSH sans mot de passe de ClusterControl aux conteneurs de base de données. Une fois cela fait, utilisez la fonction "Importer un serveur/cluster existant" et le cluster doit être importé dans ClusterControl.
Un problème possible lors de l'exécution des conteneurs est l'attribution de l'adresse IP ou du nom d'hôte. Sans un outil d'orchestration comme Kubernetes, l'adresse IP ou le nom d'hôte peut être différent si vous arrêtez les nœuds et créez de nouveaux conteneurs avant de le redémarrer. Vous aurez une adresse IP différente pour les anciens nœuds et ClusterControl suppose que tous les nœuds s'exécutent sur un environnement avec une adresse IP ou un nom d'hôte dédié, donc une fois l'adresse IP modifiée, vous devez réimporter le cluster dans ClusterControl. Il existe de nombreuses solutions de contournement pour ce problème, vous pouvez consulter ce lien pour utiliser Kubernetes avec StatefulSet, ou celui-ci pour exécuter des conteneurs sans outil d'orchestration.
Conclusion
Comme nous avons pu le voir, le déploiement de TimescaleDB avec Docker devrait être facile si vous ne souhaitez pas configurer un environnement de réplication ou de basculement et si vous ne souhaitez pas apporter de modifications à la version du système d'exploitation ou à l'installation des packages de base de données.
Avec ClusterControl, vous pouvez importer ou déployer votre cluster TimescaleDB avec Docker en utilisant l'image du système d'exploitation que vous préférez, ainsi qu'automatiser les tâches de surveillance et de gestion telles que la sauvegarde et le basculement/récupération automatique.