https://www.highgo.ca/2020/10/01/postgresql-wal-archiving-and-point-in-time-recovery/
Pengarsipan WAL PostgreSQL dan Pemulihan Point-In-Time
WAL adalah kependekan dari Write-Ahead-Log. Setiap perubahan pada data pertama-tama dicatat dalam file WAL. File WAL terutama digunakan oleh RDBMS sebagai cara untuk mencapai ketahanan dan konsistensi saat menulis data ke sistem penyimpanan.
Sebelum kita melanjutkan, mari kita lihat dulu mengapa kita memerlukan pengarsipan WAL dan Point in Time Recovery (PITR). Pertimbangkan apakah Anda secara tidak sengaja menjatuhkan beberapa tabel atau menghapus beberapa data? Bagaimana cara Anda pulih dari kesalahan seperti itu? Pengarsipan WAL dan PITR adalah jawabannya. File WAL dapat diputar ulang di server untuk membuat ulang perubahan yang direkam di server itu. Oleh karena itu kita dapat menggunakan WAL untuk pulih dari situasi berbahaya tersebut. Sedangkan PITR adalah cara untuk menghentikan pemutaran ulang WAL pada titik yang ditentukan dan memiliki snapshot data yang konsisten pada saat itu. yaitu sesaat sebelum tabel dihilangkan atau data dihapus.
Cara Melakukan Pengarsipan WAL
Biasanya, database PostgreSQL menyimpan file WAL di direktori pg_wal dari $PGDATA. Namun, file WAL ini mungkin didaur ulang dan dapat dihapus/ditimpa oleh server. Jadi untuk menghindari skenario seperti itu, kami menyimpan salinan file WAL di direktori terpisah selain $PGDATA.
Untuk melakukan itu, server PostgreSQL memberi kita cara untuk menyalin file WAL ke lokasi lain segera setelah file WAL dibuat oleh server. Cara ini bergantung pada tiga perintah (opsi) yaitu archive_mode , archive_command , dan wal_level. Opsi ini dapat diatur di file konfigurasi $PGDATA/postgresql.conf.
Opsi Pengarsipan
Server PostgreSQL memberi kita beberapa opsi yang dapat digunakan untuk mengontrol pengarsipan WAL. Mari kita lihat apa saja opsi-opsi ini dan bagaimana menggunakannya.
- archive_mode menandakan apakah kita ingin mengaktifkan pengarsipan WAL. Itu dapat menerima nilai-nilai berikut:
- aktif – untuk mengaktifkan pengarsipan
- mati – menonaktifkan pengarsipan
- selalu – biasanya opsi ini sama dengan 'aktif'. Ini juga memungkinkan pengarsipan untuk server siaga. Jika standby berbagi jalur yang sama dengan server lain, hal ini dapat menyebabkan kerusakan file WAL. Jadi kehati-hatian harus diberikan dalam kasus ini.
- archive_command menentukan cara mengarsipkan (menyalin) file WAL dan di mana. Opsi ini menerima perintah shell atau skrip shell. Yang dijalankan setiap kali ada file WAL yang dihasilkan oleh server untuk mengarsipkannya. Opsi ini menerima placeholder berikut:
- %f – jika ada diganti dengan nama file dari file WAL.
- %p – jika ada diganti dengan nama path file WAL.
- %% – diganti dengan '%'
- wal_level adalah opsi penting lainnya. Di PostgreSQL versi 10+, defaultnya adalah 'replika', sebelum versi ini disetel ke minimal secara default. wal_level menerima nilai-nilai berikut:
- Minimal – hanya menambahkan informasi yang diperlukan untuk pemulihan kerusakan atau dari penghentian langsung. Itu tidak dapat digunakan untuk tujuan replikasi atau pengarsipan.
- Replika – menandakan bahwa WAL akan memiliki informasi yang cukup untuk pengarsipan dan replikasi WAL.
- Logis – menambahkan informasi yang diperlukan untuk replikasi logis.
Pemulihan Titik Dalam Waktu
Di PostgreSQL, PITR adalah cara untuk menghentikan pemutaran ulang file WAL pada waktu yang tepat. Mungkin terdapat banyak file WAL dalam arsip tetapi kami mungkin tidak ingin memutar ulang semuanya. Memutar ulang semua WAL akan menghasilkan keadaan yang sama dimana kita melakukan beberapa kesalahan. Ada dua prasyarat penting yang diperlukan agar PITR dapat berfungsi.
- Ketersediaan cadangan basis penuh (biasanya diambil dengan pg_basebackup)
- File WAL (arsip WAL)
Untuk mencapai PITR, langkah pertama adalah memulihkan cadangan dasar yang diambil sebelumnya dan kemudian membuat pengaturan pemulihan. Penyiapan memerlukan konfigurasi opsi recovery_command dan recovery_target .
- recovery_command menentukan dari mana mencari file WAL untuk diputar ulang di server ini. Perintah ini menerima placeholder yang sama dengan archive_command.
- recovery_target_time Opsi ini memberitahu server kapan harus menghentikan proses pemulihan atau pemutaran ulang. Proses akan berhenti segera setelah stempel waktu yang ditentukan tercapai.
recovery_target_inclusive Opsi ini mengontrol apakah akan menghentikan pemutaran ulang WAL tepat setelah waktu_target_pemulihan tercapai (jika disetel ke benar) atau tepat sebelum (jika disetel ke salah).
Demo
Mari gabungkan semua hal di atas dalam demonstrasi praktis dan lihat cara kerjanya.
Mari kita hentikan server dan buat pengaturan pemulihan pada cadangan untuk dihentikan sebelum penghapusan data terjadi.
Hubungkan ke cluster ini dan lihat apakah kita masih memiliki data di tabel foo?
Lihat ketika pemulihan berhenti, kami masih memiliki datanya!
Kesimpulan
PITR adalah proses penting untuk memulihkan data penting jika terjadi kerusakan server yang dapat mengakibatkan direktori data tidak valid/rusak yang menyebabkan downtime. Namun yang bisa dicegah adalah dampak crash yang mengakibatkan hilangnya data.
Menyimpan cadangan penuh terkini dengan file WAL akan menghasilkan proses pemulihan yang sederhana dan nyaman. Waktu pemulihan akan bergantung pada seberapa baru pencadangan penuh dilakukan dan berapa banyak file WAL yang dihasilkan setelah pencadangan tersebut.
===========================
PostgreSQL WAL Archiving and Point-In-Time-Recovery
WAL is short for Write-Ahead-Log. Any change to the data is first recorded in a WAL file. The WAL files are mainly used by RDBMS as a way to achieve durability and consistency while writing data to storage systems.
Before we move forward, let’s first see why we need a WAL archiving and Point in Time Recovery (PITR). Consider if you have accidentally dropped some table(s) or deleted some data? How do you recover from such mistakes? WAL archiving and PITR is the answer to that. A WAL file can be replayed on a server to recreate the recorded changes on that server. Hence we can use the WALs to recover from such dangerous situations. Whereas the PITR is a way to stop the replay of WALs at the specified point and have a consistent snapshot of data at that time. i.e. just before the table is dropped or data is removed.
How to Perform WAL Archiving
Normally, PostgreSQL databases keep the WAL files in the pg_wal directory of the $PGDATA. However, these WAL files may get recycled and can be deleted/overwritten by the server. So to avoid such scenarios, we keep a copy of WAL files in a separate directory other than $PGDATA.
In order to do that, the PostgreSQL server provides us a way to copy the WAL file to a different location as soon as a WAL file is generated by the server. This way depends on three commands (options) namely archive_mode, archive_command, and wal_level. These options can be set in the $PGDATA/postgresql.conf configuration file.
Archiving Options
PostgreSQL server provides us with some options through which we can control the WAL archiving. Let’s see what these options are and how to use them.
- archive_mode signifies whether we want to enable the WAL archiving. It can accept the following values:
- on – to enable the archiving
- off – disable the archiving
- always – normally this option is the same as ‘on’. This enables archiving for a standby server as well. If the standby shares the same path with another server, it may lead to WAL file corruption. So care must be taken in this case.
- archive_command specifies how to archive (copy) the WAL files and where. This option accepts the shell command or a shell script. Which is executed whenever there is a WAL file generated by the server to archive it. This option accepts the following placeholders:
- %f – if present it’s replaced with the filename of the WAL file.
- %p – if present it is replaced with the pathname of the WAL file.
- %% – is replaced with ‘%’
- wal_level is another important option. In PostgreSQL version 10+, it defaults to ‘replica’, prior to this version it was set to minimal by default. wal_level accepts the following values:
- Minimal – adds only the information that is required for crash recovery or from immediate shutdown. It’s not usable for replication or archiving purposes.
- Replica – signifies that WAL will have enough information for WAL archiving and replication.
- Logical – adds information required for logical replication.
Point In Time Recovery
In PostgreSQL, PITR is a way to stop the replay of WAL files at an appropriate point in time. There can be many WAL files in the archive but we may not want to replay all of them. Replaying all WALs will result in the same state where we had made some mistake. There are two important prerequisites required for PITR to work.
- Availability of a full base backup (usually taken with pg_basebackup)
- WAL files (WAL archive)
In order to achieve the PITR, the first step would be to restore an earlier taken base backup and then create a recovery setup. The setup requires configuring restore_command and recovery_target options.
- restore_command specifies from where to look up the WAL files to replay on this server. This command accepts the same placeholders as archive_command.
- recovery_target_time This option tells the server when to stop the recovery or replay process. The process will stop as soon as the given timestamp is reached.
recovery_target_inclusive This option controls whether to stop the replay of WALs just after the recovery_target_time is reached (if set to true) or just before (if set to false).
Demo
Let’s combine all of the above in a practical demonstration and see how this all works.
Let’s stop the server and create a recovery setup on the backup to stop before the deletion of data occurred.
Connect to this cluster and see if we still have data in the foo table?
See when the recovery stopped, we still have the data!
Conclusion
PITR is a critical process to recover important data in case of a server crash which may result in an invalid/corrupt data directory leading to downtime. However, what can be prevented is the impact of a crash resulting in data loss.
Keeping an up-to-date full backup with WAL files will lead to a simple and convenient restoration process. The time recovery time will depend on how recent the full backup was and how many WAL files were generated past it.
Tidak ada komentar:
Posting Komentar