Pgbackrest ile artımlı postgresql yedeklemeleri - geliştiriciden genç bir dövüşçü için bir kurs

sorumluluk reddi

Ben bir geliştiriciyim. Kod yazıyorum ve veritabanıyla yalnızca kullanıcı olarak etkileşime giriyorum. Hiçbir şekilde bir sistem yöneticisi gibi davranmıyorum, hatta bir veritabanı yöneticisi bile değilim. Ancak…

Öyle oldu ki postgresql veritabanının yedeğini organize etmem gerekiyordu. Bulut yok; yalnızca SSH kullanın ve para istemeden her şeyin çalıştığından emin olun. Böyle durumlarda ne yaparız? Aynen öyle, pgdump'ı cron'a gönderiyoruz, her gün her şeyi arşive yedekliyoruz ve eğer tamamen kaybolursak bu arşivi çok uzak bir yere gönderiyoruz.

Bu seferki zorluk, planlara göre veritabanının günde yaklaşık +- 100 MB artmasının beklenmesiydi. Elbette birkaç hafta sonra her şeyi pgdump ile yedekleme isteği ortadan kalkacak. Artımlı yedeklemelerin kurtarmaya geldiği yer burasıdır.

İlginç? Kedi'ye hoş geldiniz.

Artımlı yedekleme, tüm kaynak dosyaların kopyalanmadığı, yalnızca yeni dosyaların ve önceki kopyanın oluşturulmasından bu yana değiştirilenlerin kopyalandığı bir yedekleme türüdür.

Postgres'in inceliklerini anlamakta (o zamanlar) KESİNLİKLE isteksiz olan herhangi bir geliştirici gibi ben de yeşil düğmeyi bulmak istedim. Bilirsiniz, AWS, DigitalOcean'da olduğu gibi: bir düğmeye bastınız - kopyalamayı aldınız, ikincisine bastınız - yedeklemeleri ayarladınız, üçüncüsünde - her şeyi birkaç saat geriye aldınız. Bir düğme veya güzel bir GUI aracı bulamadım. Birini biliyorsanız (ücretsiz veya ucuz), yorumlara bunun hakkında yazın.

Google'da aradıktan sonra iki araç buldum pgbarman и arkalık. İlkinde başarılı olamadım (çok seyrek belgeler, her şeyi eski kılavuzlara göre çözmeye çalıştım), ancak ikincisinde belgelerin eşit olduğu ortaya çıktı, ancak kusursuz değil. Benzer bir görevle karşı karşıya kalanların işini kolaylaştırmak için bu makale yazılmıştır.

Bu makaleyi okuduktan sonra artımlı yedeklemeler yapmayı, bunları uzak bir sunucuya (yedeklemelerin bulunduğu depo) kaydetmeyi ve ana sunucuda veri kaybı veya başka sorunlar olması durumunda bunları nasıl geri yükleyeceğinizi öğreneceksiniz.

Eğitim

Kılavuzu çoğaltmak için iki VPS'ye ihtiyacınız olacak. Birincisi depolama (yedeklemelerin depolanacağı depo) ve ikincisi, aslında postgres içeren sunucunun kendisi (benim durumumda postgres'in 11 sürümü) olacaktır.

Postgres'li sunucuda root, sudo kullanıcısı, postgres kullanıcısı ve postgres'in kurulu olduğu (postgresql yüklenirken postgres kullanıcısı otomatik olarak oluşturulur) ve depo sunucusunda root ve sudo kullanıcısının (kılavuzda) olduğu varsayılır. pgbackrest kullanıcı adı kullanılacaktır).

Talimatları yeniden oluştururken daha az sorun yaşamanız için italik yazıyorum komutu nerede, hangi kullanıcıyla ve hangi haklarla yürüttüm makaleyi yazarken ve kontrol ederken.

Pgbackrest'in takılması

Depo (kullanıcı pgbackrest):

1. Arşivi pgbackrest'ten indirin ve içeriğini /build klasörüne aktarın:

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

2. Montaj için gerekli bağımlılıkları kurun:

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

3. Pgbackrest'in montajı:

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

4. Yürütülebilir dosyayı /usr/bin dizinine kopyalayın:

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

5. Pgbackrest perl gerektirir. Düzenlemek:

sudo apt-get install perl

6. Günlükler için dizinler oluşturun ve onlara belirli haklar verin:

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. Kontrol edin:

pgbackrest version

Postgres sunucusu (sudo kullanıcısı veya kök):

Postgres içeren bir sunucuya pgbackrest yükleme işlemi, depodaki kurulum işlemine benzer (evet, pgbackrest her iki sunucuya da kurulmalıdır), ancak 6. paragrafta ikinci ve son komutlar:

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

ile değiştirin:

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

Parolasız SSH aracılığıyla sunucular arasında etkileşim kurma

Pgbackrest'in doğru çalışması için postgres sunucusu ile depo arasındaki etkileşimi anahtar dosyasını kullanarak yapılandırmak gerekir.

Depo (kullanıcı pgbackrest):

Bir anahtar çifti oluşturun:

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

Uyarı! Yukarıdaki komutları sudo olmadan çalıştırıyoruz.

Postgres sunucusu (sudo kullanıcısı veya kök):

Bir anahtar çifti oluşturun:

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

Depo (sudo kullanıcısı):

Postgres sunucusunun genel anahtarını depo sunucusuna kopyalayın:

(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

Bu adımda sizden root kullanıcısının şifresi istenecektir. Postgres sunucusunun root kullanıcısının şifresini girmeniz gerekiyor!

Postgres sunucusu (sudo kullanıcısı):

Depo ortak anahtarını postgres ile sunucuya kopyalayın:

(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

Bu adımda sizden root kullanıcısının şifresi istenecektir. Deponun kök kullanıcısının şifresini tam olarak girmeniz gerekiyor!

Kontrol ediyoruz:

Depo (deneyin saflığı için kök kullanıcı):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Postgres sunucusu (deneyin saflığı için kök kullanıcı):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Sorunsuz bir şekilde erişim sağladığımızdan emin oluyoruz.

Postgres sunucusu kurma

Postgres sunucusu (sudo kullanıcısı veya kök):

1. Postgres sunucusunun harici IP'lerden çalınmasına izin verelim. Bunu yapmak için dosyayı düzenleyin postgresql.conf (/etc/postgresql/11/main klasöründe bulunur), buna satırı ekleyerek:

listen_addresses = '*'

Böyle bir satır zaten mevcutsa, açıklamayı kaldırın veya parametre değerini '*' olarak ayarlayın.

Dosyada pg_hba.conf (ayrıca klasörde bulunur) /etc/postgresql/11/main) aşağıdaki satırları ekleyin:

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

burada:

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

2. Gerekli ayarları yapalım. postgresql.conf (klasörde var /etc/postgresql/11/main) pgbackrest'in çalışması için:

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

3. pgbackrest konfigürasyon dosyasında (/etc/pgbackrest/pgbackrest.conf) gerekli ayarları yapalım:

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

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

4. Postgresql'i yeniden yükleyin:

sudo service postgresql restart

Bir depo sunucusu kurma

Depo (pgbackrest kullanıcısı):

Konfigürasyon dosyasında gerekli ayarları yapalım arkalık
(/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

Depo oluşturma

Depo (pgbackrest kullanıcısı):

Küme için yeni bir depolama alanı oluşturun ana:

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

Kontrol

Postgres sunucusu (sudo kullanıcısı veya kök):

Postgres sunucusunu kontrol ediyoruz:

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

Depo (pgbackrest kullanıcısı):

Depo sunucusunu kontrol ediyoruz:

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

Çıktıda “komut sonu kontrolü: başarıyla tamamlandı” satırını gördüğümüzden emin oluyoruz.

Yorgun? Gelelim en ilginç kısma.

Yedekleme yapma

Depo (pgbackrest kullanıcısı):

1. Yedekleme yapın:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Bir yedeklemenin oluşturulduğundan emin olun:

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

Pgbackrest ilk tam yedeği oluşturacaktır. Dilerseniz yedekleme komutunu tekrar çalıştırıp sistemin artımlı yedekleme oluşturmasını sağlayabilirsiniz.

Tekrar tam yedekleme yapmak istiyorsanız ek bir bayrak belirtin:

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

Ayrıntılı konsol çıktısı istiyorsanız şunu da belirtin:

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

Bir yedeği geri yükleme

Postgres sunucusu (sudo kullanıcısı veya kök):

1. Çalışan kümeyi durdurun:

sudo pg_ctlcluster 11 main stop

2. Yedekten geri yükleme:

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

Veritabanını son FULL yedeklemenin durumuna geri yüklemek için, Recovery_target belirtmeden komutu kullanın:

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

Önemli! Kurtarma işleminden sonra, veritabanı kurtarma modunda takılıp kalabilir (ERROR: salt okunur bir işlemde DROP DATABASE çalıştırılamıyor gibi hatalar olacaktır). Dürüst olmak gerekirse bunun neyle bağlantılı olduğunu henüz anlamadım. Çözüm şu şekildedir (komut yürütüldükten sonra biraz beklemeniz gerekecektir):

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

Aslında belirli bir yedeği adına göre geri yüklemek mümkündür. buradayım sadece Belgelerde bu özelliğin açıklamasına bir bağlantı vereceğim. Geliştiriciler bu seçeneğin dikkatli kullanılmasını tavsiye ediyor ve nedenini açıklıyor. Kullandığımı kendimden ekleyebilirim. Gerçekten ihtiyacınız varsa, kurtarma işleminden sonra veritabanının kurtarma modundan çıktığından emin olun (pg_is_in_recovery() öğesini seçin, “f” göstermelidir) ve her ihtimale karşı, kurtarma sonrasında tam bir yedekleme yapın.

3. Kümeyi başlatın:

sudo pg_ctlcluster 11 main start

Yedeklemeyi geri yükledikten sonra ikinci bir yedekleme yapmamız gerekiyor:

Depo (pgbackrest kullanıcısı):

sudo pgbackrest --stanza=main backup

Bu kadar. Sonuç olarak hiçbir şekilde kıdemli bir veritabanı yöneticisi gibi davranmaya çalışmadığımı ve en ufak fırsatta bulutları kullanacağımı hatırlatmak isterim. Şu anda yedekleme, replikasyon, izleme vb. çeşitli konuları kendim incelemeye başlıyorum. topluluğa küçük bir katkı sağlamak ve kendime küçük notlar bırakmak için sonuçlarla ilgili küçük raporlar yazıyorum.

Sonraki makalelerde ek özelliklerden bahsetmeye çalışacağım - temiz bir kümeye veri kurtarma, yedeklemelerin şifrelenmesi ve S3'e yayınlanması, rsync aracılığıyla yedeklemeler.

Kaynak: habr.com

Yorum ekle