Senin, 15 Juli 2024

POSTGRES-pgbackup

https://www.crunchydata.com/blog/introduction-to-postgres-backups 

Cadangan di dunia basis data sangatlah penting. Mereka adalah jaring pengaman yang melindungi Anda dari kehilangan data sekecil apa pun. Ada berbagai cara untuk mencadangkan data Anda dan postingan ini bertujuan untuk menjelaskan alat dasar yang terlibat dalam pencadangan dan opsi apa yang Anda miliki, mulai dari memulai hingga sistem produksi yang lebih canggih.

pg_dump/pg_restore

pg_dumpdan pg_dumpallmerupakan alat yang dirancang untuk menghasilkan file dan kemudian memungkinkan database dipulihkan. Ini diklasifikasikan sebagai cadangan logis dan ukurannya bisa jauh lebih kecil daripada cadangan fisik. Hal ini sebagian disebabkan oleh fakta bahwa indeks tidak disimpan dalam dump SQL. Hanya CREATE INDEXperintah yang disimpan dan indeks harus dibuat ulang saat memulihkan dari cadangan logis.

Salah satu keuntungan dari pendekatan dump SQL adalah outputnya secara umum dapat dimuat ulang ke versi Postgres yang lebih baru sehingga dump dan pemulihan sangat populer untuk peningkatan versi dan migrasi. Keuntungan lainnya adalah alat ini dapat dikonfigurasi untuk mencadangkan objek database tertentu dan mengabaikan objek lainnya. Hal ini berguna, misalnya, jika hanya subset tabel tertentu yang perlu ditampilkan dalam lingkungan pengujian. Atau Anda ingin membuat cadangan satu tabel saat Anda melakukan pekerjaan berisiko.

Dump Postgres juga konsisten secara internal, yang berarti dump mewakili snapshot database pada saat proses dimulai. Dump biasanya tidak memblokir operasi lain, namun dapat berjalan lama (yaitu beberapa jam atau hari, bergantung pada perangkat keras dan ukuran database). Karena metode yang digunakan Postgres untuk mengimplementasikan konkurensi, yang dikenal sebagai Kontrol Konkurensi Multiversi, pencadangan yang berjalan lama dapat menyebabkan Postgres mengalami penurunan kinerja hingga dump selesai.

Untuk membuang tabel database tunggal Anda dapat menjalankan sesuatu seperti:

pg_dump -t my_table > table.sql

Untuk memulihkannya, jalankan sesuatu seperti:

psql -f table.sql

pg_dump sebagai pemeriksaan korupsi

pg_dump secara berurutan memindai seluruh kumpulan data saat membuat file. Membaca seluruh database adalah pemeriksaan kerusakan yang belum sempurna untuk semua data tabel, tetapi tidak untuk indeks. Jika data Anda rusak, pg_dump akan mengeluarkan pengecualian. Crunchy umumnya merekomendasikan penggunaan amcheckmodul untuk melakukan pemeriksaan kerusakan, terutama selama beberapa jenis peningkatan atau migrasi yang mungkin melibatkan pengumpulan .

Pencadangan server & sistem file

Jika Anda berasal dari dunia admin Linux, Anda terbiasa dengan opsi pencadangan untuk seluruh mesin yang dijalankan database Anda, menggunakan rsyncatau alat lain. Postgres tidak dapat melakukan pencadangan dengan aman menggunakan alat berorientasi file saat sedang berjalan, dan juga tidak ada cara sederhana untuk menghentikan penulisan. Untuk menjadikan database dalam keadaan di mana Anda dapat rsyncmenyimpan data, Anda harus mematikannya atau melakukan semua pekerjaan menyiapkan pengarsipan perubahan. Ada juga beberapa opsi lain untuk lapisan penyimpanan yang mendukung snapshot untuk seluruh direktori data - tetapi bacalah rinciannya.

Pencadangan Fisik & pengarsipan WAL

Selain file dump dasar, metode pencadangan Postgres yang lebih canggih semuanya bergantung pada penyimpanan file Write-Ahead-Log ( WAL ) database . WAL melacak perubahan pada semua blok basis data, menyimpannya ke dalam segmen dengan ukuran default 16MB. Kumpulan file WAL server yang berkelanjutan disebut sebagai aliran WAL-nya. Anda harus mulai mengarsipkan file aliran WAL sebelum Anda dapat menyalin database dengan aman, diikuti dengan prosedur yang menghasilkan "Base Backup", yaitu pg_basebackup. Aspek tambahan WAL memungkinkan serangkaian fitur restorasi lainnya yang disatukan di bawah bendera alat Pemulihan Point In Time .

Buat cadangan dasar dengan pg_basebackup

Anda dapat menggunakan sesuatu seperti ini:

$ sudo -u postgres pg_basebackup -h localhost -p 5432 -U postgres \
	-D /var/lib/pgsql/15/backups -Ft -z -Xs -P -c fast

Sedikit komentar pada perintah di atas.

  • Perintah ini harus dijalankan sebagai postgrespengguna.
  • Parameter -Dmenentukan tempat menyimpan cadangan.
  • Parameter -Ftmenunjukkan format tar yang harus digunakan.
  • Parameter ini -Xsmenunjukkan bahwa file WAL akan dialirkan ke cadangan. Hal ini penting karena aktivitas WAL yang besar dapat terjadi saat pencadangan dilakukan dan Anda mungkin tidak ingin menyimpan file tersebut di folder utama selama periode ini. Ini adalah perilaku default, tetapi perlu diperhatikan.
  • Parameter ini -zmenunjukkan bahwa file tar akan dikompresi.
  • Parameter -Pmenunjukkan bahwa informasi kemajuan ditulis ke stdout selama proses.
  • Parameter -ccepat menunjukkan bahwa pos pemeriksaan segera diambil. Jika parameter ini tidak ditentukan, pencadangan tidak akan dimulai hingga Postgres mengeluarkan pos pemeriksaan sendiri, dan ini bisa memakan banyak waktu.

Setelah perintah dimasukkan, pencadangan akan segera dimulai. Tergantung pada ukuran cluster, mungkin perlu beberapa waktu untuk menyelesaikannya. Namun, ini tidak akan mengganggu koneksi lain ke database.

Langkah-langkah untuk memulihkan dari cadangan yang diambil dengan pg_basebackup

Mereka disederhanakan dari dokumentasi resmi . Jika Anda menggunakan beberapa fitur seperti tablespace, Anda perlu mengubah langkah-langkah ini untuk lingkungan Anda.

  1. Pastikan database dimatikan.

    sudo systemctl stop postgresql-15.service
    sudo systemctl status postgresql-15.service
    
  2. Hapus isi direktori data Postgres untuk mensimulasikan bencana.

    sudo rm -rf /var/lib/pgsql/15/data/*
    
  3. Ekstrak base.tar.gz ke dalam direktori data.

    $ sudo -u postgres ls -l /var/lib/pgsql/15/backups
    total 29016
    -rw-------. 1 postgres postgres   182000 Nov 23 21:09 backup_manifest
    -rw-------. 1 postgres postgres 29503703 Nov 23 21:09 base.tar.gz
    -rw-------. 1 postgres postgres	17730 Nov 23 21:09 pg_wal.tar.gz
    
    
    $ sudo -u postgres tar -xvf /var/lib/pgsql/15/backups/base.tar.gz \
         -C /var/lib/pgsql/15/data
    
  4. Ekstrak pg_wal.tar.gz ke direktori baru di luar direktori data. Dalam kasus kami, kami membuat direktori bernama pg_wal di dalam direktori cadangan kami.

    $ sudo -u postgres ls -l /var/lib/pgsql/15/backups
    total 29016
    -rw-------. 1 postgres postgres   182000 Nov 23 21:09 backup_manifest
    -rw-------. 1 postgres postgres 29503703 Nov 23 21:09 base.tar.gz
    -rw-------. 1 postgres postgres	17730 Nov 23 21:09 pg_wal.tar.gz
    
    $ sudo -u postgres mkdir -p /var/lib/pgsql/15/backups/pg_wal
    
    $ sudo -u postgres tar -xvf /var/lib/pgsql/15/backups/pg_wal.tar.gz \
          -C /var/lib/pgsql/15/backups/pg_wal/
    
  5. Buat file recovery.signal.

    sudo -u postgres touch /var/lib/pgsql/15/data/recovery.signal
    
  6. Atur recovery_command di postgresql.conf untuk menyalin file WAL yang dialirkan selama pencadangan.

    echo "restore_command = 'cp /var/lib/pgsql/15/backups/pg_wal/%f %p'" | \
          sudo tee -a /var/lib/pgsql/15/data/postgresql.conf
    
  7. Mulai basis data.

    $ sudo systemctl start postgresql-15.service sudo systemctl status
    postgresql-15.service
    
  8. Sekarang database Anda sudah aktif dan berjalan berdasarkan informasi yang terdapat pada basebackup sebelumnya.

Mengotomatiskan pencadangan fisik

Berdasarkan pg_basebackup, Anda dapat menulis serangkaian skrip untuk menggunakan cadangan ini, menambahkan segmen WAL ke dalamnya, dan mengelola skenario pencadangan fisik yang lengkap. Ada beberapa alat di luar sana termasuk WAL-E, WAL-G, dan pgBackRest yang akan melakukan semua ini untuk Anda. WAL-G adalah generasi berikutnya dari WAL-E dan berfungsi untuk beberapa database lain termasuk MySQL dan Microsoft SQL Server. WAL-G juga digunakan secara luas di tingkat perusahaan dengan beberapa lingkungan Postgres besar, termasuk Heroku. Saat kami pertama kali membangun Crunchy Bridge, kami mempunyai pilihan antara WAL-G dan pgBackRest karena kami mempekerjakan pengelola keduanya dan masing-masing memiliki kelebihannya masing-masing. Pada akhirnya, kami memilih pgBackRest.

pgBackRest

pgBackRest adalah alat pencadangan terbaik di kelasnya yang pernah ada. Ada sejumlah lingkungan Postgres yang sangat besar yang mengandalkan pgBackRest, termasuk Crunchy Bridge kami sendiri , Crunchy for Kubernetes , dan Crunchy Postgres serta banyak proyek lain di ekosistem Postgres.

pgBackRest dapat melakukan tiga jenis pencadangan:

  • Cadangan penuh - ini menyalin seluruh isi cluster database ke cadangan.
  • Pencadangan diferensial - ini hanya menyalin file cluster database yang telah berubah sejak pencadangan penuh terakhir
  • Pencadangan tambahan - yang hanya menyalin file cluster database yang telah berubah sejak pencadangan penuh, diferensial, atau tambahan terakhir.

pgBackRest memiliki beberapa fitur khusus seperti:

  • Memungkinkan Anda kembali ke Suatu Titik Waktu - PITR (Pemulihan Titik-dalam-Waktu)
  • Membuat Delta Restore yang akan menggunakan file database yang sudah ada dan diperbarui berdasarkan segmen WAL. Hal ini membuat potensi pemulihan menjadi lebih cepat, terutama jika Anda memiliki database yang besar dan tidak ingin memulihkan semuanya.
  • Memungkinkan Anda memiliki beberapa repositori cadangan - misalnya satu repositori lokal atau satu repositori jarak jauh untuk redundansi.

Mengenai pengarsipan, pengguna dapat mengatur archive_commandparameter untuk menggunakan pgBackRest untuk menyalin file WAL ke arsip eksternal. File-file ini dapat disimpan tanpa batas waktu atau habis masa berlakunya sesuai dengan kebijakan penyimpanan data organisasi Anda.

Untuk memulai pgBackRest setelah instalasi, Anda akan menjalankan sesuatu seperti ini:

sudo -u postgres pgbackrest --stanza=demo --log-level-console=info stanza-create

Untuk melakukan pemulihan delta:

$ sudo systemctl stop postgresql-15.service
$ sudo -u postgres pgbackrest \
--stanza=db --delta \
--type=time "--target=2022-09-01 00:00:05.010329+00" \
--target-action=promote restore

Ketika pemulihan selesai, Anda memulai ulang database dan memverifikasi bahwa tabel pengguna telah kembali.

sudo systemctl start postgresql-15.service
sudo -u postgres psql -c "select * from users limit 1"

Waktu pencadangan

pgBackRest memiliki pengaturan dan konfigurasi yang cukup luas untuk menyiapkan strategi khusus sesuai kebutuhan Anda. Strategi pencadangan Anda akan bergantung pada beberapa faktor, termasuk tujuan titik pemulihan, penyimpanan yang tersedia, dan faktor lainnya. Solusi yang tepat akan bervariasi berdasarkan persyaratan ini. Menemukan strategi yang tepat untuk kasus penggunaan Anda adalah soal menyeimbangkan waktu pemulihan, penyimpanan yang digunakan, overhead IO pada database sumber, dan faktor lainnya.

Rekomendasi kami yang biasa adalah menggabungkan kemampuan pencadangan dan pengarsipan WAL dari pgBackRest. Kami biasanya menyarankan pelanggan melakukan pencadangan basis penuh mingguan selain pengarsipan file WAL yang berkelanjutan, dan mempertimbangkan apakah bentuk pencadangan tambahan lainnya--bahkan mungkin pg_dump--sesuai dengan kebutuhan Anda.

Kesimpulan

kisi opsi migrasi postgres serta fitur dan kemampuannya

Memilih alat pencadangan untuk kasus penggunaan Anda akan menjadi pilihan pribadi berdasarkan kebutuhan Anda, toleransi waktu pemulihan, dan penyimpanan yang tersedia. Secara umum, yang terbaik adalah menganggap pg_dump sebagai utilitas untuk melakukan tugas database tertentu. pg_basebackup dapat menjadi opsi jika Anda setuju dengan satu cadangan fisik pada waktu tertentu. Jika Anda memiliki sistem produksi yang besar dan perlu membuat skenario pemulihan bencana, sebaiknya terapkan pgBackRest atau alat yang lebih canggih menggunakan segmen WAL di atas cadangan dasar. Tentu saja, ada opsi yang dikelola sepenuhnya seperti Crunchy Bridge yang akan menangani semua ini untuk Anda.

Ditulis bersama dengan Elizabeth Christensen

Tidak ada komentar:

Posting Komentar