Eerder schreven we over het opzetten van een geografisch gedistribueerde databasecluster met MySQL-replicatie. Deze keer gaat het over PostgreSQL. Het opzetten van een geo-gedistribueerd cluster voor PostgreSQL is geen nieuw concept en de topologie is vrij gebruikelijk.
Om een hoge beschikbaarheid te bereiken, verspreiden organisaties en bedrijven hun databaseknooppunten, zodat wanneer zich een rampzalige gebeurtenis voordoet in een specifieke regio (die uw datacenter beïnvloedt), u uw stand-byknooppunten beschikbaar heeft voor failover.
P>Dit is een veel voorkomende praktijk (waarbij dit type topologie wordt gebruikt) als onderdeel van de plannen voor bedrijfscontinuïteit en noodherstel van uw organisatie. Dit type topologie verwijdert het hebben van een single point of failure (SPOF). Een veel voorkomende vereiste, vooral als je een lage RPO en een hogere uptime hebt (indien mogelijk tegen 99,999999999%).
In deze blog zal ik een eenvoudige implementatie geven om dit te doen met ClusterControl. ClusterControl is agentless beheer- en automatiseringssoftware voor databaseclusters. Het helpt bij het implementeren, bewaken, beheren en schalen van uw databaseserver/cluster rechtstreeks vanuit de gebruikersinterface van ClusterControl.
De gewenste architecturale opstelling
Het doel hier is om efficiënt te implementeren in een veilige omgeving. Om dit te doen, is het belangrijk dat u uw bestaande verbinding tussen het gebruik van VPN plaatst en dat u veiliger bent als u uw databaseknooppunten ook via een TLS/SSL-verbinding instelt. Voor deze opstelling in onze blog implementeren we eenvoudig een knooppunt via een VPN en laten we u zien hoe u deze aanpak eenvoudig kunt uitvoeren. Zie hieronder voor het diagram van de doelconfiguratie:
Om de installatie uit te werken, moet het lokale netwerk communiceren via het publiek cloud met behulp van een VPN-tunnel en beide netwerken hebben een VPN-gateway zodat beide kunnen communiceren of een verbinding tot stand kunnen brengen. ClusterControl vereist dat u toezicht houdt op alle knooppunten die moeten worden geregistreerd, omdat het informatie over uw knooppunten verzamelt voor gegevensmetrische gegevens. Afgezien daarvan is het vereist dat uw actieve-schrijver-node op locatie ook de standby-node kan bereiken in het andere domein, dat voor deze blog is, gehost in Google Cloud Platform (GCP).
Uw OpenVPN instellen
OpenVPN instellen is erg lastig voor beide netwerkdomeinen. De kern hiervan is dat het de volgende overweging moet hebben:
- Knooppunten van uw on-prem zullen een verbinding tot stand kunnen brengen met de doelknooppunten van het openbare clouddomein
- Nodes op uw locatie kunnen internettoegang hebben om pakketten te downloaden die nodig zijn om in te stellen. Tenzij je alle benodigde repositories lokaal hebt opgeslagen, kan dit niet het geval zijn
- Nodes uit uw publieke clouddomein kunnen een verbinding tot stand brengen met de on-premise nodes
- Knooppunten uit uw openbare clouddomein kunnen internettoegang hebben om pakketten te downloaden die vereist zijn om in te stellen. Tenzij je alle benodigde repositories lokaal hebt opgeslagen, kan dit niet het geval zijn
OpenVPN installatie en configuratie
Stap één
Installeer het openvpn-pakket (en easy-rsa-pakketten voor Ubuntu/Debian-distributies)
$ sudo apt-get install openvpn easy-rsa
Voor op CentOS/RHEL gebaseerd besturingssysteem,
$ sudo yum install openvpn wget
$ wget -O /tmp/easyrsa https://github.com/OpenVPN/easy-rsa-old/archive/2.3.3.tar.gz
Stap twee
Genereer uw certificaten, zoals certificeringsinstantie (CA), server- en clientcertificaten.
Voor Ubuntu/Debian kunt u de volgende acties uitvoeren:
$ /usr/bin/make-cadir CA
Wijzigen naar CA-map
$ cd CA
Op dit moment kunt u het vars-bestand waarschijnlijk aanpassen aan uw behoeften, bijvoorbeeld
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"
Voer vervolgens het vars-script uit om de vereiste env-variabelen te definiëren
[ ~/CA ]$ source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /CA/keys
Maak een opruimactie
[ ~/CA ]$ ./clean-all
Bouw vervolgens de certificaten voor uw CA, server en client.
[ ~/CA ]$ ./build-ca
[ ~/CA ]$ ./build-key-server server
$ ./build-dh 2048
[ ~/CA ]$ ./build-key client
Genereer tot slot een Perfect Forward Secrecy-sleutel.
$ openvpn --genkey --secret pfs.key
Als je distributies van het type CentOS/RHEL gebruikt, kun je het volgende doen:
$ 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
# Zorg ervoor dat uw RSA-sleutels de juiste rechten hebben om veiligheidsredenen
$ 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
Op dit moment kunt u het vars-bestand waarschijnlijk aanpassen aan uw behoeften, bijvoorbeeld
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"
Voer vervolgens het vars-script uit om de vereiste env-variabelen te definiëren
$ source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /CA/keys
Maak een opruimactie
$ ./clean-all
Bouw vervolgens de certificaten voor uw CA, server en 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
Zodra je alles hebt ingesteld, moet je er rekening mee houden waar je sleutels en certificaten zich bevinden. Als je systemd of service in Linux gebruikt om dit uit te voeren, dan zou je je certificaten en sleutels in /etc/openvpn kunnen plaatsen. Waarschijnlijk moet u de volgende opdracht uitvoeren:
sudo cp dh2048.pem ca.crt server.crt server.key /etc/openvpn
Stap drie
Op dit moment krijg ik de volgende server- en clientconfiguratie. Zie mijn configuratiebestanden dienovereenkomstig,
OpenVPN Server Config
$ 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
Het belangrijkste waar u rekening mee moet houden, zijn de volgende opties, zoals hieronder vermeld.
client-to-client - Zeer belangrijk, zodat knooppunten in de VPN de andere knooppunten in een ander netwerkdomein kunnen pingen. Stel, ClusterControl bevindt zich op locatie en kan de knooppunten in GCP pingen.
push "route 192.168.30.0 255.255.255.0" - Ik push de routeringstabellen zodat GCP-knooppunt(en) die met VPN zijn verbonden, mijn knooppunten in het lokale domein kunnen pingen. In mijn GCP VPN-gateway heb ik de volgende routeringstabellen als push "route 10.142.0.0 255.255.255.0"
#push "redirect-gateway def1 bypass-dhcp" ,
#push "redirect-gateway" - Beide secties zijn niet vereist omdat ik een internetverbinding nodig heb voor beide om mijn repo en afhankelijke pakketten in te stellen bij installatie.
push "dhcp-option DNS 8.8.8.8",
push "dhcp-option DNS 8.8.4.4" - Beide secties kunnen indien nodig worden gewijzigd in uw gewenste DNS. Dit is voor uw gewenste DNS, vooral wanneer u een internetverbinding nodig heeft.
OpenVPN Client Config
$ 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
Het belangrijkste hier is dat je zeker moet zijn van je sleutelpaden, en ook de params in deze sectie moet vervangen,
remote 34.73.238.239 1194
dit kan de hostnaam/IP-adres zijn van uw VPN-servergateway om verbinding mee te maken.
Stap vier
Stel ten slotte een proxy VPN-server in om de netwerkpakketten naar de netwerkinterface op de server te laten routeren en laat de kernel IPV4-verkeer doorsturen
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
Voor een meer diepgaande installatie raad ik je aan deze berichten voor CentOS en Ubuntu te bekijken.
Efficiënt uitbreiden via de cloud
Stel dat u de volgende topologie in uw on-prem domein heeft,
en u wilt nu uw beschikbaarheid uitbreiden naar een ander datacenter, namelijk GCP voor deze blog. Het implementeren met ClusterControl is heel eenvoudig. U kunt de onderstaande procedure uitvoeren,
Stap één
Maak een slavencluster
Stap twee
Kies uw master voor replicatie,
Stap drie
De toegang tot uw openbare cloudomgeving instellen
Stap vier
Specificeer de hostnaam/IP van uw node die moet worden uitgebreid naar uw PG-replicatiecluster,
Stap vijf
Tot slot, controleer de taakactiviteit, hoe reageert ClusterControl op dit soort acties
Het resultaat toont u de koppeling tussen uw on-prem en uw uitgebreide datacenter, dat in deze blog staat, onze GCP PostgreSQL-standby-node. Zie hieronder voor het resultaat
Conclusie
Het opzetten van een stand-byknooppunt voor geolocatie is niet moeilijk, maar het belangrijkste probleem is hoe veilig dit zal zijn in uw architectonisch ontwerp. Het gebruik van een VPN kan de grootste zorg van het probleem wegnemen. Het gebruik van OpenVPN is slechts een eenvoudige manier om dit te implementeren, maar voor zware transactietoepassingen zullen organisaties waarschijnlijk investeren in hoogwaardige services of hardware om met deze configuratie om te gaan. Ook het toevoegen van een TLS/SSL kan makkelijker dan gedaan worden. In onze volgende blogs bespreken we hoe je TLS/SSL kunt gebruiken met PostgreSQL.