Cadangan tambahan Postgresql dengan pgbackrest - kursus pejuang muda dari pengembang

Penafian

Saya seorang pengembang. Saya menulis kode, saya berinteraksi dengan database hanya sebagai pengguna. Dalam kasus saya tidak berpura-pura menjadi administrator sistem dan, terutama, dba. Tapi ...

Kebetulan saya perlu mengatur cadangan database postgresql. Tanpa awan - pertahankan SSH dan buat itu berfungsi dan tidak minta uang. Apa yang kita lakukan dalam kasus seperti itu? Itu benar, kami mendorong pgdump ke cron, setiap hari kami mencadangkan semuanya ke arsip, dan jika kami benar-benar bubar, kami mengirim arsip ini ke suatu tempat ke neraka.

Kali ini, kesulitannya adalah bahwa menurut rencana, pangkalan itu seharusnya tumbuh sekitar + - 100 MB per hari. Tentu saja, dalam beberapa minggu, keinginan untuk membackup semuanya dengan pgdump akan hilang. Di sini cadangan tambahan datang untuk menyelamatkan.

Menarik? Selamat datang di kucing.

Cadangan inkremental adalah jenis cadangan saat tidak semua file sumber dicadangkan, tetapi hanya yang baru dan diubah sejak cadangan sebelumnya dibuat.
Seperti pengembang mana pun, BENAR-BENAR tidak ingin (pada waktu itu) memahami seluk-beluk postgres, saya ingin menemukan tombol hijau. Nah, Anda tahu, seperti di AWS, DigitalOcean: mengklik satu tombol - mendapat replikasi, mengklik yang kedua - mengatur cadangan, yang ketiga - itu bergulir kembali beberapa jam yang lalu. Tombol dan alat GUI yang indah yang belum saya temukan. Jika Anda tahu ini (gratis atau murah) - tulis tentang itu di komentar.

Googling, saya menemukan dua alat pgbarman dan pgbackrest . Saya hanya tidak memiliki masalah dengan yang pertama (dokumentasi yang sangat sedikit, saya mencoba untuk meningkatkan semuanya sesuai dengan manual lama), tetapi yang kedua ternyata berada di level, tetapi bukan tanpa cacat. Untuk mempermudah pekerjaan bagi mereka yang dihadapkan dengan tugas yang serupa dan artikel ini telah ditulis.
Setelah membaca artikel ini, Anda akan belajar cara membuat cadangan tambahan, menyimpannya ke server jarak jauh (repositori dengan cadangan) dan mengembalikannya jika terjadi kehilangan data atau masalah lain di server utama.

Persiapan


Untuk memainkan manual, Anda akan membutuhkan dua VPS. Yang pertama adalah repositori (repositori tempat backup akan ditempatkan), dan yang kedua, sebenarnya, server itu sendiri dengan postgres (dalam kasus saya, versi 11 postgres).

Diasumsikan bahwa pada server dengan postgres Anda memiliki root, pengguna sudo, pengguna postgres, dan postgres itu sendiri diinstal (pengguna postgres dibuat secara otomatis ketika postgresql diinstal), dan pada server repositori ada pengguna root dan sudo (nama pengguna pgbackrest akan digunakan dalam manual) .

Sehingga Anda memiliki lebih sedikit masalah saat mereproduksi instruksi - dalam huruf miring saya tulis di mana, oleh pengguna mana dan dengan hak apa saya menjalankan perintah saat menulis dan memeriksa artikel.

Instal pgbackrest


Repositori (pgbackrest pengguna):

1. Unduh arsip dengan pgbackrest dan transfer kontennya ke folder / build:

sudo mkdir /build sudo wget -q -O - \ https://github.com/pgbackrest/pgbackrest/archive/release/2.18.tar.gz | \ sudo tar zx -C /build 

2. Instal dependensi yang diperlukan untuk perakitan:

 sudo apt-get update sudo apt-get install build-essential libssl-dev libxml2-dev libperl-dev zlib1g-dev \ libpq-dev 

3. Kami mengumpulkan pgbackrest:

 cd /build/pgbackrest-release-2.18/src && sudo ./configure sudo make -s -C /build/pgbackrest-release-2.18/src 

4. Salin file yang dapat dieksekusi ke direktori / usr / bin:

 sudo cp /build/pgbackrest-release-2.18/src/pgbackrest /usr/bin sudo chmod 755 /usr/bin/pgbackrest 

5. Pgbackrest membutuhkan perl. Pasang:

 sudo apt-get install perl 

6. Buat direktori untuk log, beri mereka hak khusus:

 sudo mkdir -p -m 770 /var/log/pgbackrest sudo chown pgbackrest:pgbackrest /var/log/pgbackrest sudo mkdir -p /etc/pgbackrest sudo mkdir -p /etc/pgbackrest/conf.d sudo touch /etc/pgbackrest/pgbackrest.conf sudo chmod 640 /etc/pgbackrest/pgbackrest.conf sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf 

7. Periksa:

 pgbackrest version 

Server Postgres (pengguna sudo atau root):

Proses menginstal pgbackrest di server dengan postgres mirip dengan proses menginstal di repositori (ya, pgbackrest harus di kedua server), tetapi dalam paragraf 6, perintah kedua dan terakhir:

 sudo chown pgbackrest:pgbackrest /var/log/pgbackrest sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf 

ganti dengan:

 sudo chown postgres:postgres /var/log/pgbackrest sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.conf 

Mengkonfigurasi komunikasi antara server melalui SSH tanpa kata sandi


Agar pgbackrest berfungsi dengan benar, Anda perlu mengonfigurasi interaksi antara server postgres dan repositori menggunakan file kunci.

Repositori (pgbackrest pengguna):

Buat pasangan kunci:

 mkdir -m 750 /home/pgbackrest/.ssh ssh-keygen -f /home/pgbackrest/.ssh/id_rsa \ -t rsa -b 4096 -N "" 

Perhatian! Kami menjalankan perintah di atas tanpa sudo.

Server Postgres (pengguna sudo atau root):

Buat pasangan kunci:

 sudo -u postgres mkdir -m 750 -p /var/lib/postgresql/.ssh sudo -u postgres ssh-keygen -f /var/lib/postgresql/.ssh/id_rsa \ -t rsa -b 4096 -N "" 

Repositori (pengguna sudo):

Salin kunci publik dari server postgres ke server repositori:

 (echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' && \ echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' && \ sudo ssh root@<postgres_server_ip> cat /var/lib/postgresql/.ssh/id_rsa.pub) | \ sudo -u pgbackrest tee -a /home/pgbackrest/.ssh/authorized_keys 

Pada langkah ini, akan meminta kata sandi dari pengguna root. Anda harus memasukkan kata sandi root dari pengguna server postgres!

Server Postgres (pengguna sudo):

Salin kunci publik dari repositori ke server dengan postgres:

 (echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' && \ echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' && \ sudo ssh root@<repository_server_ip> cat /home/pgbackrest/.ssh/id_rsa.pub) | \ sudo -u postgres tee -a /var/lib/postgresql/.ssh/authorized_keys 

Pada langkah ini, akan meminta kata sandi dari pengguna root. Anda harus memasukkan kata sandi root dari pengguna repositori!

Kami memeriksa:

Repositori (pengguna root, untuk kemurnian percobaan):

 sudo -u pgbackrest ssh postgres@<postgres_server_ip> 

Server Postgres (pengguna root, untuk kemurnian eksperimen):

 sudo -u postgres ssh pgbackrest@<repository_server_ip> 

Kami memastikan bahwa kami mendapatkan akses tanpa masalah.

Menyiapkan server postgres



Server Postgres (pengguna sudo atau root):

1. Mari "ketuk" pada server postgres dari ip eksternal. Untuk melakukan ini, edit file postgresql.conf (terletak di folder / etc / postgresql / 11 /), tambahkan baris ke dalamnya:

 listen_addresses = '*' 

Jika garis seperti itu sudah ada, batalkan komentar atau setel nilai parameter ke '*'.

Dalam file pg_hba.conf (juga terletak di folder / etc / postgresql / 11 / ) tambahkan baris berikut:

 hostssl all all 0.0.0.0/0 md5 host all all 0.0.0.0/0 md5 

dimana:

 hostssl/host -   SSL ( ) all -      all -  ,    () 0.0.0.0/0 -       md5 -    

2. Buat pengaturan yang diperlukan di postgresql.conf (terletak di folder / etc / postgresql / 11 / main ) agar pgbackrest berfungsi:

 archive_command = 'pgbackrest --stanza=main archive-push %p' #  main -  .   postgres    main. archive_mode = on max_wal_senders = 3 wal_level = replica 

3. Buat pengaturan yang diperlukan dalam file konfigurasi pgbackrest (/etc/pgbackrest/pgbackrest.conf):

 [main] pg1-path=/var/lib/postgresql/11/main [global] log-level-file=detail repo1-host=<repository_server_ip> 

4. Mulai ulang postgresql:

 sudo service postgresql restart 

Mengkonfigurasi server repositori


Repositori (pengguna pgbackrest):

Buat pengaturan yang diperlukan dalam file konfigurasi pgbackrest
( /etc/pgbackrest/pgbackrest.conf ):

 [main] pg1-host=<postgres_server_ip> pg1-path=/var/lib/postgresql/11/main [global] repo1-path=/var/lib/pgbackrest repo1-retention-full=2 # ,     . ..            -       . start-fast=y #    ,       https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving 

Pembuatan penyimpanan


Repositori (pengguna pgbackrest):

Buat penyimpanan baru untuk kluster utama :

 sudo mkdir -m 770 /var/lib/pgbackrest sudo chown -R pgbackrest /var/lib/pgbackrest/ sudo -u pgbackrest pgbackrest --stanza=main stanza-create 

Periksa


Server Postgres (pengguna sudo atau root):

Periksa di server postgres:

 sudo -u postgres pgbackrest --stanza=main --log-level-console=info check 

Repositori (pengguna pgbackrest):

Periksa di server repositori:

 sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info check 

Kami memastikan bahwa dalam output kami melihat baris "periksa perintah akhir: selesai dengan sukses".

Apakah kamu lelah? Kami lolos ke yang paling menarik.

Buat cadangan


Repositori (pengguna pgbackrest):


1. Kami melakukan backup:

 sudo -u pgbackrest pgbackrest --stanza=main backup 

2. Kami memastikan bahwa cadangan telah dibuat:

 ls /var/lib/pgbackrest/backup/main/ 

Pgbackrest akan membuat cadangan penuh pertama. Jika mau, Anda dapat menjalankan perintah cadangan lagi dan memastikan bahwa sistem membuat cadangan tambahan.

Jika Anda ingin membuat cadangan lengkap lagi, maka tentukan bendera tambahan:

 sudo -u pgbackrest pgbackrest --stanza=main --type=full backup 

Jika Anda ingin output terperinci ke konsol, maka tentukan juga:

 sudo -u pgbackrest pgbackrest --stanza=main --type=full --log-level-console=info backup 

Kembalikan cadangan


Server Postgres (pengguna sudo atau root):

1. Hentikan gugus kerja:

 sudo pg_ctlcluster 11 main stop 

2. Kami pulih dari cadangan:

 sudo -u postgres pgbackrest --stanza=main --delta restore 

3. Jalankan cluster:

 sudo pg_ctlcluster 11 main start 

Setelah memulihkan cadangan, kita perlu melakukan cadangan kedua:

Repositori (pengguna pgbackrest):

 sudo pgbackrest --stanza=main backup 

Itu saja. Sebagai kesimpulan, saya ingin mengingatkan Anda bahwa dalam kasus apa pun saya mencoba membangun sendiri dba senior dan, pada kesempatan sekecil apa pun, saya akan menggunakan cloud. Saat ini, saya sendiri mulai mempelajari berbagai topik seperti cadangan, replikasi, pemantauan, dll. dan saya menulis laporan kecil tentang hasil untuk memberikan kontribusi kecil kepada masyarakat dan meninggalkan boks kecil untuk saya sendiri.

Dalam artikel berikut saya akan mencoba untuk berbicara tentang fitur-fitur tambahan - pemulihan data pada kluster bersih, enkripsi cadangan dan publikasi pada S3, cadangan melalui rsync.

Source: https://habr.com/ru/post/id476206/


All Articles