MariaDB
 sql >> Database >  >> RDS >> MariaDB

Distribuzione multi-cloud per la replica di MariaDB tramite WireGuard

In questo post del blog, esamineremo come distribuire una configurazione di replica MariaDB in un ambiente multi-cloud. Supponiamo che la nostra applicazione principale si trovi in ​​AWS, è l'idea migliore configurare AWS come data center principale che ospita il master MariaDB. Lo slave MariaDB sarà ospitato su GCP e ClusterControl si trova all'interno dell'infrastruttura cloud privata dell'azienda in ufficio. Sono tutti collegati tramite un tunnel VPN semplice e sicuro WireGuard nell'intervallo IP di 192.168.50.0/24. ClusterControl utilizzerà questa interfaccia VPN per eseguire la distribuzione, la gestione e il monitoraggio in remoto su tutti i nodi del database.

Ecco i nostri host:

  • Servizio Web Amazon (AWS):
    • Ospite:maestro MariaDB
    • IP pubblico:54.151.183.93
    • IP privato:10.15.3.170/24 (VPC)
    • IP VPN:192.168.50.101
    • OS:Ubuntu 18.04.4 LTS (Bionic)
    • Specifica:t2.medium (2 vCPU, 4 GB di memoria)
  • Google Cloud Platform (GCP): 
    • Ospite:MariaDB slave
    • IP pubblico:35.247.147.95
    • IP privato:10.148.0.9/32
    • IP VPN:192.168.50.102
    • OS:Ubuntu 18.04.4 LTS (Bionic)
    • Specifica:n1-standard-1 (1 vCPU, 3,75 GB di memoria)
  • Cloud privato VMware (ufficio):
    • Ospite:ClusterControl
    • IP pubblico:3.25.96.229
    • IP privato:192.168.55.138/24
    • IP VPN:192.168.50.100
    • OS:Ubuntu 18.04.4 LTS (Bionic)
    • Specifiche:VMware cloud privato (2 CPU, 2 GB di RAM)

La nostra architettura finale sarà simile a questa:

La mappatura dell'host in /etc/hosts su tutti i nodi è:

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

L'impostazione della mappatura degli host semplificherà la nostra gestione della risoluzione dei nomi tra host, in cui utilizzeremo il nome host anziché l'indirizzo IP durante la configurazione dei peer Wireguard.

Installazione di WireGuard per VPN

Dato che tutti i server si trovano in tre luoghi diversi, che sono collegati solo tramite rete pubblica, imposteremo il tunneling VPN tra tutti i nodi utilizzando Wireguard. Aggiungeremo una nuova interfaccia di rete su ogni nodo per questa comunicazione con la seguente configurazione IP interna:

  • 192.168.50.100 - ClusterControl (cloud privato di Office)
  • 192.168.50.101 - MariaDB master (AWS)
  • 192.168.50.102 - MariaDB slave (GCP)

Installa Wireguard come mostrato in questa pagina su tutti e tre i nodi:

$ sudo add-apt-repository ppa:wireguard/wireguard
$ sudo apt-get upgrade
$ sudo apt-get install wireguard

Per gli host Ubuntu, accetta semplicemente il valore predefinito se richiesto durante l'installazione di wireguard. Tieni presente che è molto importante aggiornare il sistema operativo all'ultima versione affinché wireguard funzioni.

Riavvia l'host per caricare il modulo del kernel Wireguard:

$ reboot

Una volta su, configura la nostra mappatura host all'interno di /etc/hosts su tutti i nodi su qualcosa del genere:

$ 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

Configurazione di Wireguard

** Tutti i passaggi in questa sezione devono essere eseguiti su tutti i nodi, se non diversamente specificato.

1) Su tutti i nodi come utente root, genera una chiave privata e assegna un'autorizzazione sicura

$ umask 077
$ wg genkey > /root/private

2) Quindi, aggiungi una nuova interfaccia chiamata wg0:

$ ip link add wg0 type wireguard

3) Aggiungi l'indirizzo IP corrispondente all'interfaccia wg0:

Per host "cc":

$ ip addr add 192.168.50.100/32 dev wg0

Per l'host "aws1":

$ ip addr add 192.168.50.101/32 dev wg0

Per l'host "gcp2":

$ ip addr add 192.168.50.102/32 dev wg0

4) Imposta la porta di ascolto su 55555 e assegna la chiave privata generata all'interfaccia Wireguard:

$ wg set wg0 listen-port 55555 private-key /root/private

5) Visualizza l'interfaccia di rete:

$ ip link set wg0 up

6) Una volta che l'interfaccia è attiva, verifica con il comando "wg":

(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

Ora siamo pronti per connetterli tutti.

Collegamento degli host tramite l'interfaccia Wireguard

Ora aggiungeremo tutti i nodi come peer e consentiremo loro di comunicare tra loro. Il comando richiede 4 parametri importanti:

  • pari :chiave pubblica per l'host di destinazione.
  • ips consentiti :indirizzo IP dell'host con cui è consentito comunicare.
  • endpoint :L'host e Wireguard e la porta di ascolto (qui configuriamo tutti i nodi per utilizzare la porta 55555).
  • persistent-keepalive :poiché i firewall NAT e stateful tengono traccia delle "connessioni", se un peer dietro NAT o un firewall desidera ricevere pacchetti in entrata, deve mantenere valida la mappatura NAT/firewall, inviando periodicamente pacchetti keepalive. Il valore predefinito è 0 (disabilita).

Pertanto, su host cc, dobbiamo aggiungere "aws1" e "gcp2":

$ 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

Sull'host "aws1", dobbiamo aggiungere cc e gcp2:

$ 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

Sull'host "gcp2", dobbiamo aggiungere cc e aws1:

$ 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

Da ogni host, prova a eseguire il ping a vicenda e assicurati di ricevere alcune risposte:

(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

Controllare l'uscita "wg" per verificare lo stato corrente. Ecco l'output del punto di vista di cc host:

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

Tutto lo stato sembra buono. Possiamo vedere gli endpoint, lo stato dell'handshake e lo stato della larghezza di banda tra i nodi. È ora di rendere questa configurazione persistente in un file di configurazione, in modo che possa essere facilmente caricata da WireGuard. Lo memorizzeremo in un file che si trova in /etc/wireguard/wg0.conf. Innanzitutto, crea il file:

$ touch /etc/wireguard/wg0.conf

Quindi, esporta la configurazione di runtime per l'interfaccia wg0 e salvala in wg0.conf usando il comando "wg-quick":

$ wg-quick save wg0

Verifica il contenuto del file di configurazione (esempio per 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

Il comando wg-quick fornisce alcune scorciatoie interessanti per gestire e configurare le interfacce WireGuard. Usa questo strumento per alzare o abbassare l'interfaccia di rete:

(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

Infine, indichiamo a systemd di caricare questa interfaccia proprio durante l'avvio:

$ systemctl enable [email protected]
Created symlink /etc/systemd/system/multi-user.target.wants/[email protected] → /lib/systemd/system/[email protected]

A questo punto, la nostra configurazione VPN è completa e ora possiamo iniziare la distribuzione.

Distribuzione della replica MariaDB

Una volta che tutti i nodi dell'architettura possono comunicare tra loro, è il momento di passare al passaggio finale per implementare la nostra replica MariaDB utilizzando ClusterControl.

Installa ClusterControl su cc:

(cc)$ wget https://severalnines.com/downloads/cmon/install-cc
(cc)$ chmod 755 install-cc
(cc)$ ./install-cc

Seguire le istruzioni fino al completamento dell'installazione. Successivamente, è necessario configurare un SSH senza password dall'host ClusterControl su entrambi i nodi MariaDB. Innanzitutto, genera una chiave SSH per l'utente root:

(cc)$ whoami
root
(cc)$ ssh-keygen -t rsa # press Enter for all prompts

Copia il contenuto della chiave pubblica in /root/.ssh/id_rsa.pub sui nodi MariaDB in /root/.ssh/authorized_keys. Ciò presuppone che root sia autorizzato a inviare SSH all'host. Altrimenti, configura il demone SSH per consentirlo di conseguenza. Verifica che SSH senza password sia impostato correttamente. Sul nodo ClusterControl, esegui il comando SSH remoto e assicurati di ricevere una risposta corretta senza alcuna richiesta di password:

(cc)$ ssh 192.168.50.101 "hostname"
aws1
(cc)$ ssh 192.168.50.102 "hostname"
gcp2

Ora possiamo distribuire la nostra replica MariaDB. Aprire un browser Web e accedere all'interfaccia utente di ClusterControl all'indirizzo http://public_ip_of_CC/clustercontrol, creare un accesso utente super amministratore. Vai a Distribuisci -> Replica MySQL e specifica quanto segue:

Quindi, scegli "MariaDB" come fornitore con la versione 10.4. Specificare anche la password di root di MariaDB. Nella sezione "Definisci topologia", specifica l'indirizzo IP Wireguard (wg0) dei nodi MariaDB, in modo simile allo screenshot seguente:

Fare clic su Distribuisci e attendere il completamento della distribuzione. Una volta terminato, dovresti vedere quanto segue:

La nostra configurazione di replica MariaDB è ora in esecuzione su tre diverse posizioni (ufficio, AWS e GCP), collegate con un tunneling VPN sicuro tra i nodi.