Auparavant, nous avons écrit sur la configuration d'un cluster de bases de données géo-distribuées à l'aide de la réplication MySQL. Cette fois, il s'agit de PostgreSQL. La configuration d'un cluster géo-distribué pour PostgreSQL n'est pas un nouveau concept et la topologie est assez courante.
Pour atteindre une haute disponibilité, les organisations et les entreprises dispersent leurs nœuds de base de données afin que lorsqu'un événement catastrophique se produit dans une région spécifique (qui affecte votre centre de données), vos nœuds de secours soient disponibles pour le basculement.
Il s'agit d'une pratique très courante (utilisant ce type de topologie) dans le cadre des plans de continuité des activités et de reprise après sinistre de votre organisation. Ce type de topologie supprime le fait d'avoir un point de défaillance unique (SPOF). Une exigence courante, surtout si vous avez un faible RPO et un temps de disponibilité plus élevé (si possible à 99,999999999 %).
Dans ce blog, je vais prendre une implémentation simple sur la façon de procéder à l'aide de ClusterControl. ClusterControl est un logiciel de gestion et d'automatisation sans agent pour les clusters de bases de données. Il aide à déployer, surveiller, gérer et mettre à l'échelle votre serveur/cluster de base de données directement à partir de l'interface utilisateur de ClusterControl.
La configuration architecturale souhaitée
Le résultat visé ici est de déployer efficacement dans un environnement sécurisé. Pour ce faire, il est important que vous deviez placer votre connexion établie entre deux utilisations VPN et que vous soyez plus sécurisé si vous configuriez également vos nœuds de base de données via une connexion TLS/SSL. Pour cette configuration dans notre blog, nous déployons simplement un nœud sur un VPN et vous montrons comment vous pouvez facilement appliquer cette approche. Voir ci-dessous le schéma de la configuration cible :
Pour élaborer la configuration, le réseau sur site doit communiquer sur le public cloud à l'aide d'un tunnel VPN et ces deux réseaux doivent avoir une passerelle VPN afin que les deux puissent communiquer ou établir une connexion. ClusterControl vous oblige à superviser tous les nœuds qui doivent être enregistrés car il collectera des informations sur vos nœuds pour les métriques de données. En plus de cela, il faut que votre nœud d'écriture actif sur site puisse également atteindre le nœud de secours dans l'autre domaine, qui est pour ce blog, hébergé sur Google Cloud Platform (GCP).
Configurer votre OpenVPN
La configuration d'OpenVPN est très délicate pour les deux domaines de réseau. L'essentiel de ceci est qu'il doit avoir la considération suivante :
- Les nœuds de votre site sur site doivent pouvoir établir une connexion avec les nœuds du domaine de cloud public cible
- Les nœuds de votre site sur site peuvent avoir accès à Internet pour télécharger les packages nécessaires à la configuration. À moins que vous n'ayez tous les référentiels stockés localement qui sont nécessaires, cela peut ne pas être le cas
- Les nœuds de votre domaine de cloud public doivent pouvoir établir une connexion avec les nœuds sur site
- Les nœuds de votre domaine de cloud public peuvent avoir accès à Internet pour télécharger les packages nécessaires à la configuration. À moins que vous n'ayez tous les référentiels stockés localement qui sont nécessaires, cela peut ne pas être le cas
Installation et configuration d'OpenVPN
Première étape
Installez le package openvpn (et les packages easy-rsa pour les distributions Ubuntu/Debian)
$ sudo apt-get install openvpn easy-rsa
Pour les systèmes d'exploitation basés sur CentOS/RHEL,
$ sudo yum install openvpn wget
$ wget -O /tmp/easyrsa https://github.com/OpenVPN/easy-rsa-old/archive/2.3.3.tar.gz
Étape 2
Générez vos certificats tels que les certificats d'autorité de certification (CA), de serveur et de client.
Pour Ubuntu/Debian, vous pouvez effectuer les actions suivantes :
$ /usr/bin/make-cadir CA
Passer au répertoire CA
$ cd CA
À ce stade, vous pouvez modifier le fichier vars en fonction de vos besoins, par exemple
export KEY_COUNTRY="SE"
export KEY_PROVINCE="SMD"
export KEY_CITY="Kalmar"
export KEY_ORG="Severalnines"
export KEY_EMAIL="[email protected]"
export KEY_CN="S9s"
export KEY_NAME="server"
export KEY_OU="Support Unit"
Ensuite, exécutez le script vars pour définir les variables d'environnement requises
[ ~/CA ]$ source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /CA/keys
Exécuter un nettoyage
[ ~/CA ]$ ./clean-all
Ensuite, créez les certificats pour votre autorité de certification, votre serveur et votre client.
[ ~/CA ]$ ./build-ca
[ ~/CA ]$ ./build-key-server server
$ ./build-dh 2048
[ ~/CA ]$ ./build-key client
Enfin, générez une clé Perfect Forward Secrecy.
$ openvpn --genkey --secret pfs.key
Si vous utilisez des distributions de type CentOS/RHEL, vous pouvez effectuer les opérations suivantes :
$ tar xfz /tmp/easyrsa
$ sudo mkdir /etc/openvpn/easy-rsa
$ sudo cp -rf easy-rsa-old-2.3.3/easy-rsa/2.0/* /etc/openvpn/easy-rsa
# Assurez-vous que vos clés RSA sont sur la bonne autorisation pour des raisons de sécurité
$ sudo chown vagrant /etc/openvpn/easy-rsa/
$ sudo cp /usr/share/doc/openvpn-2.4.4/sample/sample-config-files/server.conf /etc/openvpn
$ sudo mkdir /etc/openvpn/easy-rsa/keys
$ sudo nano /etc/openvpn/easy-rsa/vars
$ cd /etc/openvpn/easy-rsa
À ce stade, vous pouvez modifier le fichier vars en fonction de vos besoins, par exemple
export KEY_COUNTRY="SE"
export KEY_PROVINCE="SMD"
export KEY_CITY="Kalmar"
export KEY_ORG="Severalnines"
export KEY_EMAIL="[email protected]"
export KEY_CN="S9s"
export KEY_NAME="server"
export KEY_OU="Support Unit"
Ensuite, exécutez le script vars pour définir les variables d'environnement requises
$ source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /CA/keys
Exécuter un nettoyage
$ ./clean-all
Ensuite, créez les certificats pour votre autorité de certification, votre serveur et votre client.
$ ./build-ca
$ ./build-key-server server
$ ./build-dh 2048
$ cd /etc/openvpn/easy-rsa
$ ./build-key client
$ cp /etc/openvpn/easy-rsa/openssl-1.0.0.cnf /etc/openvpn/easy-rsa/openssl.cnf
Une fois que vous avez tout configuré, vous devez tenir compte de l'emplacement de vos clés et certificats. Si vous utilisez systemd ou service sous Linux pour l'exécuter, vous pouvez placer vos certificats et clés dans /etc/openvpn. Vous devrez probablement exécuter la commande suivante :
sudo cp dh2048.pem ca.crt server.crt server.key /etc/openvpn
Étape 3
À ce stade, je me retrouve avec la configuration suivante du serveur et du client. Voir mes fichiers de configuration en conséquence,
Configuration du serveur OpenVPN
$ cat /etc/openvpn/server-ovpn.conf
port 1194
proto udp
dev tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key # This file should be kept secret
dh /etc/openvpn/keys/dh2048.pem
cipher AES-256-CBC
auth SHA512
server 10.8.0.0 255.255.255.0
client-to-client
topology subnet
push "route 192.168.30.0 255.255.255.0"
#push "redirect-gateway def1 bypass-dhcp"
#push "redirect-gateway"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
persist-key
persist-tun
#status openvpn-status.log
#log-append openvpn.log
verb 3
tls-server
tls-auth /etc/openvpn/keys/pfs.key
La chose la plus importante que vous devez prendre en compte sont les options suivantes, comme indiqué ci-dessous.
client à client - Très important pour que les nœuds du VPN puissent envoyer un ping aux autres nœuds dans un domaine de réseau différent. Disons que ClusterControl est situé sur site, il peut envoyer un ping aux nœuds dans GCP.
push "route 192.168.30.0 255.255.255.0" :je pousse les tables de routage afin que le ou les nœuds GCP connectés au VPN puissent envoyer un ping à mes nœuds dans le domaine sur site. Dans ma passerelle VPN GCP, j'ai les tables de routage suivantes en push "route 10.142.0.0 255.255.255.0"
#push "redirect-gateway def1 bypass-dhcp" ,
#push "redirect-gateway" - Ces deux sections ne sont pas nécessaires car j'ai besoin d'une connexion Internet pour configurer mon référentiel et les packages dépendants lors de l'installation.
push "dhcp-option DNS 8.8.8.8",
push "dhcp-option DNS 8.8.4.4" : ces deux sections peuvent être modifiées selon le DNS de votre choix si nécessaire. Ceci est pour votre DNS souhaité, en particulier lorsque vous avez besoin d'une connexion Internet.
Configuration du client OpenVPN
$ cat openvpn/client-vpn.ovpn
client
dev tun
proto udp
remote 34.73.238.239 1194
ca ca.crt
cert client.crt
key client.key
tls-version-min 1.2
tls-cipher TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256:TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256:TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256
cipher AES-256-CBC
auth SHA512
resolv-retry infinite
auth-retry none
nobind
persist-key
persist-tun
ns-cert-type server
comp-lzo
verb 3
tls-client
tls-auth pfs.key
La chose la plus importante ici est que vous devez être sûr de vos chemins de clé, et également remplacer les paramètres dans cette section,
remote 34.73.238.239 1194
qui peut être le nom d'hôte/l'adresse IP de la passerelle de votre serveur VPN auquel se connecter.
Étape 4
Enfin, configurez le serveur proxy VPN pour que les paquets réseau soient acheminés vers l'interface réseau sur le serveur et permettre au noyau de transférer le trafic IPV4
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
sudo echo 1 > /proc/sys/net/ipv4/ip_forward
Pour une installation plus approfondie, je vous suggère de consulter ces articles pour CentOS et sur Ubuntu.
S'étendre efficacement sur le cloud
Supposons que vous ayez la topologie suivante dans votre domaine sur site,
et vous souhaitez maintenant étendre votre disponibilité sur un autre centre de données, qui est GCP pour ce blog. Le déploiement à l'aide de ClusterControl est très simple. Vous pouvez effectuer la procédure suivante indiquée ci-dessous,
Première étape
Créer un cluster esclave
Étape 2
Choisissez votre maître pour la réplication,
Étape 3
Configurez l'accès à votre environnement de cloud public
Étape 4
Spécifiez le nom d'hôte/IP de votre nœud à étendre dans votre cluster de réplication PG,
Étape 5
Enfin, surveillez l'activité du travail, comment ClusterControl réagit-il à ce type d'action
Le résultat vous montrera le lien entre votre centre de données sur site et votre centre de données étendu, qui se trouve dans ce blog, notre nœud de secours GCP PostgreSQL. Voir ci-dessous pour le résultat
Conclusion
La configuration d'un nœud de secours de géolocalisation n'est pas difficile, mais le principal problème est de savoir dans quelle mesure il sera sécurisé dans votre conception architecturale. L'utilisation d'un VPN peut atténuer la principale préoccupation du problème. L'utilisation d'OpenVPN n'est qu'un moyen simple de mettre cela en œuvre, mais pour les applications transactionnelles lourdes, les organisations sont susceptibles d'investir dans des services ou du matériel haut de gamme pour faire face à cette configuration. Aussi en ajoutant un TLS/SSL peut être plus facile que fait. Nous en discuterons sur la façon dont vous pouvez utiliser TLS/SSL avec PostgreSQL dans nos prochains blogs.