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.