PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Multi-DC PostgreSQL:konfigurowanie węzła gotowości w innej lokalizacji geograficznej za pośrednictwem sieci VPN

Wcześniej pisaliśmy o konfigurowaniu klastra rozproszonej bazy danych przy użyciu replikacji MySQL. Tym razem chodzi o PostgreSQL. Konfiguracja klastra rozproszonego geograficznie dla PostgreSQL nie jest nową koncepcją, a topologia jest dość powszechna.

Aby osiągnąć wysoką dostępność, organizacje i firmy rozpraszają swoje węzły baz danych, aby w przypadku wystąpienia katastrofy w określonym regionie (co wpływa na centrum danych) węzły rezerwowe były dostępne do przełączenia awaryjnego.

Jest to bardzo powszechna praktyka (przy użyciu tego typu topologii) w ramach planów ciągłości biznesowej i odzyskiwania po awarii w Twojej organizacji. Ten typ topologii eliminuje posiadanie pojedynczego punktu awarii (SPOF). Powszechne wymaganie, zwłaszcza jeśli masz niskie RPO i wyższy czas pracy bez przestojów (jeśli to możliwe, 99,9999999999%).

W tym blogu omówię prostą implementację, jak to zrobić za pomocą ClusterControl. ClusterControl to bezagentowe oprogramowanie do zarządzania i automatyzacji klastrów baz danych. Pomaga wdrażać, monitorować, zarządzać i skalować serwer/klaster bazy danych bezpośrednio z interfejsu użytkownika ClusterControl.

Pożądana konfiguracja architektoniczna

Docelowym wynikiem jest efektywne wdrożenie w bezpiecznym środowisku. Aby to zrobić, ważne jest, aby ustanowić połączenie między korzystaniem z VPN i byłoby bezpieczniejsze, jeśli skonfigurujesz również węzły bazy danych przez połączenie TLS/SSL. W przypadku tej konfiguracji na naszym blogu po prostu wdrażamy węzeł w sieci VPN i pokazujemy, jak można łatwo zastosować to podejście. Zobacz poniżej schemat konfiguracji docelowej:

Aby opracować konfigurację, sieć lokalna komunikuje się publicznie chmura za pomocą tunelu VPN, a obie te sieci powinny mieć bramę VPN, aby obie mogły się komunikować lub nawiązywać połączenie. ClusterControl wymaga nadzorowania wszystkich węzłów, które muszą zostać zarejestrowane, ponieważ będzie zbierać informacje o węzłach dla metryk danych. Poza tym wymaga to, aby lokalny węzeł aktywnego zapisu mógł również połączyć się z węzłem rezerwowym w innej domenie, która jest przeznaczona dla tego bloga, hostowana w Google Cloud Platform (GCP).

Konfigurowanie OpenVPN

Konfiguracja OpenVPN jest bardzo trudna dla obu domen sieciowych. Istota tego jest taka, że ​​należy wziąć pod uwagę następujące kwestie:

  • Węzły z Twojej lokalizacji powinny być w stanie nawiązać połączenie z docelowymi węzłami domeny publicznej chmury
  • Węzły z Twojej siedziby mogą mieć dostęp do Internetu w celu pobierania pakietów wymaganych do konfiguracji. Jeśli nie masz wszystkich repozytoriów przechowywanych lokalnie, które są wymagane, może tak nie być
  • Węzły z Twojej domeny chmury publicznej powinny być w stanie nawiązać połączenie z węzłami lokalnymi
  • Węzły z Twojej domeny chmury publicznej mogą mieć dostęp do Internetu w celu pobierania pakietów wymaganych do konfiguracji. Jeśli nie masz wszystkich repozytoriów przechowywanych lokalnie, które są wymagane, może tak nie być

Instalacja i konfiguracja OpenVPN

Krok pierwszy

Zainstaluj pakiet openvpn (i pakiety easy-rsa dla dystrybucji Ubuntu/Debian)

$ sudo apt-get install openvpn easy-rsa

W przypadku systemu operacyjnego opartego na CentOS/RHEL 

$ sudo yum install openvpn wget

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

Krok drugi

Wygeneruj swoje certyfikaty, takie jak certyfikaty urzędu certyfikacji (CA), serwera i klienta.

W przypadku Ubuntu/Debian możesz wykonać następujące czynności:

$ /usr/bin/make-cadir CA

Zmień na katalog CA

$ cd CA

W tym momencie możesz edytować plik vars zgodnie ze swoimi potrzebami, np.

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"

Następnie uruchom skrypt vars, aby zdefiniować wymagane zmienne env

[ ~/CA ]$ source ./vars

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

Uruchom czyszczenie

[ ~/CA ]$ ./clean-all

Następnie utwórz certyfikaty dla swojego urzędu certyfikacji, serwera i klienta.

[ ~/CA ]$ ./build-ca

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

 $ ./build-dh 2048

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

Na koniec wygeneruj klucz Perfect Forward Sekretności.

$ openvpn --genkey --secret pfs.key

Jeśli używasz dystrybucji typu CentOS/RHEL, możesz wykonać następujące czynności:

$ 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

# Upewnij się, że Twoje klucze RSA mają odpowiednie uprawnienia ze względów bezpieczeństwa

$ 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

W tym momencie możesz edytować plik vars zgodnie ze swoimi potrzebami, np.

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"

Następnie uruchom skrypt vars, aby zdefiniować wymagane zmienne env

$ source ./vars

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

Uruchom czyszczenie

$ ./clean-all

Następnie utwórz certyfikaty dla swojego urzędu certyfikacji, serwera i klienta.

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

Po zakończeniu konfiguracji należy wziąć pod uwagę, gdzie znajdują się klucze i certyfikaty. Jeśli używasz systemd lub service w Linuksie do uruchomienia tego, możesz umieścić swoje certyfikaty i klucze w /etc/openvpn. Prawdopodobnie będziesz musiał uruchomić następujące polecenie:

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

Krok trzeci

W tym momencie kończę z następującą konfiguracją serwera i klienta. Zobacz moje pliki konfiguracyjne odpowiednio,

Konfiguracja serwera 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

Najważniejszą rzeczą, którą musisz wziąć pod uwagę, są następujące opcje, jak opisano poniżej.

klient-klient — bardzo ważne, aby węzły w sieci VPN mogły pingować inne węzły w innej domenie sieciowej. Powiedzmy, że ClusterControl znajduje się lokalnie, może pingować węzły w GCP.

push "route 192.168.30.0 255.255.255.0" - Przepycham tabele routingu, aby węzły GCP połączone z VPN mogły pingować moje węzły w domenie lokalnej. W mojej bramie GCP VPN mam następujące tabele routingu jako push „route 10.142.0.0 255.255.255.0”

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

#push "redirect-gateway" - Obie te sekcje nie są wymagane, ponieważ potrzebuję połączenia internetowego zarówno do konfiguracji mojego repozytorium, jak i pakietów zależnych podczas instalacji.

push "dhcp-option DNS 8.8.8.8", 

push „dhcp-option DNS 8.8.4.4” — obie te sekcje można w razie potrzeby zmienić na żądany DNS. To jest dla twojego pożądanego DNS, szczególnie gdy potrzebujesz połączenia z Internetem.

Konfiguracja klienta 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

Najważniejsze jest to, że musisz mieć pewność co do swoich kluczowych ścieżek, a także wymienić parametry w tej sekcji,

remote 34.73.238.239  1194  

który może być nazwą hosta/adresem IP bramy serwera VPN, z którą chcesz się połączyć.

Krok czwarty

Na koniec skonfiguruj serwer proxy VPN, aby pakiety sieciowe były kierowane do interfejsu sieciowego na serwerze i zezwól jądru na przekazywanie ruchu 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

Aby uzyskać bardziej dogłębną instalację, proponuję zapoznać się z tymi postami dotyczącymi CentOS i Ubuntu.

Wydajne rozszerzanie w chmurze

Załóżmy, że w Twojej domenie lokalnej masz następującą topologię,

a teraz chcesz rozszerzyć swoją dostępność o inne centrum danych, czyli GCP dla tego bloga. Wdrażanie przy użyciu ClusterControl jest bardzo proste. Możesz wykonać następującą procedurę opisaną poniżej,

Krok pierwszy

Utwórz klaster niewolników

Krok drugi

Wybierz wzorzec do replikacji,

Krok trzeci

Skonfiguruj dostęp do środowiska chmury publicznej

Krok czwarty

Określ nazwę hosta/IP węzła, który ma zostać rozszerzony na klaster replikacji PG,

Krok piąty

Na koniec monitoruj aktywność w pracy, jak ClusterControl reaguje na tego typu działania

Wynik pokaże Ci powiązanie między Twoim lokalnym a rozszerzonym centrum danych, które znajduje się w tym blogu, naszym węźle rezerwowym GCP PostgreSQL. Zobacz poniżej wynik

Wnioski

Konfiguracja węzła rezerwowego geolokalizacji nie jest trudna, ale głównym problemem jest to, jak bezpieczne będzie to w projekcie architektonicznym. Korzystanie z VPN może złagodzić główny problem problemu. Korzystanie z OpenVPN jest prostym sposobem na wdrożenie tego, ale w przypadku ciężkich aplikacji transakcyjnych organizacje prawdopodobnie zainwestują w ekskluzywne usługi lub sprzęt, aby poradzić sobie z tą konfiguracją. Również dodanie TLS/SSL może być łatwiejsze niż zrobione. Porozmawiamy o tym, jak używać TLS/SSL z PostgreSQL w naszych następnych blogach.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak uzyskać kolumnę z kolejnymi, rosnącymi liczbami, bez brakujących liczb?

  2. Jak to_char() działa w PostgreSQL

  3. Zwróć identyfikator, jeśli wiersz istnieje, WSTAW W przeciwnym razie

  4. Czym dokładnie jest GRANT USAGE ON SCHEMA?

  5. Wskazówki dotyczące dostrajania wydajności PostgreSQL