In deze blogpost gaan we kijken hoe je een MariaDB-replicatie-installatie in een multi-cloudomgeving kunt implementeren. Stel dat onze primaire applicatie zich bij AWS bevindt, dan is het het beste idee om AWS in te stellen als het primaire datacenter dat de MariaDB-master host. De MariaDB-slave wordt gehost op GCP en ClusterControl bevindt zich in de privécloudinfrastructuur van het bedrijf op kantoor. Ze zijn allemaal verbonden via WireGuard, een eenvoudige en veilige VPN-tunnel in het IP-bereik van 192.168.50.0/24. ClusterControl zal deze VPN-interface gebruiken om op afstand implementatie, beheer en monitoring uit te voeren op alle databaseknooppunten.
Dit zijn onze hosts:
- Amazon Web Service (AWS):
- Host:MariaDB-master
- Openbaar IP-adres:54.151.183.93
- Privé IP:10.15.3.170/24 (VPC)
- VPN IP:192.168.50.101
- OS:Ubuntu 18.04.4 LTS (Bionic)
- Spec:t2.medium (2 vCPU, 4 GB geheugen)
- Google Cloud Platform (GCP):
- Host:MariaDB-slaaf
- Openbaar IP-adres:35.247.147.95
- Privé IP:10.148.0.9/32
- VPN IP:192.168.50.102
- OS:Ubuntu 18.04.4 LTS (Bionic)
- Spec:n1-standard-1 (1 vCPU, 3,75 GB geheugen)
- VMware Private Cloud (Office):
- Host:ClusterControl
- Openbaar IP-adres:3.25.96.229
- Privé IP:192.168.55.138/24
- VPN IP:192.168.50.100
- OS:Ubuntu 18.04.4 LTS (Bionic)
- Spec:Private cloud VMWare (2 CPU, 2 GB RAM)
Onze uiteindelijke architectuur ziet er ongeveer zo uit:
De hosttoewijzing onder /etc/hosts op alle knooppunten is:
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
Het instellen van hosttoewijzing vereenvoudigt ons beheer van naamswijzigingen tussen hosts, waarbij we de hostnaam zullen gebruiken in plaats van het IP-adres bij het configureren van Wireguard-peers.
WireGuard voor VPN installeren
Aangezien alle servers zich op drie verschillende plaatsen bevinden, die alleen via een openbaar netwerk zijn verbonden, gaan we VPN-tunneling opzetten tussen alle knooppunten met behulp van Wireguard. Voor deze communicatie voegen we een nieuwe netwerkinterface toe aan elk knooppunt met de volgende interne IP-configuratie:
- 192.168.50.100 - ClusterControl (Office-privécloud)
- 192.168.50.101 - MariaDB-master (AWS)
- 192.168.50.102 - MariaDB-slaaf (GCP)
Installeer Wireguard zoals getoond op deze pagina op alle drie de nodes:
$ sudo add-apt-repository ppa:wireguard/wireguard
$ sudo apt-get upgrade
$ sudo apt-get install wireguard
Voor Ubuntu-hosts, accepteer gewoon de standaardwaarde als daarom wordt gevraagd tijdens de installatie van wireguard. Merk op dat het erg belangrijk is om het besturingssysteem te upgraden naar de nieuwste versie om wireguard te laten werken.
Start de host opnieuw op om de Wireguard-kernelmodule te laden:
$ reboot
Als het eenmaal is geactiveerd, configureert u onze hosttoewijzing in /etc/hosts op alle knooppunten op iets als dit:
$ 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 instellen
** Alle stappen onder deze sectie moeten worden uitgevoerd op alle knooppunten, tenzij anders aangegeven.
1) Genereer op alle knooppunten als rootgebruiker een privésleutel en wijs een veilige machtiging toe
$ umask 077
$ wg genkey > /root/private
2) Voeg vervolgens een nieuwe interface toe met de naam wg0:
$ ip link add wg0 type wireguard
3) Voeg het corresponderende IP-adres toe aan de wg0-interface:
Voor host "cc":
$ ip addr add 192.168.50.100/32 dev wg0
Voor host "aws1":
$ ip addr add 192.168.50.101/32 dev wg0
Voor host "gcp2":
$ ip addr add 192.168.50.102/32 dev wg0
4) Stel de luisterpoort in op 55555 en wijs de gegenereerde privésleutel toe aan de Wireguard-interface:
$ wg set wg0 listen-port 55555 private-key /root/private
5) Open de netwerkinterface:
$ ip link set wg0 up
6) Als de interface eenmaal actief is, verifieer dan met het "wg"-commando:
(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
Nu zijn we klaar om ze allemaal te verbinden.
Hosts verbinden via Wireguard-interface
Nu gaan we alle nodes als peers toevoegen en ze met elkaar laten communiceren. De opdracht vereist 4 belangrijke parameters:
- peer :openbare sleutel voor de doelhost.
- allowed-ips :IP-adres van de host waarmee mag communiceren.
- eindpunt :De host en Wireguard en luisterpoort (hier configureren we alle knooppunten om poort 55555 te gebruiken).
- persistent-keepalive :Omdat NAT en stateful firewalls "verbindingen" bijhouden, als een peer achter NAT of een firewall inkomende pakketten wil ontvangen, moet deze de NAT/firewall-toewijzing geldig houden door periodiek keepalive-pakketten te verzenden. Standaardwaarde is 0 (uitschakelen).
Daarom moeten we op host cc "aws1" en "gcp2" toevoegen:
$ 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
Op host "aws1" moeten we de cc en gcp2 toevoegen:
$ 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
Op host "gcp2" moeten we de cc en aws1 toevoegen:
$ 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
Probeer van elke host elkaar te pingen en zorg ervoor dat je wat antwoorden krijgt:
(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
Controleer de "wg"-uitgang om de huidige status te controleren. Hier is de uitvoer van vanuit het oogpunt van host cc:
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 ziet er goed uit. We kunnen de eindpunten, handshakestatus en bandbreedtestatus tussen knooppunten zien. Het is tijd om deze configuratie persistent te maken in een configuratiebestand, zodat het gemakkelijk door WireGuard kan worden geladen. We gaan het opslaan in een bestand in /etc/wireguard/wg0.conf. Maak eerst het bestand:
$ touch /etc/wireguard/wg0.conf
Exporteer vervolgens de runtime-configuratie voor interface wg0 en sla deze op in wg0.conf met het "wg-quick" commando:
$ wg-quick save wg0
Controleer de inhoud van het configuratiebestand (voorbeeld voor 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
Command wg-quick biedt een aantal coole snelkoppelingen om de WireGuard-interfaces te beheren en configureren. Gebruik deze tool om de netwerkinterface omhoog of omlaag te brengen:
(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
Ten slotte geven we systemd de opdracht om deze interface tijdens het opstarten meteen te laden:
$ systemctl enable [email protected]
Created symlink /etc/systemd/system/multi-user.target.wants/[email protected] → /lib/systemd/system/[email protected]
Op dit punt is onze VPN-configuratie voltooid en kunnen we nu beginnen met de implementatie.
MariaDB-replicatie implementeren
Zodra elk knooppunt in de architectuur met elkaar kan praten, is het tijd om verder te gaan met de laatste stap om onze MariaDB-replicatie te implementeren met ClusterControl.
Installeer ClusterControl op cc:
(cc)$ wget https://severalnines.com/downloads/cmon/install-cc
(cc)$ chmod 755 install-cc
(cc)$ ./install-cc
Volg de instructies totdat de installatie is voltooid. Vervolgens moeten we een wachtwoordloze SSH instellen van de ClusterControl-host naar beide MariaDB-knooppunten. Genereer eerst een SSH-sleutel voor gebruiker root:
(cc)$ whoami
root
(cc)$ ssh-keygen -t rsa # press Enter for all prompts
Kopieer de inhoud van de openbare sleutel op /root/.ssh/id_rsa.pub naar de MariaDB-knooppunten onder /root/.ssh/authorized_keys. Dit veronderstelt dat root toestemming heeft om SSH naar de host te sturen. Configureer anders de SSH-daemon om dit dienovereenkomstig toe te staan. Controleer of SSH zonder wachtwoord correct is ingesteld. Voer op het ClusterControl-knooppunt de externe SSH-opdracht uit en zorg ervoor dat u een correct antwoord krijgt zonder wachtwoordprompt:
(cc)$ ssh 192.168.50.101 "hostname"
aws1
(cc)$ ssh 192.168.50.102 "hostname"
gcp2
We kunnen nu onze MariaDB-replicatie implementeren. Open een webbrowser en ga naar de gebruikersinterface van ClusterControl op http://public_ip_of_CC/clustercontrol, maak een gebruikerslogin voor superbeheerders. Ga naar Deploy -> MySQL-replicatie en specificeer het volgende:
Kies vervolgens "MariaDB" als leverancier met versie 10.4. Geef ook het MariaDB-rootwachtwoord op. Geef in het gedeelte "Topologie definiëren" het Wireguard IP-adres (wg0) van de MariaDB-knooppunten op, vergelijkbaar met de volgende schermafbeelding:
Klik op Implementeren en wacht tot de implementatie is voltooid. Als je klaar bent, zou je het volgende moeten zien:
Onze MariaDB-replicatie-installatie draait nu op drie verschillende locaties (kantoor, AWS en GCP), verbonden met een veilige VPN-tunneling tussen knooppunten.