PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PostgreSQL Multi-DC:Menyiapkan Node Siaga di Geo-Lokasi Berbeda Melalui VPN

Sebelumnya, kami menulis tentang Menyiapkan Cluster Database Geo-Distributed Menggunakan Replikasi MySQL. Kali ini tentang PostgreSQL. Menyiapkan cluster yang didistribusikan secara geografis untuk PostgreSQL bukanlah konsep baru dan topologinya cukup umum.

Untuk mencapai ketersediaan tinggi, organisasi dan perusahaan menyebarkan node database mereka sehingga ketika peristiwa bencana terjadi di wilayah tertentu (yang memengaruhi pusat data Anda), Anda memiliki node siaga yang tersedia untuk failover.

Ini adalah praktik yang sangat umum (menggunakan jenis topologi ini) sebagai bagian dari rencana Kesinambungan Bisnis dan Pemulihan Bencana organisasi Anda. Jenis topologi menghilangkan memiliki satu titik kegagalan (SPOF). Persyaratan umum terutama jika Anda memiliki RPO rendah dan waktu aktif lebih tinggi (jika mungkin di 99,999999999%).

Di blog ini, saya akan mengambil implementasi sederhana tentang cara melakukannya menggunakan ClusterControl. ClusterControl adalah perangkat lunak manajemen dan otomatisasi tanpa agen untuk cluster database. Ini membantu menyebarkan, memantau, mengelola, dan menskalakan server/cluster database Anda langsung dari antarmuka pengguna ClusterControl.

Pengaturan Arsitektur yang Diinginkan

Hasil target di sini adalah untuk menyebarkan secara efisien di lingkungan yang aman. Untuk melakukan ini, penting bagi Anda untuk menempatkan koneksi yang telah dibuat di antara penggunaan VPN dan akan lebih aman jika Anda juga mengatur node database melalui koneksi TLS/SSL. Untuk pengaturan ini di blog kami, kami cukup menyebarkan simpul melalui VPN dan menunjukkan kepada Anda bagaimana Anda dapat dengan mudah melakukan pendekatan ini. Lihat di bawah untuk diagram pengaturan target:

Untuk menguraikan pengaturan, jaringan lokal harus berkomunikasi melalui publik cloud menggunakan terowongan VPN dan kedua jaringan ini harus memiliki gateway VPN sehingga keduanya dapat berkomunikasi atau membuat koneksi. ClusterControl mengharuskan Anda untuk mengawasi semua node yang harus didaftarkan karena akan mengumpulkan informasi tentang node Anda untuk metrik data. Selain itu, node penulis aktif lokal Anda juga dapat menjangkau node siaga ke domain lain, yaitu untuk blog ini, yang dihosting di Google Cloud Platform (GCP).

Menyiapkan OpenVPN Anda

Pengaturan OpenVPN sangat rumit untuk kedua domain jaringan. Intinya harus ada pertimbangan sebagai berikut:

  • Node dari lokal Anda akan dapat membuat koneksi ke node domain cloud publik target
  • Node dari lokal Anda dapat memiliki akses internet untuk mengunduh paket yang diperlukan untuk menyiapkan. Kecuali Anda memiliki semua repositori yang disimpan secara lokal yang diperlukan, hal ini tidak akan terjadi
  • Node dari domain cloud publik Anda harus dapat membuat koneksi ke node lokal
  • Node dari domain awan publik Anda dapat memiliki akses internet untuk mengunduh paket yang diperlukan untuk menyiapkan. Kecuali Anda memiliki semua repositori yang disimpan secara lokal yang diperlukan, hal ini tidak akan terjadi

Instalasi dan Konfigurasi OpenVPN

Langkah Pertama

Instal paket openvpn (dan paket easy-rsa untuk distro Ubuntu/Debian)

$ sudo apt-get install openvpn easy-rsa

Untuk OS berbasis CentOS/RHEL, 

$ sudo yum install openvpn wget

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

Langkah Kedua

Buat sertifikat Anda seperti otoritas sertifikasi (CA), server, dan sertifikat klien.

Untuk Ubuntu/Debian, Anda dapat melakukan tindakan berikut:

$ /usr/bin/make-cadir CA

Ubah ke direktori CA

$ cd CA

Pada titik ini, Anda mungkin akan mengedit file vars sesuai dengan kebutuhan Anda, mis.

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"

Kemudian jalankan skrip vars untuk menentukan variabel env yang diperlukan

[ ~/CA ]$ source ./vars

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

Jalankan pembersihan

[ ~/CA ]$ ./clean-all

Kemudian buat sertifikat untuk CA, server, dan klien Anda.

[ ~/CA ]$ ./build-ca

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

 $ ./build-dh 2048

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

Terakhir, buat kunci Kerahasiaan Penerusan Sempurna.

$ openvpn --genkey --secret pfs.key

Jika Anda menggunakan distro tipe CentOS/RHEL, Anda dapat melakukan hal berikut:

$ 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

# Pastikan kunci RSA Anda memiliki izin yang tepat untuk tujuan keamanan

$ 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

Pada titik ini, Anda mungkin akan mengedit file vars sesuai dengan kebutuhan Anda, mis.

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"

Kemudian jalankan skrip vars untuk menentukan variabel env yang diperlukan

$ source ./vars

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

Jalankan pembersihan

$ ./clean-all

Kemudian buat sertifikat untuk CA, server, dan klien Anda.

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

Setelah Anda menyiapkan semua, Anda harus mempertimbangkan di mana letak kunci dan sertifikat Anda. Jika Anda menggunakan systemd atau layanan di Linux untuk menjalankan ini, maka Anda dapat menempatkan sertifikat dan kunci Anda ke /etc/openvpn. Kemungkinan, Anda mungkin harus menjalankan perintah berikut:

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

Langkah Ketiga

Pada titik ini, saya berakhir dengan konfigurasi server dan klien berikut. Lihat file konfigurasi saya yang sesuai,

Konfigurasi 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

Hal terpenting yang perlu Anda perhitungkan adalah opsi-opsi berikut ini sebagaimana dicatat sebagai berikut.

client-to-client - Sangat penting agar node di VPN dapat melakukan ping ke node lain di domain jaringan yang berbeda. Katakanlah, ClusterControl terletak di lokal, ia dapat melakukan ping ke node di GCP.

push "route 192.168.30.0 255.255.255.0" - Saya mendorong tabel perutean agar node GCP yang terhubung ke VPN dapat melakukan ping ke node saya di domain lokal. Di gateway VPN GCP saya, saya memiliki tabel perutean berikut sebagai push "route 10.142.0.0 255.255.255.0"

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

#push "redirect-gateway" - Kedua bagian ini tidak diperlukan karena saya memerlukan koneksi internet untuk mengatur repo dan paket dependen saya saat instalasi.

push "dhcp-option DNS 8.8.8.8", 

push "dhcp-option DNS 8.8.4.4" -  Kedua bagian ini dapat diubah ke DNS yang Anda inginkan jika diperlukan. Ini untuk DNS yang Anda inginkan terutama saat Anda membutuhkan koneksi internet.

Konfigurasi Klien 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

Yang paling penting di sini adalah Anda harus memastikan jalur kunci Anda, dan juga mengganti params di bagian ini,

remote 34.73.238.239  1194  

yang dapat menjadi nama host/alamat IP gateway server VPN Anda untuk terhubung.

Langkah Empat

Terakhir, siapkan server VPN proxy agar paket jaringan dirutekan ke antarmuka jaringan di server dan memungkinkan kernel meneruskan lalu lintas 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

Untuk instalasi lebih mendalam, saya sarankan Anda melihat posting ini untuk CentOS dan Ubuntu.

Memperluas Cloud Secara Efisien

Misalkan Anda memiliki topologi berikut di domain lokal Anda,

dan sekarang Anda ingin memperluas ketersediaan di pusat data lain, yaitu GCP untuk blog ini. Menyebarkan menggunakan ClusterControl sangat mudah. Anda dapat melakukan prosedur berikut yang dinyatakan di bawah ini,

Langkah Pertama

Buat Cluster Budak

Langkah Kedua

Pilih master Anda untuk replikasi,

Langkah Ketiga

Siapkan akses ke lingkungan cloud publik Anda

Langkah Empat

Tentukan nama host/IP node Anda untuk diperluas ke kluster replikasi PG Anda,

Langkah Kelima

Terakhir, pantau aktivitas pekerjaan bagaimana ClusterControl bereaksi terhadap jenis tindakan ini

Hasilnya akan menunjukkan kepada Anda hubungan antara pusat data lokal dan pusat data Anda yang diperluas, yang ada di blog ini, node siaga GCP PostgreSQL kami. Lihat di bawah untuk hasilnya

Kesimpulan

Menyiapkan node siaga geo-lokasi tidak sulit,  tetapi masalah utamanya adalah seberapa aman ini dalam desain arsitektur Anda. Menggunakan VPN dapat meringankan masalah utama. Menggunakan OpenVPN hanyalah cara sederhana untuk mengimplementasikan ini tetapi untuk aplikasi transaksional yang berat, organisasi cenderung berinvestasi pada layanan atau perangkat keras kelas atas untuk menangani pengaturan ini. Juga dengan menambahkan TLS/SSL bisa lebih mudah daripada dilakukan. Kami akan membahas ini tentang bagaimana Anda dapat menggunakan TLS/SSL dengan PostgreSQL di blog kami berikutnya.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara membuat ulang tabel yang dihapus dengan Django Migrations?

  2. psql:FATAL:peran postgres tidak ada

  3. Dapatkan nama tabel sumber baris saat menanyakan induk yang diwarisinya

  4. Disebabkan oleh:java.lang.NoSuchMethodError:org.postgresql.core.BaseConnection.getEncoding()Lorg/postgresql/core/Encoding;

  5. GROUP BY di Postgres - tidak ada kesetaraan untuk tipe data JSON?