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.