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.