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.