In diesem Blogpost werden wir untersuchen, wie ein MariaDB-Replikations-Setup in einer Multi-Cloud-Umgebung bereitgestellt wird. Angenommen, unsere primäre Anwendung befindet sich bei AWS, ist es die beste Idee, AWS als primäres Rechenzentrum einzurichten, das den MariaDB-Master hostet. Der MariaDB-Slave wird auf GCP gehostet und ClusterControl befindet sich in der privaten Cloud-Infrastruktur des Unternehmens im Büro. Sie sind alle über WireGuards einfachen und sicheren VPN-Tunnel im IP-Bereich von 192.168.50.0/24 verbunden. ClusterControl verwendet diese VPN-Schnittstelle, um die Bereitstellung, Verwaltung und Überwachung aller Datenbankknoten remote durchzuführen.
Hier sind unsere Gastgeber:
- Amazon-Webdienst (AWS):
- Host:MariaDB-Master
- Öffentliche IP:54.151.183.93
- Private IP:10.15.3.170/24 (VPC)
- VPN-IP:192.168.50.101
- Betriebssystem:Ubuntu 18.04.4 LTS (Bionic)
- Spezifikation:t2.medium (2 vCPU, 4 GB Arbeitsspeicher)
- Google Cloud Platform (GCP):
- Host:MariaDB-Slave
- Öffentliche IP:35.247.147.95
- Private IP:10.148.0.9/32
- VPN-IP:192.168.50.102
- Betriebssystem:Ubuntu 18.04.4 LTS (Bionic)
- Spezifikation:n1-standard-1 (1 vCPU, 3,75 GB Arbeitsspeicher)
- VMware Private Cloud (Office):
- Host:ClusterControl
- Öffentliche IP:3.25.96.229
- Private IP:192.168.55.138/24
- VPN-IP:192.168.50.100
- Betriebssystem:Ubuntu 18.04.4 LTS (Bionic)
- Spezifikation:Private Cloud VMWare (2 CPU, 2 GB RAM)
Unsere endgültige Architektur wird in etwa so aussehen:
Die Hostzuordnung unter /etc/hosts auf allen Knoten lautet:
3.25.96.229 cc clustercontrol office.mydomain.com
54.151.183.93 aws1 db1 mariadb1 db1.mydomain.com
35.247.147.95 gcp2 db2 mariadb2 db2.mydomain.com
Das Einrichten von Host-Mapping wird unsere Namensauflösungsverwaltung zwischen Hosts vereinfachen, wobei wir bei der Konfiguration von Wireguard-Peers den Hostnamen anstelle der IP-Adresse verwenden werden.
WireGuard für VPN installieren
Da sich alle Server an drei verschiedenen Orten befinden, die nur über ein öffentliches Netzwerk verbunden sind, werden wir VPN-Tunneling zwischen allen Knoten mit Wireguard einrichten. Für diese Kommunikation fügen wir auf jedem Knoten eine neue Netzwerkschnittstelle mit der folgenden internen IP-Konfiguration hinzu:
- 192.168.50.100 – ClusterControl (Private Office-Cloud)
- 192.168.50.101 – MariaDB-Master (AWS)
- 192.168.50.102 – MariaDB-Slave (GCP)
Installieren Sie Wireguard wie auf dieser Seite gezeigt auf allen drei Knoten:
$ sudo add-apt-repository ppa:wireguard/wireguard
$ sudo apt-get upgrade
$ sudo apt-get install wireguard
Übernehmen Sie für Ubuntu-Hosts einfach den Standardwert, wenn Sie während der Wireguard-Installation dazu aufgefordert werden. Beachten Sie, dass es sehr wichtig ist, das Betriebssystem auf die neueste Version zu aktualisieren, damit Wireguard funktioniert.
Starten Sie den Host neu, um das Wireguard-Kernelmodul zu laden:
$ reboot
Sobald Sie fertig sind, konfigurieren Sie unsere Hostzuordnung in /etc/hosts auf allen Knoten wie folgt:
$ cat /etc/hosts
3.25.96.229 cc clustercontrol office.mydomain.com
54.151.183.93 aws1 db1 mariadb1 db1.mydomain.com
35.247.147.95 gcp2 db2 mariadb2 db2.mydomain.com
127.0.0.1 localhost
Wireguard einrichten
** Alle Schritte in diesem Abschnitt sollten auf allen Knoten durchgeführt werden, sofern nicht anders angegeben.
1) Generieren Sie auf allen Knoten als Root-Benutzer einen privaten Schlüssel und weisen Sie ihm eine sichere Berechtigung zu
$ umask 077
$ wg genkey > /root/private
2) Fügen Sie dann eine neue Schnittstelle namens wg0:
hinzu$ ip link add wg0 type wireguard
3) Fügen Sie der wg0-Schnittstelle die entsprechende IP-Adresse hinzu:
Für Host "cc":
$ ip addr add 192.168.50.100/32 dev wg0
Für Host "aws1":
$ ip addr add 192.168.50.101/32 dev wg0
Für Host „gcp2“:
$ ip addr add 192.168.50.102/32 dev wg0
4) Legen Sie den Listening-Port auf 55555 fest und weisen Sie den generierten privaten Schlüssel der Wireguard-Schnittstelle zu:
$ wg set wg0 listen-port 55555 private-key /root/private
5) Rufen Sie die Netzwerkschnittstelle auf:
$ ip link set wg0 up
6) Sobald die Schnittstelle aktiv ist, überprüfen Sie dies mit dem „wg“-Befehl:
(cc1)$ wg
interface: wg0
public key: sC91qhb5QI4FjBZPlwsTLNIlvuQqsALYt5LZomUFEh4=
private key: (hidden)
listening port: 55555
(aws1) $ wg
interface: wg0
public key: ZLdvYjJlaS56jhEBxWGFFGprvZhtgJKwsLVj3zGonXw=
private key: (hidden)
listening port: 55555
(gcp2) $wg
interface: wg0
public key: M6A18XobRFn7y7u6cg8XlEKy5Nf0ZWqNMOw/vVONhUY=
private key: (hidden)
listening port: 55555
Jetzt sind wir bereit, sie alle zu verbinden.
Hosts über Wireguard-Schnittstelle verbinden
Jetzt werden wir alle Knoten als Peers hinzufügen und ihnen erlauben, miteinander zu kommunizieren. Der Befehl benötigt 4 wichtige Parameter:
- Peer :Öffentlicher Schlüssel für den Zielhost.
- erlaubte IPs :IP-Adresse des Hosts, mit dem kommuniziert werden darf.
- Endpunkt :Der Host und Wireguard und der Listening-Port (hier konfigurieren wir alle Knoten so, dass sie Port 55555 verwenden).
- persistent-keepalive Hinweis:Da NAT und Stateful-Firewalls „Verbindungen“ nachverfolgen, muss ein Peer hinter NAT oder einer Firewall, wenn er eingehende Pakete empfangen möchte, die NAT/Firewall-Zuordnung gültig halten, indem er regelmäßig Keepalive-Pakete sendet. Der Standardwert ist 0 (deaktiviert).
Daher müssen wir auf Host cc „aws1“ und „gcp2“ hinzufügen:
$ wg set wg0 peer ZLdvYjJlaS56jhEBxWGFFGprvZhtgJKwsLVj3zGonXw= allowed-ips 192.168.50.101/32 endpoint aws1:55555 persistent-keepalive 25
$ wg set wg0 peer M6A18XobRFn7y7u6cg8XlEKy5Nf0ZWqNMOw/vVONhUY= allowed-ips 192.168.50.102/32 endpoint gcp2:55555 persistent-keepalive 25
Auf Host "aws1" müssen wir cc und gcp2 hinzufügen:
$ wg set wg0 peer sC91qhb5QI4FjBZPlwsTLNIlvuQqsALYt5LZomUFEh4= allowed-ips 192.168.50.100/32 endpoint cc:55555 persistent-keepalive 25
$ wg set wg0 peer M6A18XobRFn7y7u6cg8XlEKy5Nf0ZWqNMOw/vVONhUY= allowed-ips 192.168.50.102/32 endpoint gcp2:55555 persistent-keepalive 25
Auf Host "gcp2" müssen wir cc und aws1 hinzufügen:
$ wg set wg0 peer sC91qhb5QI4FjBZPlwsTLNIlvuQqsALYt5LZomUFEh4= allowed-ips 192.168.50.100/32 endpoint gcp2:55555 persistent-keepalive 25
$ wg set wg0 peer ZLdvYjJlaS56jhEBxWGFFGprvZhtgJKwsLVj3zGonXw= allowed-ips 192.168.50.101/32 endpoint aws1:55555 persistent-keepalive 25
Versuchen Sie von jedem Host, sich gegenseitig zu pingen und stellen Sie sicher, dass Sie einige Antworten erhalten:
(cc)$ ping 192.168.50.101 # aws1
(cc)$ ping 192.168.50.102 # gcp2
(aws1)$ ping 192.168.50.101 # cc
(aws1)$ ping 192.168.50.102 # gcp2
(gcp2)$ ping 192.168.50.100 # cc
(gcp2)$ ping 192.168.50.101 # aws1
Überprüfen Sie die Ausgabe „wg“, um den aktuellen Status zu überprüfen. Hier ist die Ausgabe von host cc aus Sicht:
interface: wg0
public key: sC91qhb5QI4FjBZPlwsTLNIlvuQqsALYt5LZomUFEh4=
private key: (hidden)
listening port: 55555
peer: M6A18XobRFn7y7u6cg8XlEKy5Nf0ZWqNMOw/vVONhUY=
endpoint: 35.247.147.95:55555
allowed ips: 192.168.50.102/32
latest handshake: 34 seconds ago
transfer: 4.70 KiB received, 6.62 KiB sent
persistent keepalive: every 25 seconds
peer: ZLdvYjJlaS56jhEBxWGFFGprvZhtgJKwsLVj3zGonXw=
endpoint: 54.151.183.93:55555
allowed ips: 192.168.50.101/32
latest handshake: 34 seconds ago
transfer: 3.12 KiB received, 9.05 KiB sent
persistent keepalive: every 25 seconds
Alle Status sehen gut aus. Wir können die Endpunkte, den Handshake-Status und den Bandbreitenstatus zwischen Knoten sehen. Es ist an der Zeit, diese Konfiguration in einer Konfigurationsdatei persistent zu machen, damit sie problemlos von WireGuard geladen werden kann. Wir werden es in einer Datei unter /etc/wireguard/wg0.conf speichern. Erstellen Sie zunächst die Datei:
$ touch /etc/wireguard/wg0.conf
Exportieren Sie dann die Laufzeitkonfiguration für die Schnittstelle wg0 und speichern Sie sie mit dem Befehl "wg-quick" in wg0.conf:
$ wg-quick save wg0
Überprüfen Sie den Inhalt der Konfigurationsdatei (Beispiel für Host "cc"):
(cc)$ cat /etc/wireguard/wg0.conf
[Interface]
Address = 192.168.50.100/24
ListenPort = 55555
PrivateKey = UHIkdA0ExCEpCOL/iD0AFaACE/9NdHYig6CyKb3i1Xo=
[Peer]
PublicKey = ZLdvYjJlaS56jhEBxWGFFGprvZhtgJKwsLVj3zGonXw=
AllowedIPs = 192.168.50.101/32
Endpoint = 54.151.183.93:55555
PersistentKeepalive = 25
[Peer]
PublicKey = M6A18XobRFn7y7u6cg8XlEKy5Nf0ZWqNMOw/vVONhUY=
AllowedIPs = 192.168.50.102/32
Endpoint = 35.247.147.95:55555
PersistentKeepalive = 25
Der Befehl wg-quick bietet einige coole Shortcuts zum Verwalten und Konfigurieren der WireGuard-Schnittstellen. Verwenden Sie dieses Tool, um die Netzwerkschnittstelle nach oben oder unten zu bringen:
(cc)$ wg-quick down wg0
[#] ip link delete dev wg0
(cc)$ wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 192.168.50.100/24 dev wg0
[#] ip link set mtu 8921 up dev wg0
Schließlich weisen wir systemd an, diese Schnittstelle direkt beim Start zu laden:
$ systemctl enable [email protected]
Created symlink /etc/systemd/system/multi-user.target.wants/[email protected] → /lib/systemd/system/[email protected]
An diesem Punkt ist unsere VPN-Konfiguration abgeschlossen und wir können jetzt mit der Bereitstellung beginnen.
MariaDB-Replikation bereitstellen
Sobald alle Knoten in der Architektur miteinander kommunizieren können, ist es an der Zeit, mit dem letzten Schritt fortzufahren, um unsere MariaDB-Replikation mithilfe von ClusterControl bereitzustellen.
Installieren Sie ClusterControl auf cc:
(cc)$ wget https://severalnines.com/downloads/cmon/install-cc
(cc)$ chmod 755 install-cc
(cc)$ ./install-cc
Befolgen Sie die Anweisungen, bis die Installation abgeschlossen ist. Als nächstes müssen wir ein passwortloses SSH vom ClusterControl-Host zu beiden MariaDB-Knoten einrichten. Generieren Sie zunächst einen SSH-Schlüssel für den Benutzer root:
(cc)$ whoami
root
(cc)$ ssh-keygen -t rsa # press Enter for all prompts
Kopieren Sie den Inhalt des öffentlichen Schlüssels unter /root/.ssh/id_rsa.pub auf die MariaDB-Knoten unter /root/.ssh/authorized_keys. Dies setzt voraus, dass root SSH zum Host ausführen darf. Andernfalls konfigurieren Sie den SSH-Daemon so, dass dies entsprechend zugelassen wird. Stellen Sie sicher, dass passwortloses SSH korrekt eingerichtet ist. Führen Sie auf dem ClusterControl-Knoten den Remote-SSH-Befehl aus und stellen Sie sicher, dass Sie eine korrekte Antwort ohne Passwortabfrage erhalten:
(cc)$ ssh 192.168.50.101 "hostname"
aws1
(cc)$ ssh 192.168.50.102 "hostname"
gcp2
Wir können jetzt unsere MariaDB-Replikation bereitstellen. Öffnen Sie einen Webbrowser und gehen Sie zur ClusterControl-Benutzeroberfläche unter http://public_ip_of_CC/clustercontrol, erstellen Sie eine Super-Admin-Benutzeranmeldung. Gehen Sie zu Deploy -> MySQL Replication und geben Sie Folgendes an:
Wählen Sie dann "MariaDB" als Anbieter mit Version 10.4. Geben Sie auch das MariaDB-Root-Passwort an. Geben Sie im Abschnitt „Define Topology“ die Wireguard-IP-Adresse (wg0) der MariaDB-Knoten an, ähnlich wie im folgenden Screenshot:
Klicken Sie auf Bereitstellen und warten Sie, bis die Bereitstellung abgeschlossen ist. Anschließend sollten Sie Folgendes sehen:
Unser MariaDB-Replikations-Setup läuft jetzt an drei verschiedenen Standorten (Büro, AWS und GCP), verbunden mit einem sicheren VPN-Tunneling zwischen Knoten.