sql >> Databasteknik >  >> RDS >> PostgreSQL

Multi-DC PostgreSQL:Konfigurera en standby-nod på en annan geografisk plats över en VPN

Tidigare skrev vi om att ställa in ett geodistribuerat databaskluster med MySQL-replikering. Den här gången handlar det om PostgreSQL. Att sätta upp ett geodistribuerat kluster för PostgreSQL är inget nytt koncept och topologin är ganska vanlig.

För att uppnå hög tillgänglighet sprider organisationer och företag sina databasnoder så att när en katastrofal händelse inträffar i en specifik region (som påverkar ditt datacenter) har du dina standbynoder tillgängliga för failover.

Detta är en mycket vanlig praxis (med denna typ av topologi) som en del av din organisations planer för affärskontinuitet och katastrofåterställning. Denna typ av topologi tar bort att ha en enda punkt av fel (SPOF). Ett vanligt krav speciellt om du har en låg RPO och en högre drifttid (om möjligt på 99,999999999%).

I den här bloggen kommer jag att ta en enkel implementering om hur man gör detta med ClusterControl. ClusterControl är en agentfri hanterings- och automatiseringsprogramvara för databaskluster. Det hjälper till att distribuera, övervaka, hantera och skala din databasserver/-kluster direkt från ClusterControl-användargränssnittet.

Den önskade arkitektoniska inställningen

Målresultatet här är att distribuera effektivt i en säker miljö. För att göra detta är det viktigt att du måste placera din etablerade anslutning mellan användning av VPN och det skulle vara säkrare om du också konfigurerar dina databasnoder över TLS/SSL-anslutning. För den här installationen i vår blogg distribuerar vi helt enkelt en nod över ett VPN och visar upp för dig hur du enkelt kan göra detta tillvägagångssätt. Se nedan för diagrammet över målinställningen:

För att utveckla inställningen ska det lokala nätverket kommunicera över allmänheten moln som använder en VPN-tunnel och båda dessa nätverk ska ha en VPN-gateway så att båda kan kommunicera eller upprätta en anslutning. ClusterControl kräver att du övervakar alla noder som måste registreras eftersom det samlar in information om dina noder för datamått. Bortsett från det kräver det att din aktiva skribentnod på plats också kan nå standbynoden till den andra domänen, som är för den här bloggen, värd i Google Cloud Platform (GCP).

Konfigurera din OpenVPN

OpenVPN-installationen är mycket svår för båda nätverksdomänerna. Kontentan av detta är att det måste ta hänsyn till följande:

  • Noder från din lokala plats ska kunna upprätta en anslutning till målnoderna för offentliga molndomäner
  • Noder från din on-prem kan ha tillgång till internet för att ladda ner paket som krävs för att ställa in. Såvida du inte har alla lagringsplatser lagrade lokalt som krävs kan detta inte vara fallet
  • Noder från din offentliga molndomän ska kunna upprätta en anslutning till de lokala noderna
  • Noder från din offentliga molndomän kan ha tillgång till internet för att ladda ner paket som krävs för att ställa in. Såvida du inte har alla lagringsplatser lagrade lokalt som krävs kan detta inte vara fallet

OpenVPN installation och konfiguration

Steg ett

Installera openvpn-paketet (och easy-rsa-paket för Ubuntu/Debian-distros)

$ sudo apt-get install openvpn easy-rsa

För CentOS/RHEL-baserat OS, 

$ sudo yum install openvpn wget

$ wget -O /tmp/easyrsa https://github.com/OpenVPN/easy-rsa-old/archive/2.3.3.tar.gz

Steg två

Generera dina certifikat som certifikatutfärdare (CA), server- och klientcertifikat.

För Ubuntu/Debian kan du göra följande:

$ /usr/bin/make-cadir CA

Byt till CA-katalog

$ cd CA

Vid denna tidpunkt kan du troligen redigera vars-filen i enlighet med dina behov, t.ex.

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"

Kör sedan vars-skriptet för att definiera de nödvändiga env-variablerna

[ ~/CA ]$ source ./vars

NOTE: If you run ./clean-all, I will be doing a rm -rf on /CA/keys

Kör en rensning

[ ~/CA ]$ ./clean-all

Skapa sedan certifikaten för din CA, server och klient.

[ ~/CA ]$ ./build-ca

[ ~/CA ]$ ./build-key-server server

 $ ./build-dh 2048

[ ~/CA ]$ ./build-key client

Slutligen, generera en Perfect Forward Secrecy-nyckel.

$ openvpn --genkey --secret pfs.key

Om du använder CentOS/RHEL-distros kan du göra följande:

$ 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

# Se till att dina RSA-nycklar har rätt behörighet av säkerhetsskäl

$ 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

Vid denna tidpunkt kan du troligen redigera vars-filen i enlighet med dina behov, t.ex.

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"

Kör sedan vars-skriptet för att definiera de nödvändiga env-variablerna

$ source ./vars

NOTE: If you run ./clean-all, I will be doing a rm -rf on /CA/keys

Kör en rensning

$ ./clean-all

Skapa sedan certifikaten för din CA, server och klient.

$ ./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

När du har alla inställningar måste du ta hänsyn till var dina nycklar och certifikat finns på plats. Om du använder systemd eller tjänst i Linux för att köra detta, kan du placera dina certifikat och nycklar till /etc/openvpn. Förmodligen kan du behöva köra följande kommando:

sudo cp dh2048.pem ca.crt server.crt server.key /etc/openvpn

Steg tre

Vid det här laget slutar jag med följande server- och klientkonfiguration. Se mina konfigurationsfiler i enlighet med detta,

OpenVPN Server Config

$ 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

Det viktigaste du behöver ta hänsyn till är följande alternativ enligt följande.

klient-till-klient - Mycket viktigt så noder i VPN kan pinga de andra noderna i olika nätverksdomäner. Säg, ClusterControl finns i on-prem, den kan pinga noderna i GCP.

push "route 192.168.30.0 255.255.255.0" - Jag trycker på routingtabellerna så att GCP-noder som är anslutna till VPN kan pinga mina noder i den lokala domänen. I min GCP VPN-gateway har jag följande routningstabeller som push "route 10.142.0.0 255.255.255.0"

#push "redirect-gateway def1 bypass-dhcp" ,

#push "redirect-gateway" - Båda dessa sektioner krävs inte eftersom jag behöver internetanslutning för både att ställa in mitt repo och beroende paket vid installationen.

push "dhcp-option DNS 8.8.8.8", 

push "dhcp-option DNS 8.8.4.4" -  Båda dessa avsnitt kan ändras till önskad DNS om det behövs. Detta är för din önskade DNS, särskilt när du behöver internetanslutning.

OpenVPN Client Config

$ 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

Det viktigaste här är att du måste vara säker på dina nyckelvägar och även byta ut parametrarna i det här avsnittet,

remote 34.73.238.239  1194  

som kan vara värdnamnet/IP-adressen för din VPN-servergateway att ansluta till.

Steg fyra

Sistligen, ställ in en proxy VPN-server så att nätverkspaketen dirigeras till nätverksgränssnittet på servern och tillåta kärnan att vidarebefordra IPV4-trafik

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

För mer djupgående installation föreslår jag att du tittar på dessa inlägg för CentOS och på Ubuntu.

Extendera över molnet effektivt

Anta att du har följande topologi i din lokala domän,

och du vill nu utöka din tillgänglighet över ett annat datacenter, som är GCP för den här bloggen. Att distribuera med ClusterControl är mycket enkelt. Du kan göra följande procedur som anges nedan,

Steg ett

Skapa ett slavkluster

Steg två

Välj din master för replikering,

Steg tre

Konfigurera åtkomsten till din offentliga molnmiljö

Steg fyra

Ange värdnamnet/IP-adressen för din nod som ska utökas till ditt PG-replikeringskluster,

Steg fem

Sistligen, övervaka jobbaktiviteten hur reagerar ClusterControl på den här typen av åtgärder

Resultatet kommer att visa dig kopplingen mellan ditt lokala och ditt utökade datacenter, som finns i den här bloggen, vår GCP PostgreSQL standby-nod. Se nedan för resultatet

Slutsats

Det är inte svårt att konfigurera en standby-nod för geografisk plats, men huvudfrågan är hur säker detta kommer att vara i din arkitektoniska design. Att använda ett VPN kan lindra det huvudsakliga problemet med problemet. Att använda OpenVPN är bara ett enkelt sätt att implementera detta, men för tunga transaktionsapplikationer kommer organisationer sannolikt att investera i exklusiva tjänster eller hårdvara för att hantera denna installation. Också genom att lägga till en TLS/SSL kan det vara lättare än gjort. Vi kommer att diskutera detta om hur du kan använda TLS/SSL med PostgreSQL i våra nästa bloggar.


  1. Räkna antalet förekomster av en sträng i ett VARCHAR-fält?

  2. Hur man skapar relationer i MySQL

  3. Guide för att designa databas för anställdas ledningssystem i MySQL

  4. Oracle 12c IDENTIFIERAD MED VÄRDEN