Di bagian pertama, kami mempelajari cara membuat incremental backup, mengunggahnya ke server jarak jauh (repositori dengan backup) dan kembali ke backup terakhir.
Dalam artikel ini, kita akan mempelajari cara mengenkripsi cadangan, mengunggahnya ke penyimpanan yang kompatibel dengan S3 (alih-alih server repositori kedua), memulihkan ke kluster bersih, dan terakhir, pemulihan titik waktu (PITR).
Momen
Penulis tidak berpura-pura menjadi DBA, tapi terkadang dia suka mengatur dan melihat semuanya sendiri.
Latihan
Untuk mereproduksi manual ini, kami membutuhkan:
- Server dengan database (kami akan menginstal pgbackrest di atasnya);
- Penyimpanan S3 (Anda dapat menggunakan Amazon atau S3 yang kompatibel, saya akan menggunakan Amazon S3);
- Server ketiga. Pilihan. Di atasnya kami akan berlatih menerapkan postgresql dan pgbackrest dari awal, menerapkan cadangan yang ada dari penyimpanan S3 (server terbakar, bergerak, dll.);
Diasumsikan bahwa Anda sudah menginstal postgresql, dan oleh karena itu pengguna postgres juga ada.
Saya menjelaskan proses instalasi pgbackrest di artikel sebelumnya, tetapi untuk berjaga-jaga saya akan menduplikasinya lagi (saya ingatkan: sebelum menginstal, buat pengguna sudo untuk Anda sendiri - Saya akan menggunakan pengguna sudo dengan nama pengguna pgbackrest).
Agar Anda memiliki lebih sedikit masalah saat mereproduksi instruksi, saya menulis dengan huruf miring di mana, oleh pengguna apa dan dengan hak apa saya menjalankan perintah saat menulis dan memeriksa artikel.
Kami akan mengikuti jalur ini:
Konfigurasi postgresql dan pgbackrest Konfigurasi
enkripsi cadangan (dua baris)
Belajar untuk mencadangkan dan mengirim ke penyimpanan S3 (lima baris)
Membuat cadangan
Mari kita bayangkan bahwa kita telah merusak cluster, menerapkan pada server baru, menghubungkan repositori S3 yang ada dan menggulung cadangan
Mari kita lihat PITR (Point In Time Recovery): kita akan memulihkan ke titik waktu tertentu (katakanlah pgbackrest telah mencadangkan tabel drop, tetapi kita perlu memutar kembali 4 jam ketika tanda itu masih ada)
Ayo pergi!
Menginstal pgBackRest
sudo pengguna atau root:
1. Unduh arsip dari pgbackrest dan transfer isinya 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 membangun:
sudo apt-get update
sudo apt-get install build-essential libssl-dev libxml2-dev libperl-dev zlib1g-dev \
libpq-dev
3. Menyatukan 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. Install:
sudo apt-get install perl
6. Buat direktori untuk log, beri mereka hak tertentu:
sudo mkdir -p -m 770 /var/log/pgbackrest
sudo chown postgres:postgres /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 postgres:postgres /etc/pgbackrest/pgbackrest.conf
7. Periksa:
pgbackrest version
Menyiapkan postgresql dan pgBackRest
sudo pengguna atau root:
1. Buat pengaturan yang diperlukan di postgresql.conf (terletak di / etc / postgresql / 11 / folder utama) agar pgBackRest berfungsi:
archive_command = 'pgbackrest --stanza=main archive-push %p' # main - . postgres main.
archive_mode = on
max_wal_senders = 3
wal_level = replica
2. Mari buat pengaturan yang diperlukan di file konfigurasi pgbackrest (/etc/pgbackrest/pgbackrest.conf):
[main]
pg1-path=/var/lib/postgresql/11/main
[global]
log-level-file=detail
repo1-cipher-pass=tr5+BXdfdoxeyUqfo6AzLTrW+c+Jfd/1QbQj2CDMMBwtB0YGH3EJajry4+Eeen6D
repo1-cipher-type=aes-256-cbc
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2 # , . .. , . " " - .
repo1-type=s3
repo1-s3-bucket=pgbackrest-part2-tutorial
repo1-s3-endpoint=s3.us-east-1.amazonaws.com
repo1-s3-region=us-east-1
repo1-s3-key=9wdS3G8U5wz7kNsFWVGck7DDZ7DtVDtbM
repo1-s3-key-secret=A9zRmW16zXKt2vVA8mmNsFWy2mUAPYHa
start-fast=y
[global:archive-push]
compress-level=3
Seperti yang Anda pahami, di sini kami segera mengonfigurasi enkripsi dan mengonfigurasi dukungan untuk penyimpanan S3.
PS Seharusnya tidak ada komentar di konfigurasi.
PS Untuk menghasilkan kunci enkripsi yang kuat, Anda dapat menggunakan perintah:
openssl rand -base64 48
Pembuatan repositori
sudo pengguna atau root:
sudo mkdir -m 770 /var/lib/pgbackrest
sudo chown -R postgres /var/lib/pgbackrest/
sudo -u postgres pgbackrest --stanza=main stanza-create
Jika semuanya berhasil, maka di bucket S3 Anda akan melihat file yang dihasilkan pgbackrest.
Membuat cadangan:
sudo pengguna atau root:
sudo -u postgres pgbackrest --log-level-console=info --stanza=main backup
pgBackRest akan membuat cadangan lengkap pertama. Jika mau, Anda dapat menjalankan kembali perintah backup dan memastikan bahwa sistem akan membuat incremental backup.
Jika Anda ingin membuat full backup lagi, tentukan flag tambahan:
sudo -u postgres pgbackrest --log-level-console=info --stanza=main --type=full backup
Anda dapat melihat daftar cadangan menggunakan perintah:
sudo -u postgres pgbackrest --stanza=main info
Mengembalikan cadangan:
sudo user atau root:
1. Hentikan cluster yang sedang berjalan:
sudo pg_ctlcluster 11 main stop
2. Memulihkan dari cadangan:
sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --recovery-option=recovery_target=immediate restore
Untuk memulihkan database ke status cadangan LENGKAP terakhir, gunakan perintah tanpa menentukan recovery_target:
sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta restore
Penting! Setelah pemulihan, mungkin ternyata database hang dalam mode pemulihan (akan ada kesalahan seperti ERROR: tidak dapat mengeksekusi DROP DATABASE dalam transaksi hanya baca). Ini diselesaikan sebagai berikut (Anda harus menunggu sebentar setelah menjalankan perintah):
sudo -u postgres psql -c "select pg_wal_replay_resume()"
UPD: Seperti yang saya pahami, kesalahan ini terjadi karena fakta bahwa setelah pemulihan dengan recovery_target = segera, pgbackrest menjeda database . Untuk menghindari ini, Anda perlu menentukan beberapa flag (Anda dapat membaca artinya di sini dan di sini ):
sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --recovery-option=recovery_target=immediate --target-action=promote --type=immediate restore
Bahkan, dimungkinkan untuk memulihkan cadangan tertentu dengan namanya. Di sini saya hanya akan memberikan tautan ke deskripsi fitur ini di dokumentasi . Pengembang menyarankan untuk menggunakan parameter ini dengan hati-hati dan menjelaskan alasannya. Dari diri saya sendiri, saya dapat menambahkan bahwa saya telah menggunakannya. Hal utama adalah memastikan bahwa setelah pemulihan, database keluar dari mode pemulihan (pilih pg_is_in_recovery () harus menampilkan "f") dan untuk berjaga-jaga jika membuat cadangan penuh setelah pemulihan.
3. Mulai cluster:
sudo pg_ctlcluster 11 main start
Setelah memulihkan cadangan, kami akan melakukan pencadangan kedua:
sudo -u postgres pgbackrest --log-level-console=info --stanza=main backup
Memulihkan cadangan ke cluster bersih:
Mari kita bayangkan bahwa sesuatu yang buruk terjadi - server terbakar (jatuh, kebanjiran, kehilangan akses). Kita perlu memulihkan semuanya ke server baru yang bersih. Di server baru, kami telah membuat pengguna sudo, menginstal pgbackrest, menginstal postgresql dan kami memiliki cluster utama yang bersih dan segar.
Yang perlu kita lakukan adalah mengatur konfigurasi postgresql dan pgBackRest dengan cara yang sama seperti pada server sebelumnya, restart postgresql dan jalankan perintah perintah yang mirip dengan restore:
sudo user atau root:
1. Hentikan cluster yang sedang berjalan:
sudo pg_ctlcluster 11 main stop
2. Memulihkan dari cadangan:
sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --recovery-option=recovery_target=immediate --target-action=promote --type=immediate restore
PS Saya menjelaskan nuansa dan kehalusan dari perintah ini di atas.
3. Mulai cluster:
sudo pg_ctlcluster 11 main start
Setelah memulihkan cadangan, kita perlu melakukan pencadangan kedua:
sudo -u postgres pgbackrest --log-level-console=info --stanza=main backup
Faktanya, itu saja. Api itu padam.
Point In Time Recovery (PITR)
Mari kita bayangkan situasi seperti itu sehingga pada pukul 16:00 cadangan dibuat, dan pada pukul 18:05 kami secara tidak sengaja menghapus pelat penting di mana banyak data penting yang tidak ingin hilang berhasil didapat dalam 2 jam. PgBackRest dengan mengorbankan PostgreSQL memberi kami peluang seperti itu: kami dapat memutar kembali ke titik waktu tertentu, asalkan kami memiliki cukup informasi untuk dipulihkan.
Ini bekerja seperti ini:
- Kami mengatakan bahwa kami ingin memutar kembali ke waktu 18:04;
- pgBackRest mencari cadangan terkini (16:00);
- Mengembalikannya, tetapi tidak semuanya berguling, tetapi hanya apa yang berhasil kami lakukan sebelum 18.04;
PS mekanisme ini dibangun di atas log WAL. Anda bisa membacanya disini .
Anda dapat melakukan pemulihan ke titik waktu tertentu (setelah menghentikan cluster) dengan perintah ini:
sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --type=time "--target=2020-09-06 18:27:24.561458+02" --target-action=promote restore
Catatan penting - PostgreSQL hanya dapat memutar log WAL maju, bukan mundur. Apa artinya ini dalam praktik?
Katakanlah cadangan dibuat pada pukul 16:00. Pada pukul 18:05 kami tidak sengaja menghapus tabel, dan pada pukul 18:10 cadangan dibuat lagi dengan tabel yang telah dihapus. Saat Anda mencoba membuat PITR, pgBackRest akan mengambil cadangan yang dibuat pada pukul 16:00 dan mengembalikan semua yang ada sebelum pukul 18:05, dan tidak akan mengambil cadangan yang dibuat pada pukul 18:10 dan akan mengembalikan semuanya. Ini penting untuk dipahami. Mekanisme ini dijelaskan lebih detail di sini .
Misalkan Anda membuat cadangan, yang sudah berisi informasi tentang menghapus tabel. Dengan menggunakan --set flag, katakanlah cadangan mana yang harus digunakan untuk basis (cadangan di mana tabel itu masih ada). pgBackRest akan mengambil cadangan ini dan mengembalikan semua yang ada sebelum tabel dihapus.
sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --type=time --set=20200905-183838F_20200906-182612I "--target=2020-09-06 18:27:24.561458+02" --target-action=promote restore
PS Saya menunjukkan perintah untuk mendapatkan daftar cadangan di atas.
Mari kita mulai cluster. Setelah peluncuran, mari kita periksa file /var/log/postgresql/postgresql-11-main.log. Di dalamnya, kami tertarik pada baris berikut, yang menunjukkan bahwa pemulihan ke titik waktu yang ditentukan berhasil:
starting point-in-time recovery to 2020-09-07 11:26:52.493127+02
...
recovery stopping before commit of transaction 576, time 2020-09-07 11:27:14.584496+02
...
last completed transaction was at log time 2020-09-07 11:24:09.583761+02
Itu saja. Saya sangat menyarankan Anda untuk bereksperimen dengan alat ini sebelum menggunakannya dalam pertempuran.