PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Multi-DC PostgreSQL:Einrichten eines Standby-Knotens an einem anderen geografischen Standort über ein VPN

Zuvor haben wir über das Einrichten eines geografisch verteilten Datenbank-Clusters mit MySQL-Replikation geschrieben. Diesmal geht es um PostgreSQL. Das Einrichten eines geografisch verteilten Clusters für PostgreSQL ist kein neues Konzept und die Topologie ist weit verbreitet.

Um eine hohe Verfügbarkeit zu erreichen, verteilen Organisationen und Unternehmen ihre Datenbankknoten, sodass Sie Ihre Standby-Knoten für ein Failover verfügbar haben, wenn in einer bestimmten Region ein katastrophales Ereignis eintritt (das Ihr Rechenzentrum betrifft).

P>

Dies ist eine sehr gängige Praxis (bei Verwendung dieser Art von Topologie) als Teil der Business Continuity- und Disaster Recovery-Pläne Ihrer Organisation. Diese Art von Topologie macht einen Single Point of Failure (SPOF) überflüssig. Eine häufige Anforderung, insbesondere wenn Sie ein niedriges RPO und eine höhere Betriebszeit haben (möglichst bei 99,999999999 %).

In diesem Blog werde ich eine einfache Implementierung zeigen, wie man dies mit ClusterControl macht. ClusterControl ist eine agentenlose Verwaltungs- und Automatisierungssoftware für Datenbankcluster. Es hilft bei der Bereitstellung, Überwachung, Verwaltung und Skalierung Ihres Datenbankservers/Clusters direkt über die ClusterControl-Benutzeroberfläche.

Der gewünschte architektonische Aufbau

Das angestrebte Ergebnis hier ist eine effiziente Bereitstellung in einer sicheren Umgebung. Um dies zu tun, ist es wichtig, dass Sie Ihre bestehende Verbindung über VPN zwischenschalten müssen und sicherer wäre, wenn Sie Ihre Datenbankknoten auch über eine TLS/SSL-Verbindung einrichten würden. Für dieses Setup in unserem Blog stellen wir einfach einen Knoten über ein VPN bereit und zeigen Ihnen, wie Sie diesen Ansatz einfach umsetzen können. Unten sehen Sie das Diagramm des Zielaufbaus:

Um das Setup auszuarbeiten, soll das On-Premise-Netzwerk öffentlich kommunizieren Cloud über einen VPN-Tunnel und beide Netzwerke müssen über ein VPN-Gateway verfügen, damit beide kommunizieren oder eine Verbindung herstellen können. ClusterControl erfordert, dass Sie alle Knoten überwachen, die registriert werden müssen, da es Informationen über Ihre Knoten für Datenmetriken sammelt. Abgesehen davon muss Ihr lokaler Active-Writer-Knoten auch den Standby-Knoten in der anderen Domäne erreichen können, die für diesen Blog bestimmt ist und auf der Google Cloud Platform (GCP) gehostet wird.

Ihr OpenVPN einrichten

OpenVPN-Setup ist für beide Netzwerkdomänen sehr schwierig. Der Kern davon ist, dass es die folgende Überlegung haben muss:

  • Knoten von Ihrem On-Prem müssen in der Lage sein, eine Verbindung zu den Knoten der öffentlichen Cloud-Zieldomäne herzustellen
  • Knoten von Ihrem On-Prem-Server können Internetzugriff haben, um Pakete herunterzuladen, die für die Einrichtung erforderlich sind. Wenn Sie nicht alle erforderlichen Repositories lokal gespeichert haben, kann dies nicht der Fall sein
  • Knoten aus Ihrer öffentlichen Cloud-Domäne sollen eine Verbindung zu den On-Premise-Knoten herstellen können
  • Knoten aus Ihrer öffentlichen Cloud-Domäne können Internetzugriff haben, um Pakete herunterzuladen, die für die Einrichtung erforderlich sind. Wenn Sie nicht alle erforderlichen Repositories lokal gespeichert haben, kann dies nicht der Fall sein

OpenVPN-Installation und -Konfiguration

Schritt Eins

Installieren Sie das openvpn-Paket (und easy-rsa-Pakete für Ubuntu/Debian-Distributionen)

$ sudo apt-get install openvpn easy-rsa

Für CentOS/RHEL-basierte Betriebssysteme 

$ sudo yum install openvpn wget

$ wget -O /tmp/easyrsa https://github.com/OpenVPN/easy-rsa-old/archive/2.3.3.tar.gz

Schritt Zwei

Generieren Sie Ihre Zertifikate wie Zertifizierungsstellen (CA), Server- und Client-Zertifikate.

Für Ubuntu/Debian können Sie die folgenden Aktionen ausführen:

$ /usr/bin/make-cadir CA

Ins CA-Verzeichnis wechseln

$ cd CA

An dieser Stelle können Sie wahrscheinlich die vars-Datei entsprechend Ihren Anforderungen bearbeiten, z. B.

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"

Führen Sie dann das vars-Skript aus, um die erforderlichen Umgebungsvariablen zu definieren

[ ~/CA ]$ source ./vars

NOTE: If you run ./clean-all, I will be doing a rm -rf on /CA/keys

Führe eine Bereinigung durch

[ ~/CA ]$ ./clean-all

Erstellen Sie dann die Zertifikate für Ihre Zertifizierungsstelle, Ihren Server und Ihren Client.

[ ~/CA ]$ ./build-ca

[ ~/CA ]$ ./build-key-server server

 $ ./build-dh 2048

[ ~/CA ]$ ./build-key client

Zum Schluss generieren Sie einen Perfect Forward Secrecy-Schlüssel.

$ openvpn --genkey --secret pfs.key

Wenn Sie Distributionen vom Typ CentOS/RHEL verwenden, können Sie Folgendes tun:

$ 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

# Stellen Sie aus Sicherheitsgründen sicher, dass Ihre RSA-Schlüssel die richtige Berechtigung haben

$ 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

An dieser Stelle können Sie wahrscheinlich die vars-Datei entsprechend Ihren Anforderungen bearbeiten, z. B.

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"

Führen Sie dann das vars-Skript aus, um die erforderlichen Umgebungsvariablen zu definieren

$ source ./vars

NOTE: If you run ./clean-all, I will be doing a rm -rf on /CA/keys

Führe eine Bereinigung durch

$ ./clean-all

Erstellen Sie dann die Zertifikate für Ihre Zertifizierungsstelle, Ihren Server und Ihren 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

Sobald Sie alle Einstellungen vorgenommen haben, müssen Sie berücksichtigen, wo sich Ihre Schlüssel und Zertifikate befinden. Wenn Sie systemd oder service in Linux verwenden, um dies auszuführen, können Sie Ihre Zertifikate und Schlüssel in /etc/openvpn ablegen. Wahrscheinlich müssen Sie den folgenden Befehl ausführen:

sudo cp dh2048.pem ca.crt server.crt server.key /etc/openvpn

Schritt Drei

An dieser Stelle lande ich bei der folgenden Server- und Client-Konfiguration. Siehe meine Konfigurationsdateien entsprechend,

OpenVPN-Serverkonfiguration

$ 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

Das Wichtigste, was Sie berücksichtigen müssen, sind die folgenden Optionen, wie unten angegeben.

Client-zu-Client - Sehr wichtig, damit Knoten im VPN die anderen Knoten in anderen Netzwerkdomänen anpingen können. Angenommen, ClusterControl befindet sich lokal und kann die Knoten in GCP anpingen.

push "route 192.168.30.0 255.255.255.0" - Ich pushe die Routing-Tabellen, damit GCP-Knoten, die mit VPN verbunden sind, meine Knoten in der lokalen Domäne pingen können. In meinem GCP-VPN-Gateway habe ich die folgenden Routing-Tabellen als Push „route 10.142.0.0 255.255.255.0“

#push "redirect-gateway def1 bypass-dhcp" ,

#push "redirect-gateway" - Diese beiden Abschnitte sind nicht erforderlich, da ich eine Internetverbindung benötige, um sowohl mein Repo als auch abhängige Pakete bei der Installation einzurichten.

push "dhcp-option DNS 8.8.8.8", 

push "dhcp-option DNS 8.8.4.4" - Diese beiden Abschnitte können bei Bedarf in Ihr gewünschtes DNS geändert werden. Dies ist für Ihr gewünschtes DNS, insbesondere wenn Sie eine Internetverbindung benötigen.

OpenVPN-Client-Konfiguration

$ 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

Das Wichtigste hier ist, dass Sie sich Ihrer Schlüsselpfade sicher sein und auch die Parameter in diesem Abschnitt ersetzen müssen,

remote 34.73.238.239  1194  

das kann der Hostname/die IP-Adresse Ihres VPN-Server-Gateways sein, zu dem eine Verbindung hergestellt werden soll.

Schritt Vier

Zuletzt richten Sie den Proxy-VPN-Server ein, damit die Netzwerkpakete an die Netzwerkschnittstelle auf dem Server geleitet werden und der Kernel IPV4-Verkehr weiterleiten kann

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

Für eine ausführlichere Installation schlage ich vor, dass Sie sich diese Posts für CentOS und Ubuntu ansehen.

Effiziente Erweiterung über die Cloud

Angenommen, Sie haben die folgende Topologie in Ihrer lokalen Domäne

und Sie möchten nun Ihre Verfügbarkeit über ein anderes Rechenzentrum, nämlich die GCP, erweitern für diesen Blog. Die Bereitstellung mit ClusterControl ist sehr einfach. Sie können das folgende Verfahren ausführen, das unten angegeben ist,

Schritt Eins

Erstelle einen Slave-Cluster

Schritt Zwei

Wählen Sie Ihren Master für die Replikation,

Schritt Drei

Richten Sie den Zugriff auf Ihre öffentliche Cloud-Umgebung ein

Schritt Vier

Geben Sie den Hostnamen/die IP Ihres Knotens an, der in Ihren PG-Replikationscluster erweitert werden soll,

Schritt Fünf

Schließlich überwachen Sie die Jobaktivität, wie ClusterControl auf diese Art von Aktion reagiert

Das Ergebnis zeigt Ihnen die Verbindung zwischen Ihrem lokalen und Ihrem erweiterten Rechenzentrum, das in diesem Blog unser GCP-PostgreSQL-Standby-Knoten ist. Siehe unten für das Ergebnis

Fazit

Das Einrichten eines Standby-Knotens für Geolokalisierung ist nicht schwierig, aber das Hauptproblem ist, wie sicher dies in Ihrem architektonischen Design sein wird. Die Verwendung eines VPN kann die Hauptsorge des Problems lindern. Die Verwendung von OpenVPN ist nur eine einfache Möglichkeit, dies zu implementieren, aber für schwere Transaktionsanwendungen investieren Unternehmen wahrscheinlich in gehobene Dienste oder Hardware, um mit diesem Setup fertig zu werden. Auch das Hinzufügen von TLS/SSL kann einfacher sein als getan. Wir werden darüber in unseren nächsten Blogs diskutieren, wie Sie TLS/SSL mit PostgreSQL verwenden können.