PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Multi-DC PostgreSQL:configurazione di un nodo di standby in una posizione geografica diversa su una VPN

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.