In precedenza, abbiamo scritto sulla configurazione di un cluster di database geodistribuito utilizzando la replica MySQL. Questa volta si tratta di PostgreSQL. La configurazione di un cluster geodistribuito per PostgreSQL non è un concetto nuovo e la topologia è abbastanza comune.
Per ottenere un'elevata disponibilità, le organizzazioni e le aziende stanno disperdendo i loro nodi di database in modo che quando si verifica un evento catastrofico in una regione specifica (che colpisce il tuo data center) hai i tuoi nodi di standby disponibili per il failover.
Questa è una pratica molto comune (usando questo tipo di topologia) come parte dei piani di continuità operativa e ripristino di emergenza della tua organizzazione. Questo tipo di topologia rimuove la presenza di un singolo punto di errore (SPOF). Un requisito comune soprattutto se hai un RPO basso e un tempo di attività più elevato (se possibile a 99,999999999%).
In questo blog, prenderò una semplice implementazione su come farlo usando ClusterControl. ClusterControl è un software di gestione e automazione senza agenti per cluster di database. Aiuta a distribuire, monitorare, gestire e ridimensionare il server/cluster di database direttamente dall'interfaccia utente di ClusterControl.
La configurazione architettonica desiderata
Il risultato finale qui è di distribuire in modo efficiente in un ambiente sicuro. Per fare ciò, è importante che tu debba mettere la tua connessione stabilita tra l'utilizzo della VPN e sarebbe più sicuro se configuri anche i tuoi nodi di database su una connessione TLS/SSL. Per questa configurazione nel nostro blog, implementiamo semplicemente un nodo su una VPN e ti mostriamo come puoi facilmente eseguire questo approccio. Vedi sotto per il diagramma della configurazione di destinazione:
Per elaborare la configurazione, la rete locale deve comunicare tramite il pubblico cloud utilizzando un tunnel VPN ed entrambe queste reti devono disporre di un gateway VPN in modo che entrambi possano comunicare o stabilire una connessione. ClusterControl richiede la supervisione di tutti i nodi che devono essere registrati poiché raccoglierà informazioni sui tuoi nodi per le metriche dei dati. A parte questo, richiede che il tuo nodo di scrittura attiva in locale possa raggiungere anche il nodo di standby nell'altro dominio, che per questo blog è ospitato in Google Cloud Platform (GCP).
Configurazione di OpenVPN
La configurazione di OpenVPN è molto complicata per entrambi i domini di rete. Il succo di questo è che, deve avere la seguente considerazione:
- I nodi del tuo locale devono essere in grado di stabilire una connessione ai nodi di dominio del cloud pubblico di destinazione
- I nodi del tuo locale possono avere accesso a Internet per scaricare i pacchetti necessari per la configurazione. A meno che tu non abbia tutti i repository archiviati localmente necessari, questo potrebbe non essere il caso
- I nodi del tuo dominio cloud pubblico devono essere in grado di stabilire una connessione ai nodi locali
- I nodi del tuo dominio cloud pubblico possono avere accesso a Internet per scaricare i pacchetti necessari per la configurazione. A meno che tu non abbia tutti i repository archiviati localmente necessari, questo potrebbe non essere il caso
Installazione e configurazione di OpenVPN
Fase uno
Installa il pacchetto openvpn (e i pacchetti easy-rsa per le distribuzioni Ubuntu/Debian)
$ sudo apt-get install openvpn easy-rsa
Per il sistema operativo basato su CentOS/RHEL,
$ sudo yum install openvpn wget
$ wget -O /tmp/easyrsa https://github.com/OpenVPN/easy-rsa-old/archive/2.3.3.tar.gz
Fase due
Genera i tuoi certificati come certificati di autorità di certificazione (CA), server e client.
Per Ubuntu/Debian, puoi eseguire le seguenti azioni:
$ /usr/bin/make-cadir CA
Passa alla directory CA
$ cd CA
A questo punto, potresti modificare il file vars in base alle tue esigenze, ad es.
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"
Quindi esegui lo script vars per definire le variabili env richieste
[ ~/CA ]$ source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /CA/keys
Esegui una pulizia
[ ~/CA ]$ ./clean-all
Quindi crea i certificati per la tua CA, server e client.
[ ~/CA ]$ ./build-ca
[ ~/CA ]$ ./build-key-server server
$ ./build-dh 2048
[ ~/CA ]$ ./build-key client
Infine, genera una chiave Perfect Forward Secrecy.
$ openvpn --genkey --secret pfs.key
Se stai usando distribuzioni di tipo CentOS/RHEL, puoi fare quanto segue:
$ 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
# Assicurati che le tue chiavi RSA abbiano l'autorizzazione corretta per motivi di sicurezza
$ 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
A questo punto, potresti modificare il file vars in base alle tue esigenze, ad es.
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"
Quindi esegui lo script vars per definire le variabili env richieste
$ source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /CA/keys
Esegui una pulizia
$ ./clean-all
Quindi crea i certificati per la tua CA, server e 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
Una volta che hai tutte le impostazioni, devi prendere in considerazione dove si trovano le tue chiavi e certificati. Se stai usando systemd o service in Linux per eseguirlo, potresti inserire i tuoi certificati e chiavi in /etc/openvpn. Probabilmente, potresti dover eseguire il seguente comando:
sudo cp dh2048.pem ca.crt server.crt server.key /etc/openvpn
Fase tre
A questo punto, finisco con la seguente configurazione di server e client. Vedi i miei file di configurazione di conseguenza,
Configurazione server OpenVPN
$ 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
La cosa più importante da tenere in considerazione sono le seguenti opzioni, come indicato di seguito.
client-to-client - Molto importante in modo che i nodi nella VPN possano eseguire il ping degli altri nodi in un dominio di rete diverso. Supponiamo che ClusterControl si trovi in locale, può eseguire il ping dei nodi in GCP.
push "route 192.168.30.0 255.255.255.0" - Eseguo il push delle tabelle di routing in modo che i nodi GCP connessi alla VPN possano eseguire il ping dei miei nodi nel dominio locale. Nel mio gateway VPN GCP, ho le seguenti tabelle di routing come push "route 10.142.0.0 255.255.255.0"
#push "redirect-gateway def1 bypass-dhcp" ,
#push "redirect-gateway" - Entrambe queste sezioni non sono richieste poiché ho bisogno di una connessione Internet sia per configurare il mio repository che per i pacchetti dipendenti al momento dell'installazione.
push "dhcp-option DNS 8.8.8.8",
push "dhcp-option DNS 8.8.4.4" - Entrambe queste sezioni possono essere modificate nel DNS desiderato, se necessario. Questo è per il tuo DNS desiderato, specialmente quando hai bisogno di una connessione a Internet.
Configurazione client OpenVPN
$ 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
La cosa più importante qui è che devi essere sicuro dei tuoi percorsi chiave e sostituire anche i parametri in questa sezione,
remote 34.73.238.239 1194
che può essere il nome host/l'indirizzo IP del gateway del server VPN a cui connettersi.
Fase quattro
Infine, imposta il server VPN proxy in modo che i pacchetti di rete vengano instradati all'interfaccia di rete sul server e consenti al kernel di inoltrare il traffico IPV4
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
Per un'installazione più approfondita, ti suggerisco di guardare questi post per CentOS e su Ubuntu.
Estensione sul cloud in modo efficiente
Supponi di avere la seguente topologia nel tuo dominio locale,
e ora desideri estendere la tua disponibilità a un altro data center, che è GCP per questo blog La distribuzione tramite ClusterControl è molto semplice. È possibile eseguire la seguente procedura indicata di seguito,
Fase uno
Crea un cluster di schiavi
Fase due
Scegli il tuo master per la replica,
Fase tre
Configura l'accesso al tuo ambiente cloud pubblico
Fase quattro
Specifica il nome host/IP del tuo nodo da estendere nel tuo cluster di replica PG,
Passo Cinque
Infine, monitora l'attività lavorativa come reagisce ClusterControl a questo tipo di azione
Il risultato ti mostrerà il collegamento tra il tuo datacenter in locale e quello esteso, che in questo blog è il nostro nodo standby GCP PostgreSQL. Vedi sotto per il risultato
Conclusione
La configurazione di un nodo di standby di geolocalizzazione non è difficile, ma il problema principale è quanto sarà sicuro questo nella tua progettazione architettonica. L'utilizzo di una VPN può alleviare la principale preoccupazione del problema. L'uso di OpenVPN è solo un modo semplice per implementarlo, ma per applicazioni transazionali pesanti, è probabile che le organizzazioni investiranno in servizi o hardware di alto livello per gestire questa configurazione. Inoltre, l'aggiunta di un TLS/SSL può essere più semplice di quanto fatto. Ne discuteremo su come utilizzare TLS/SSL con PostgreSQL nei nostri prossimi blog.