PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment déployer PostgreSQL sur un conteneur Docker à l'aide de ClusterControl

Docker est devenu 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. Docker 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 nécessite uniquement que les applications soient 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 ce blog, nous verrons comment nous pouvons facilement déployer une configuration PostgreSQL via Docker, et comment transformer notre configuration en une configuration de réplication primaire/de secours en utilisant ClusterControl.

Comment déployer PostgreSQL avec Docker

Voyons d'abord comment déployer manuellement PostgreSQL avec Docker en utilisant une image PostgreSQL Docker.

L'image est disponible sur Docker Hub et vous pouvez la trouver depuis la ligne de commande :

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

Nous prendrons le premier résultat. L'Officiel. Nous devons donc extraire l'image :

$ docker pull postgres

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 node1 -p 6551:5432 postgres
$ docker run -d --name node2 -p 6552:5432 postgres
$ docker run -d --name node3 -p 6553:5432 postgres

Après avoir exécuté ces commandes, vous devriez avoir créé cet environnement 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

Maintenant, vous pouvez accéder à chaque nœud avec la commande suivante :

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

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 importer vos conteneurs PostgreSQL dans ClusterControl

Ressources associées ClusterControl pour PostgreSQL Déploiement de PostgreSQL sur un conteneur Docker Utilisation de Kubernetes pour déployer PostgreSQL

Maintenant que vous avez configuré votre cluster PostgreSQL, vous devez encore le surveiller, alerter en cas de problèmes de performances, gérer les sauvegardes, détecter les pannes et basculer automatiquement vers un serveur sain.

Si vous avez déjà un cluster PostgreSQL exécuté sur Docker et que vous souhaitez que ClusterControl le gère, 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.

Tout d'abord, installons les packages liés à OpenSSH sur les conteneurs de la base de données, autorisons la connexion root, démarrons-la et définissons le mot de passe 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

Démarrez le conteneur ClusterControl (s'il n'est pas démarré) et transférez le port 80 sur le conteneur vers le port 5000 sur l'hôte :

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

Vérifiez que le conteneur ClusterControl est actif :

$ 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

Ouvrez un navigateur Web, accédez à http://[Docker_Host]:5000/clustercontrol et créez un utilisateur et un mot de passe administrateur par défaut. Vous devriez maintenant voir la page principale de ClusterControl.

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

Attachez ensuite à la console interactive du conteneur ClusterControl :

$ docker exec -it clustercontrol bash

Copiez la clé SSH dans tous les conteneurs de base de données :

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

Maintenant, nous pouvons commencer à importer le cluster dans ClusterControl. Ouvrez un navigateur Web et accédez à l'adresse IP de l'hôte physique de Docker avec le port mappé, par exemple http://192.168.100.150:5000/clustercontrol , cliquez sur "Importer un serveur/cluster existant", puis ajoutez les informations suivantes.

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.

Après avoir configuré les informations d'accès SSH, nous devons définir l'utilisateur de la base de données, la version, basedir et l'adresse IP ou le nom d'hôte pour chaque nœud de la base de données.

Assurez-vous d'obtenir la coche verte lors de la saisie du nom d'hôte ou de l'adresse IP, indiquant que ClusterControl est capable de communiquer avec le nœud. Ensuite, cliquez sur le bouton Importer et attendez que ClusterControl termine son travail. Vous pouvez surveiller le processus dans la section d'activité de ClusterControl.

Le cluster de base de données sera répertorié sous le tableau de bord ClusterControl une fois importé.

Notez que si vous n'avez qu'un nœud maître PostgreSQL, vous pouvez l'ajouter dans ClusterControl. Ensuite, vous pouvez ajouter les nœuds de secours à partir de l'interface utilisateur de ClusterControl pour permettre à ClusterControl de les configurer pour vous.

ClusterControlConsole unique pour l'ensemble de votre infrastructure de base de donnéesDécouvrez les autres nouveautés de ClusterControlInstallez ClusterControl GRATUITEMENT

Comment déployer vos conteneurs PostgreSQL avec ClusterControl

Voyons maintenant comment déployer PostgreSQL avec Docker en utilisant une image CentOS Docker (severalnines/centos-ssh) 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

Vous pouvez maintenant ouvrir l'interface utilisateur de ClusterControl sur http://[Docker_Host]:5000/clustercontrol et créez un utilisateur et un mot de passe administrateur par défaut.

Le multiplenines/centos-ssh est livré avec, en plus du service SSH activé, une fonction de déploiement automatique, mais il n'est valable que pour Galera Cluster. PostgreSQL n'est pas encore pris en charge. Nous allons donc définir la variable AUTO_DEPLOYMENT sur 0 dans la commande docker run pour créer les nœuds de bases de données.

$ 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

Après avoir exécuté ces commandes, nous devrions avoir l'environnement Docker suivant :

$ 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

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

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 sur 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 PostgreSQL, 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.

Lors de l'ajout de nos serveurs, nous pouvons entrer l'adresse IP ou le nom d'hôte. 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.

Conclusion

Comme nous avons pu le voir, le déploiement de PostgreSQL avec Docker pourrait être facile au début mais cela demandera un peu plus de travail pour configurer la réplication. Enfin, vous devez surveiller votre cluster pour voir ce qui se passe. Avec ClusterControl, vous pouvez importer ou déployer votre cluster PostgreSQL avec Docker, ainsi qu'automatiser les tâches de surveillance et de gestion telles que la sauvegarde et le basculement/récupération automatique. Essayez-le.