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

Membuat Pengaturan Replikasi PostgreSQL di Debian / Ubuntu

PostgreSQL dapat bekerja secara terpisah di beberapa mesin dengan struktur data yang sama, membuat lapisan persistensi aplikasi lebih tangguh dan siap untuk beberapa peristiwa tak terduga yang mungkin membahayakan kelangsungan layanan.

Ide di balik ini adalah untuk meningkatkan waktu respons sistem dengan mendistribusikan permintaan dalam jaringan "Round Robin" di mana setiap node yang ada adalah sebuah cluster. Dalam jenis penyiapan ini, tidak penting permintaan mana yang akan dikirimkan untuk diproses, karena responsnya akan selalu sama.

Dalam blog ini, kami akan menjelaskan cara mereplikasi cluster PostgreSQL menggunakan alat yang disediakan dalam instalasi program. Versi yang digunakan adalah PostgreSQL 11.5, versi stabil saat ini yang tersedia secara umum untuk sistem operasi Debian Buster. Untuk contoh di blog ini diasumsikan anda sudah familiar dengan Linux.

Program PostgreSQL

Di dalam direktori /usr/bin/ adalah program yang bertanggung jawab untuk mengelola cluster.

# 1. Lists the files contained in the directory
# 2. Filters the elements that contain 'pg_' in the name
ls /usr/bin/ | grep pg_

Aktivitas yang dilakukan melalui program ini dapat dilakukan secara berurutan, atau bahkan dikombinasikan dengan program lain. Menjalankan blok aktivitas ini melalui satu perintah dimungkinkan berkat program Linux yang ditemukan di direktori yang sama, yang disebut make.

Untuk membuat daftar cluster yang ada, gunakan program pg_lsclusters. Anda juga dapat menggunakan make untuk menjalankannya. Pekerjaannya tergantung pada file bernama Makefile, yang harus berada di direktori yang sama tempat perintah akan dijalankan.

# 1. The current directory is checked
pwd

# 2. Creates a directory
mkdir ~/Documents/Severalnines/

# 3. Enroute to the chosen directory
cd ~/Documents/Severalnines/

# 4. Create the file Makefile
touch Makefile

# 5. Open the file for editing

Definisi blok ditunjukkan di bawah ini, memiliki nama ls, dan satu program yang akan dijalankan, pg_lsclusters.

# 1. Block name
ls:
# 2. Program to be executed
pg_lsclusters

File Makefile dapat berisi beberapa blok, dan masing-masing dapat menjalankan program sebanyak yang Anda butuhkan, dan bahkan menerima parameter. Sangat penting bahwa baris milik blok eksekusi benar, menggunakan tabulasi untuk indentasi bukan spasi.

Penggunaan make untuk menjalankan program pg_lsclusters dilakukan dengan menggunakan perintah make ls.

# 1. Executes pg_lsclusters
make ls

Hasil yang diperoleh dalam penginstalan PostgreSQL baru-baru ini menghadirkan satu cluster yang disebut main, yang dialokasikan pada port 5432 dari sistem operasi. Saat program pg_createcluster digunakan, sebuah port baru dialokasikan ke cluster baru yang dibuat, dengan nilai 5432 sebagai titik awal, hingga port lain ditemukan dalam urutan menaik.

Write Ahead Logging (WAL)

Prosedur replikasi ini terdiri dari membuat cadangan cluster kerja yang terus menerima pembaruan. Namun, jika ini dilakukan pada mesin yang sama, banyak manfaat yang diperoleh dari teknik ini akan hilang.

Menskalakan sistem secara horizontal memastikan ketersediaan layanan yang lebih baik, seolah-olah ada masalah perangkat keras, itu tidak akan membuat banyak perbedaan karena ada mesin lain yang siap menangani beban kerja.

WAL adalah istilah yang digunakan untuk mewakili algoritme kompleks internal pada PostgreSQL yang memastikan integritas transaksi yang dilakukan pada sistem. Namun, hanya satu cluster yang harus memiliki tanggung jawab untuk mengaksesnya dengan izin tulis.

Arsitektur sekarang memiliki tiga jenis cluster yang berbeda:

  1. Primer yang bertanggung jawab untuk menulis surat ke WAL;
  2. Replika siap mengambil alih jabatan utama;
  3. Berbagai replika lainnya dengan tugas membaca WAL.

Operasi tulis adalah setiap aktivitas yang dimaksudkan untuk mengubah struktur data, baik dengan memasukkan elemen baru, atau memperbarui dan menghapus catatan yang ada.

Konfigurasi Cluster PostgreSQL

Setiap cluster memiliki dua direktori, satu berisi file konfigurasinya dan satu lagi berisi log transaksi. Ini terletak di /etc/postgresql/11/$(cluster) dan /var/lib/postgresql/11/$(cluster), masing-masing (di mana $(cluster) adalah nama cluster).

File postgresql.conf dibuat segera setelah cluster dibuat dengan menjalankan program pg_createcluster, dan properti dapat dimodifikasi untuk kustomisasi cluster.

Mengedit file ini secara langsung tidak disarankan karena berisi hampir semua properti. Nilainya telah dikomentari, memiliki simbol # di awal setiap baris, dan beberapa baris lainnya dikomentari berisi instruksi untuk mengubah nilai properti.

Menambahkan file lain yang berisi perubahan yang diinginkan dimungkinkan, cukup edit satu properti bernama include, ganti nilai default #include ='' dengan include ='postgresql.replication.conf'.

Sebelum memulai cluster, Anda memerlukan keberadaan file postgresql.replication.conf di direktori yang sama tempat Anda menemukan file konfigurasi asli, yang disebut postgresql.conf.

# 1. Block name
create:
# 2. Creates the cluster
pg_createcluster 11 $(cluster) -- --data-checksums
# 3. Copies the file to the directory
cp postgresql.replication.conf /etc/postgresql/11/$(cluster)/
# 4. A value is assigned to the property
sed -i "s|^#include = ''|include = 'postgresql.replication.conf'|g" /etc/postgresql/11/$(cluster)/postgresql.conf

Penggunaan --data-checksums dalam pembuatan klaster menambah tingkat integritas yang lebih besar pada data, menghabiskan sedikit kinerja tetapi sangat penting untuk menghindari kerusakan file saat ditransfer dari satu cluster ke cluster lain.

Prosedur yang dijelaskan di atas dapat digunakan kembali untuk cluster lain, cukup dengan meneruskan nilai ke $(cluster) sebagai parameter dalam eksekusi make program.

# 1. Executes the block 'create' by passing a parameter
sudo make create cluster=primary

Sekarang setelah otomatisasi singkat dari tugas-tugas telah ditetapkan, yang masih harus dilakukan adalah definisi dari file postgresql.replication.conf sesuai dengan kebutuhan untuk setiap cluster.

Replikasi pada PostgreSQL

Dua cara untuk mereplikasi kluster dimungkinkan, satu dengan menyelesaikan yang lain melibatkan seluruh kluster (disebut Replikasi Streaming) dan yang lain dapat sebagian atau lengkap (disebut Replikasi Logis).

Setelan yang harus ditentukan untuk cluster terbagi dalam empat kategori utama:

  • Server Utama
  • Server Siaga
  • Server Pengirim
  • Pelanggan

Seperti yang kita lihat sebelumnya, WAL adalah file yang berisi transaksi yang dilakukan di cluster, dan replikasi adalah transmisi file ini dari satu cluster ke cluster lainnya.

Di dalam pengaturan yang ada di file postgresql.conf, kita dapat melihat properti yang menentukan perilaku cluster dalam kaitannya dengan file WAL, seperti ukuran file tersebut.

# default values
max_wal_size = 1GB
min_wal_size = 80MB

Properti penting lainnya yang disebut max_wal_senders. Milik cluster dengan karakteristik Server Pengirim, adalah jumlah proses yang bertanggung jawab untuk mengirim file-file ini ke cluster lain, harus selalu bernilai lebih dari jumlah cluster yang bergantung pada penerimaannya.

File WAL dapat disimpan untuk transmisi ke cluster yang terhubung terlambat, atau yang memiliki beberapa masalah dalam menerimanya, dan memerlukan file sebelumnya sehubungan dengan waktu saat ini, dengan spesifikasi properti wal_keep_segments untuk berapa banyak segmen file WAL yang harus dikelola oleh sebuah cluster.

Slot Replikasi adalah fungsi yang memungkinkan kluster menyimpan file WAL yang diperlukan untuk menyediakan kluster lain dengan semua catatan, dengan opsi max_replication_slots sebagai propertinya.

# default values
max_wal_senders = 10
wal_keep_segments = 0
max_replication_slots = 10

Bila tujuannya adalah untuk mengalihdayakan penyimpanan file WAL ini, metode lain untuk memproses file ini dapat digunakan, yang disebut Pengarsipan Berkelanjutan.

Pengarsipan Berkelanjutan

Konsep ini memungkinkan Anda untuk mengarahkan file WAL ke lokasi tertentu, menggunakan program Linux, dan dua variabel yang mewakili jalur file, dan namanya, seperti %p, dan %f, masing-masing.

Properti ini dinonaktifkan secara default, tetapi penggunaannya dapat dengan mudah diimplementasikan dengan menarik tanggung jawab cluster dari penyimpanan file penting tersebut, dan dapat ditambahkan ke file postgresql.replication.conf.

# 1. Creates a directory
mkdir ~/Documents/Severalnines/Archiving

# 2. Implementation on postgresql.replication.conf
archive_mode = on
archive_command = 'cp %p ~/Documents/Severalnines/Archiving/%f'

# 3. Starts the cluster
sudo systemctl start [email protected]

Setelah inisialisasi klaster, beberapa properti mungkin perlu dimodifikasi, dan klaster memulai ulang mungkin diperlukan. Namun, beberapa properti hanya dapat dimuat ulang, tanpa perlu mem-boot ulang kluster secara penuh.

Informasi tentang subjek tersebut dapat diperoleh melalui komentar yang ada di file postgresql.conf, muncul sebagai # (catatan:perubahan memerlukan restart).

Jika demikian, cara sederhana untuk menyelesaikannya adalah dengan program Linux systemctl, yang digunakan sebelumnya untuk memulai klaster, hanya dengan mengesampingkan opsi untuk memulai ulang.

Bila reboot penuh tidak diperlukan, cluster itu sendiri dapat menetapkan kembali propertinya melalui kueri yang dijalankan di dalam dirinya sendiri, namun, jika beberapa cluster berjalan pada mesin yang sama, cluster akan diminta untuk melewati parameter berisi nilai port yang dialokasikan cluster pada sistem operasi.

# Reload without restarting
sudo -H -u postgres psql -c ‘SELECT pg_reload_conf();’ -p 5433

Pada contoh di atas, properti archive_mode memerlukan reboot, sedangkan archive_command tidak. Setelah pengenalan singkat tentang subjek ini, mari kita lihat bagaimana cluster replika dapat mencadangkan file WAL yang diarsipkan ini, menggunakan Point In Time Recovery (PITR).

Pemulihan Point-In-Time Replikasi PostgreSQL

Nama sugestif ini memungkinkan cluster untuk kembali ke statusnya dari periode waktu tertentu. Ini dilakukan melalui properti yang disebut recovery_target_timeline, yang mengharapkan untuk menerima nilai dalam format tanggal, seperti 22-08-2019 12:05 GMT, atau penugasan terbaru, yang menginformasikan perlunya pemulihan hingga catatan terakhir yang ada.

Program pg_basebackup ketika dijalankan, membuat salinan direktori yang berisi data dari sebuah cluster ke lokasi lain. Program ini cenderung menerima beberapa parameter, salah satunya -R, yang membuat file bernama recovery.conf dalam direktori yang disalin, yang pada gilirannya tidak sama dengan yang berisi file konfigurasi lain yang terlihat sebelumnya, seperti postgresql.conf .

File recovery.conf menyimpan parameter yang diteruskan dalam eksekusi program pg_basebackup, dan keberadaannya sangat penting untuk implementasi Replikasi Streaming, karena di dalamnya operasi kebalikan ke Pengarsipan Berkelanjutan dapat dilakukan.

# 1. Block name
replicate:
# 2. Removes the current data directory
rm -rf /var/lib/postgresql/11/$(replica)
# 3. Connects to primary cluster as user postgres
# 4. Copies the entire data directory
# 5. Creates the file recovery.conf
pg_basebackup -U postgres -d postgresql://localhost:$(primaryPort) -D /var/lib/postgresql/11/$(replica) -P -R
# 6. Inserts the restore_command property and its value
echo "restore_command = 'cp ~/Documents/Severalnines/Archiving/%f %p'" >> /var/lib/postgresql/11/$(replica)/recovery.conf
# 7. The same is done with recovery_target_timeline
echo "recovery_target_timeline = 'latest'" >> /var/lib/postgresql/11/$(replica)/recovery.conf

Blok replika yang ditentukan di atas ini harus dijalankan oleh pengguna postgres sistem operasi, untuk menghindari potensi konflik dengan siapa pemilik data cluster, postgres, atau root pengguna.

Cluster replika masih berdiri, mengoleskannya agar berhasil memulai replikasi, memiliki proses cluster replika yang disebut pg_walreceiver berinteraksi dengan cluster utama yang disebut pg_walsender melalui koneksi TCP.

# 1. Executes the block ‘replicate’ by passing two parameters
sudo -H -u postgres make replicate replica=replica primaryPort=5433
# 2. Starts the cluster replica
sudo systemctl start [email protected]

Verifikasi kondisi model replikasi ini, yang disebut Replikasi Streaming, dilakukan oleh kueri yang dijalankan di cluster utama.

# 1. Checks the Streaming Replication created
sudo -H -u postgres psql -x -c ‘select * from pg_stat_replication;’ -p 5433

Kesimpulan

Di blog ini, kami menunjukkan cara menyiapkan Replikasi Streaming asinkron antara dua cluster PostgreSQL. Ingat, kerentanan ada dalam kode di atas, misalnya, tidak disarankan menggunakan pengguna postgres untuk melakukan tugas seperti itu.

Replikasi kluster memberikan beberapa manfaat bila digunakan dengan cara yang benar dan memiliki akses mudah ke API yang datang untuk berinteraksi dengan kluster.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 7 Hal Yang Harus Diwaspadai Dalam Penerapan PostgreSQL Anda

  2. Ubah grup keamanan di Instans Database AWS RDS

  3. rake db:create throws database tidak ada kesalahan dengan postgresql

  4. Membuat Cold Standby untuk PostgreSQL Menggunakan Amazon AWS

  5. Istilah sintaks SQL untuk 'WHERE (col1, col2) <(val1, val2)'