Αύξηση αντιγράφων ασφαλείας postgresql με pgbackrest - ένα μάθημα για έναν νεαρό μαχητή από τον προγραμματιστή

Αποποίηση ευθυνών

Είμαι προγραμματιστής. Γράφω κώδικα και αλληλεπιδρώ με τη βάση δεδομένων μόνο ως χρήστης. Σε καμία περίπτωση δεν προσποιούμαι ότι είμαι διαχειριστής συστήματος, πόσο μάλλον dba. Αλλά…

Έτυχε να χρειαστεί να οργανώσω ένα αντίγραφο ασφαλείας της βάσης δεδομένων postgresql. Χωρίς σύννεφα - απλώς χρησιμοποιήστε SSH και βεβαιωθείτε ότι όλα λειτουργούν χωρίς να ζητάτε χρήματα. Τι κάνουμε σε τέτοιες περιπτώσεις; Αυτό είναι σωστό, σπρώχνουμε το pgdump στο cron, κάνουμε αντίγραφα ασφαλείας για τα πάντα στο αρχείο κάθε μέρα και αν χαθούμε εντελώς, στέλνουμε αυτό το αρχείο κάπου μακριά.

Αυτή τη φορά η δυσκολία ήταν ότι σύμφωνα με τα σχέδια, η βάση δεδομένων έπρεπε να αυξηθεί κατά +- 100 MB περίπου την ημέρα. Φυσικά, μετά από μερικές εβδομάδες η επιθυμία δημιουργίας αντιγράφων ασφαλείας όλων με το pgdump θα εξαφανιστεί. Αυτό είναι όπου τα αυξητικά αντίγραφα ασφαλείας έρχονται στη διάσωση.

Ενδιαφέρων? Καλώς ήρθατε στο cat.

Το επαυξητικό αντίγραφο ασφαλείας είναι ένας τύπος δημιουργίας αντιγράφων ασφαλείας όταν δεν αντιγράφονται όλα τα αρχεία προέλευσης, αλλά μόνο τα νέα και αυτά που έχουν αλλάξει από τη δημιουργία του προηγούμενου αντιγράφου.

Όπως κάθε προγραμματιστής που ήταν ΑΠΟΛΥΤΑ απρόθυμος (εκείνη την εποχή) να καταλάβει τις περιπλοκές του postgres, ήθελα να βρω το πράσινο κουμπί. Λοιπόν, ξέρετε, όπως στο AWS, το DigitalOcean: πατήσατε ένα κουμπί - πήρατε αναπαραγωγή, πατήσατε το δεύτερο - δημιουργήσατε αντίγραφα ασφαλείας, το τρίτο - επαναφέρατε τα πάντα πίσω μερικές ώρες. Δεν βρήκα ένα κουμπί ή ένα όμορφο εργαλείο GUI. Εάν γνωρίζετε ένα (δωρεάν ή φθηνό), γράψτε για αυτό στα σχόλια.

Αφού γκουγκλάρισα βρήκα δύο εργαλεία pgbarman и pgbackrest. Απλώς δεν τα κατάφερα με το πρώτο (πολύ αραιή τεκμηρίωση, προσπάθησα να καταλάβω τα πάντα σύμφωνα με τα παλιά εγχειρίδια), αλλά με το δεύτερο η τεκμηρίωση αποδείχθηκε ότι ήταν στο ίδιο επίπεδο, αλλά όχι χωρίς ελαττώματα. Για να απλοποιηθεί η εργασία όσων αντιμετωπίζουν παρόμοια εργασία, γράφτηκε αυτό το άρθρο.

Αφού διαβάσετε αυτό το άρθρο, θα μάθετε πώς να δημιουργείτε σταδιακά αντίγραφα ασφαλείας, να τα αποθηκεύετε σε έναν απομακρυσμένο διακομιστή (αποθήκη με αντίγραφα ασφαλείας) και να τα επαναφέρετε σε περίπτωση απώλειας δεδομένων ή άλλων προβλημάτων στον κύριο διακομιστή.

Εκπαίδευση

Για να αναπαραγάγετε το εγχειρίδιο θα χρειαστείτε δύο VPS. Το πρώτο θα είναι το αποθηκευτικό χώρο (το αποθετήριο στο οποίο θα αποθηκεύονται τα αντίγραφα ασφαλείας) και το δεύτερο, στην πραγματικότητα, ο ίδιος ο διακομιστής με postgres (στην περίπτωσή μου, έκδοση 11 του postgres).

Υποτίθεται ότι στον διακομιστή με το postgres έχετε root, sudo χρήστη, χρήστη postgres και είναι εγκατεστημένο το ίδιο το postgres (ο χρήστης postgres δημιουργείται αυτόματα κατά την εγκατάσταση του postgresql) και στον διακομιστή αποθετηρίου υπάρχει χρήστης root και sudo (στο εγχειρίδιο θα χρησιμοποιηθεί το όνομα χρήστη pgbackrest) .

Για να έχετε λιγότερα προβλήματα κατά την αναπαραγωγή των οδηγιών, γράφω με πλάγιους χαρακτήρες πού, με ποιο χρήστη και με ποια δικαιώματα εκτέλεσα την εντολή κατά τη σύνταξη και τον έλεγχο του άρθρου.

Εγκατάσταση του pgbackrest

Αποθετήριο (pgbackrest χρήστη):

1. Κατεβάστε το αρχείο από το pgbackrest και μεταφέρετε τα περιεχόμενά του στο φάκελο /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. Εγκαταστήστε τις απαραίτητες εξαρτήσεις για τη συναρμολόγηση:

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

3. Συναρμολόγηση pgbackrest:

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

4. Αντιγράψτε το εκτελέσιμο αρχείο στον κατάλογο /usr/bin:

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

5. Το Pgbackrest απαιτεί perl. Εγκαθιστώ:

sudo apt-get install perl

6. Δημιουργήστε καταλόγους για αρχεία καταγραφής, δώστε τους ορισμένα δικαιώματα:

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. Ελέγξτε:

pgbackrest version

Διακομιστής Postgres (χρήστης sudo ή root):

Η διαδικασία εγκατάστασης του pgbackrest σε διακομιστή με postgres είναι παρόμοια με τη διαδικασία εγκατάστασης στο αποθετήριο (ναι, το pgbackrest πρέπει να εγκατασταθεί και στους δύο διακομιστές), αλλά στην 6η παράγραφο η δεύτερη και τελευταία εντολή:

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

αντικατέστησε με:

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

Ρύθμιση αλληλεπίδρασης μεταξύ διακομιστών μέσω SSH χωρίς κωδικό πρόσβασης

Για να λειτουργήσει σωστά το pgbackrest, είναι απαραίτητο να διαμορφώσετε την αλληλεπίδραση μεταξύ του διακομιστή postgres και του αποθετηρίου χρησιμοποιώντας το αρχείο κλειδιού.

Αποθετήριο (pgbackrest χρήστη):

Δημιουργήστε ένα ζεύγος κλειδιών:

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

Προσοχή! Εκτελούμε τις παραπάνω εντολές χωρίς sudo.

Διακομιστής Postgres (χρήστης sudo ή root):

Δημιουργήστε ένα ζεύγος κλειδιών:

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 ""

Αποθετήριο (χρήστης sudo):

Αντιγράψτε το δημόσιο κλειδί του διακομιστή postgres στον διακομιστή αποθετηρίου:

(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

Σε αυτό το βήμα θα σας ζητηθεί ο κωδικός πρόσβασης για τον χρήστη root. Πρέπει να εισαγάγετε τον κωδικό πρόσβασης του root χρήστη του διακομιστή postgres!

Διακομιστής Postgres (χρήστης sudo):

Αντιγράψτε το δημόσιο κλειδί του αποθετηρίου στον διακομιστή με το 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

Σε αυτό το βήμα θα σας ζητηθεί ο κωδικός πρόσβασης για τον χρήστη root. Πρέπει να εισαγάγετε ακριβώς τον κωδικό πρόσβασης του χρήστη root του αποθετηρίου!

Ελέγχουμε:

Αποθετήριο (χρήστης root, για την καθαρότητα του πειράματος):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Διακομιστής Postgres (χρήστης root, για την καθαρότητα του πειράματος):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Φροντίζουμε να έχουμε πρόσβαση χωρίς προβλήματα.

Ρύθμιση διακομιστή postgres

Διακομιστής Postgres (χρήστης sudo ή root):

1. Ας επιτρέψουμε το χτύπημα στον διακομιστή postgres από εξωτερικές IP. Για να το κάνετε αυτό, επεξεργαστείτε το αρχείο postgresql.conf (βρίσκεται στον φάκελο /etc/postgresql/11/main), προσθέτοντας τη γραμμή σε αυτόν:

listen_addresses = '*'

Εάν υπάρχει ήδη μια τέτοια γραμμή, είτε αφαιρέστε το σχόλιο είτε ορίστε την τιμή της παραμέτρου ως '*'.

Στο αρχείο pg_hba.conf (βρίσκεται επίσης στο φάκελο /etc/postgresql/11/main) προσθέστε τις ακόλουθες γραμμές:

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

όπου:

hostssl/host - подключаемся через SSL (или нет)
all - разрешаем подключение ко всем базам
all - имя пользователя, которому разрешаем подключение (всем)
0.0.0.0/0 - маска сети с которой можно подключаться
md5 - способ шифрования пароля

2. Ας κάνουμε τις απαραίτητες ρυθμίσεις postgresql.conf (είναι στο φάκελο /etc/postgresql/11/main) για να λειτουργήσει το pgbackrest:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Где main - название кластера. При установке postgres автоматически создает кластер main.
archive_mode = on
max_wal_senders = 3
wal_level = replica

3. Ας κάνουμε τις απαραίτητες ρυθμίσεις στο αρχείο διαμόρφωσης pgbackrest (/etc/pgbackrest/pgbackrest.conf):

[main]
pg1-path=/var/lib/postgresql/11/main

[global]
log-level-file=detail
repo1-host=<repository_server_ip>

4. Επαναφόρτωση του postgresql:

sudo service postgresql restart

Ρύθμιση διακομιστή αποθετηρίου

Αποθετήριο (χρήστης pgbackrest):

Ας κάνουμε τις απαραίτητες ρυθμίσεις στο αρχείο ρυθμίσεων 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 # Параметр, указывающий сколько хранить полных бэкапов. Т.е. если у вас есть два полных бэкапа и вы создаете третий, то самый старый бэкап будет удален. Можно произносить как "хранить не более двух бэкапов" - по аналогии с ротациями логов. Спасибо @Aytuar за исправление ошибки.
start-fast=y # Начинает резервное копирование немедленно, прочитать про этот параметр можно тут https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Δημιουργία αποθετηρίου

Αποθετήριο (χρήστης pgbackrest):

Δημιουργήστε ένα νέο χώρο αποθήκευσης για το σύμπλεγμα κύριος:

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

Проверка

Διακομιστής Postgres (χρήστης sudo ή root):

Ελέγχουμε στον διακομιστή postgres:

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

Αποθετήριο (χρήστης pgbackrest):

Ελέγχουμε τον διακομιστή αποθετηρίου:

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

Βεβαιωνόμαστε ότι στην έξοδο βλέπουμε τη γραμμή "check command end: ολοκληρωθεί με επιτυχία".

Κουρασμένος? Ας περάσουμε στο πιο ενδιαφέρον κομμάτι.

Δημιουργία αντιγράφου ασφαλείας

Αποθετήριο (χρήστης pgbackrest):

1. Εκτελέστε ένα αντίγραφο ασφαλείας:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Βεβαιωθείτε ότι έχει δημιουργηθεί ένα αντίγραφο ασφαλείας:

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

Το Pgbackrest θα δημιουργήσει το πρώτο πλήρες αντίγραφο ασφαλείας. Εάν θέλετε, μπορείτε να εκτελέσετε ξανά την εντολή δημιουργίας αντιγράφων ασφαλείας και να βεβαιωθείτε ότι το σύστημα δημιουργεί ένα σταδιακό αντίγραφο ασφαλείας.

Εάν θέλετε να δημιουργήσετε ξανά ένα πλήρες αντίγραφο ασφαλείας, τότε καθορίστε μια πρόσθετη σημαία:

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

Εάν θέλετε λεπτομερή έξοδο κονσόλας, τότε καθορίστε επίσης:

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

Επαναφορά αντιγράφου ασφαλείας

Διακομιστής Postgres (χρήστης sudo ή root):

1. Διακόψτε το λειτουργικό σύμπλεγμα:

sudo pg_ctlcluster 11 main stop

2. Επαναφορά από αντίγραφο ασφαλείας:

sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --recovery-option=recovery_target=immediate restore

Για να επαναφέρετε τη βάση δεδομένων στην κατάσταση του τελευταίου FULL backup, χρησιμοποιήστε την εντολή χωρίς να καθορίσετε το recovery_target:

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

Σπουδαίος! Μετά την ανάκτηση, μπορεί να συμβεί η βάση δεδομένων να κολλήσει στη λειτουργία ανάκτησης (θα υπάρξουν σφάλματα όπως ERROR: δεν είναι δυνατή η εκτέλεση της DROP DATABASE σε μια συναλλαγή μόνο για ανάγνωση). Για να είμαι ειλικρινής, δεν έχω καταλάβει ακόμα με τι συνδέεται αυτό. Η λύση είναι η εξής (θα χρειαστεί να περιμένετε λίγο μετά την εκτέλεση της εντολής):

sudo -u postgres psql -c "select pg_wal_replay_resume()"

Μάλιστα, είναι δυνατή η επαναφορά ενός συγκεκριμένου αντιγράφου ασφαλείας με το όνομά του. Εδώ είμαι μόνο Θα παράσχω έναν σύνδεσμο για την περιγραφή αυτής της δυνατότητας στην τεκμηρίωση. Οι προγραμματιστές συμβουλεύουν τη χρήση αυτής της επιλογής με προσοχή και εξηγούν γιατί. Μπορώ να προσθέσω από τον εαυτό μου ότι το χρησιμοποίησα. Εάν χρειάζεται πραγματικά, βεβαιωθείτε ότι μετά την ανάκτηση η βάση δεδομένων εξέρχεται από τη λειτουργία ανάκτησης (επιλέξτε το pg_is_in_recovery() θα πρέπει να δείχνει το "f") και, για κάθε περίπτωση, δημιουργήστε ένα πλήρες αντίγραφο ασφαλείας μετά την ανάκτηση.

3. Ξεκινήστε το σύμπλεγμα:

sudo pg_ctlcluster 11 main start

Μετά την επαναφορά του αντιγράφου ασφαλείας, πρέπει να κάνουμε ένα δεύτερο αντίγραφο ασφαλείας:

Αποθετήριο (χρήστης pgbackrest):

sudo pgbackrest --stanza=main backup

Αυτό είναι όλο. Εν κατακλείδι, θα ήθελα να σας υπενθυμίσω ότι σε καμία περίπτωση δεν προσπαθώ να προσποιηθώ ότι είμαι ανώτερος dba και θα χρησιμοποιήσω τα σύννεφα με την παραμικρή ευκαιρία. Επί του παρόντος, εγώ ο ίδιος αρχίζω να μελετώ διάφορα θέματα όπως δημιουργία αντιγράφων ασφαλείας, αναπαραγωγή, παρακολούθηση κ.λπ. και γράφω μικρές αναφορές για τα αποτελέσματα για να κάνω μια μικρή συνεισφορά στην κοινότητα και να αφήσω μικρά cheat sheets για μένα.

Στα επόμενα άρθρα θα προσπαθήσω να μιλήσω για πρόσθετες λειτουργίες - ανάκτηση δεδομένων σε καθαρό σύμπλεγμα, κρυπτογράφηση αντιγράφων ασφαλείας και δημοσίευση στο S3, δημιουργία αντιγράφων ασφαλείας μέσω rsync.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο