pgbackrest உடன் அதிகரிக்கும் postgresql காப்புப்பிரதிகள் - டெவலப்பரிடமிருந்து ஒரு இளம் போராளிக்கான பாடநெறி

மறுப்பு

நான் ஒரு டெவலப்பர். நான் குறியீட்டை எழுதுகிறேன் மற்றும் ஒரு பயனராக மட்டுமே தரவுத்தளத்துடன் தொடர்பு கொள்கிறேன். எந்த விதத்திலும் நான் ஒரு சிஸ்டம் அட்மினிஸ்ட்ரேட்டராக நடிக்கவில்லை, மிகக் குறைவான டிபிஏ. ஆனாலும்…

postgresql தரவுத்தளத்தின் காப்புப்பிரதியை நான் ஒழுங்கமைக்க வேண்டியிருந்தது. மேகங்கள் இல்லை - SSH ஐப் பயன்படுத்தி, பணம் கேட்காமல் எல்லாம் செயல்படுவதை உறுதிசெய்யவும். இதுபோன்ற சந்தர்ப்பங்களில் நாம் என்ன செய்வது? அது சரி, நாங்கள் pgdump ஐ கிரானில் தள்ளுகிறோம், ஒவ்வொரு நாளும் காப்பகத்திற்கு எல்லாவற்றையும் காப்புப் பிரதி எடுக்கிறோம், மேலும் நாம் முற்றிலும் தொலைந்துவிட்டால், இந்தக் காப்பகத்தை எங்காவது தொலைவில் அனுப்புவோம்.

இந்த முறை சிரமம் என்னவென்றால், திட்டங்களின்படி, தரவுத்தளம் ஒரு நாளைக்கு சுமார் +- 100 MB வரை வளர வேண்டும். நிச்சயமாக, இரண்டு வாரங்களுக்குப் பிறகு, எல்லாவற்றையும் pgdump உடன் காப்புப் பிரதி எடுக்க ஆசை மறைந்துவிடும். இங்குதான் அதிகரிக்கும் காப்புப்பிரதிகள் மீட்புக்கு வருகின்றன.

சுவாரஸ்யமானதா? பூனைக்கு வரவேற்கிறோம்.

அனைத்து மூலக் கோப்புகளும் நகலெடுக்கப்படாமல், புதியவை மற்றும் முந்தைய நகலை உருவாக்கியதிலிருந்து மாற்றப்பட்டவை மட்டுமே அதிகரிக்கும் காப்புப்பிரதியின் ஒரு வகை.

போஸ்ட்கிரெஸின் நுணுக்கங்களைப் புரிந்து கொள்ள முற்றிலும் விருப்பமில்லாத (அந்த நேரத்தில்) எந்த டெவலப்பரைப் போலவே, நான் பச்சை பொத்தானைக் கண்டுபிடிக்க விரும்பினேன். AWS, DigitalOcean இல் உள்ளதைப் போல, உங்களுக்குத் தெரியும்: நீங்கள் ஒரு பொத்தானை அழுத்தினீர்கள் - நீங்கள் பிரதி எடுத்தீர்கள், இரண்டாவதாக அழுத்தினீர்கள் - நீங்கள் காப்புப்பிரதிகளை அமைத்தீர்கள், மூன்றாவது - நீங்கள் எல்லாவற்றையும் இரண்டு மணி நேரம் பின்னுக்குத் தள்ளியுள்ளீர்கள். ஒரு பட்டனையோ அழகான GUI கருவியையோ நான் கண்டுபிடிக்கவில்லை. உங்களுக்கு ஒன்று (இலவசம் அல்லது மலிவானது) தெரிந்தால், அதைப் பற்றி கருத்துகளில் எழுதுங்கள்.

கூகிள் செய்த பிறகு இரண்டு கருவிகளைக் கண்டேன் pgbarman и pgbackrest. நான் முதலில் வெற்றிபெறவில்லை (மிகவும் அரிதான ஆவணங்கள், பழைய கையேடுகளின்படி எல்லாவற்றையும் கண்டுபிடிக்க முயற்சித்தேன்), ஆனால் இரண்டாவதாக ஆவணங்கள் சமமாக மாறியது, ஆனால் குறைபாடுகள் இல்லாமல் இல்லை. இதேபோன்ற பணியை எதிர்கொள்பவர்களின் வேலையை எளிதாக்க, இந்த கட்டுரை எழுதப்பட்டது.

இந்தக் கட்டுரையைப் படித்த பிறகு, அதிகரிக்கும் காப்புப்பிரதிகளை எவ்வாறு உருவாக்குவது, அவற்றை தொலை சேவையகத்தில் (காப்புப்பிரதிகளுடன் கூடிய களஞ்சியம்) சேமிப்பது மற்றும் தரவு இழப்பு அல்லது பிரதான சேவையகத்தில் பிற சிக்கல்கள் ஏற்பட்டால் அவற்றை மீட்டெடுப்பது எப்படி என்பதை நீங்கள் கற்றுக் கொள்வீர்கள்.

பயிற்சி

கையேட்டை மீண்டும் உருவாக்க உங்களுக்கு இரண்டு VPS தேவைப்படும். முதலாவது சேமிப்பகமாக இருக்கும் (காப்புப்பிரதிகள் சேமிக்கப்படும் களஞ்சியம்), மற்றும் இரண்டாவது, உண்மையில், போஸ்ட்கிரெஸுடன் கூடிய சேவையகம் (என் விஷயத்தில், போஸ்ட்கிரெஸின் பதிப்பு 11).

போஸ்ட்கிரெஸ் உள்ள சர்வரில் ரூட், சூடோ யூசர், போஸ்ட்கிரெஸ் யூசர் மற்றும் போஸ்ட்கிரெஸ் தானே நிறுவப்பட்டிருப்பதாக கருதப்படுகிறது (postgresql ஐ நிறுவும் போது postgres பயனர் தானாக உருவாக்கப்படுவார்), மற்றும் களஞ்சிய சர்வரில் ரூட் மற்றும் 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

போஸ்ட்கிரெஸ் சர்வர் (சூடோ பயனர் அல்லது ரூட்):

போஸ்ட்கிரெஸ் கொண்ட சர்வரில் pgbackrest ஐ நிறுவும் செயல்முறை களஞ்சியத்தில் உள்ள நிறுவல் செயல்முறையைப் போன்றது (ஆம், 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 இல்லாமல் இயக்குகிறோம்.

போஸ்ட்கிரெஸ் சர்வர் (சூடோ பயனர் அல்லது ரூட்):

ஒரு முக்கிய ஜோடியை உருவாக்கவும்:

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

களஞ்சியம் (சூடோ பயனர்):

போஸ்ட்கிரெஸ் சேவையகத்தின் பொது விசையை களஞ்சிய சேவையகத்திற்கு நகலெடுக்கவும்:

(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

இந்த கட்டத்தில் ரூட் பயனருக்கான கடவுச்சொல் உங்களிடம் கேட்கப்படும். போஸ்ட்கிரெஸ் சேவையகத்தின் ரூட் பயனரின் கடவுச்சொல்லை உள்ளிட வேண்டும்!

போஸ்ட்கிரெஸ் சர்வர் (சூடோ பயனர்):

போஸ்ட்கிரெஸ் மூலம் சேவையகத்திற்கு களஞ்சிய பொது விசையை நகலெடுக்கவும்:

(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

இந்த கட்டத்தில் ரூட் பயனருக்கான கடவுச்சொல் உங்களிடம் கேட்கப்படும். களஞ்சியத்தின் ரூட் பயனரின் கடவுச்சொல்லை நீங்கள் சரியாக உள்ளிட வேண்டும்!

பார்க்கலாம்:

களஞ்சியம் (ரூட் பயனர், பரிசோதனையின் தூய்மைக்காக):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Postgres சர்வர் (ரூட் பயனர், பரிசோதனையின் தூய்மைக்காக):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

சிக்கல்கள் இல்லாமல் அணுகலைப் பெறுவதை உறுதிசெய்கிறோம்.

போஸ்ட்கிரெஸ் சேவையகத்தை அமைத்தல்

போஸ்ட்கிரெஸ் சர்வர் (சூடோ பயனர் அல்லது ரூட்):

1. வெளிப்புற IPகளில் இருந்து postgres சர்வரில் தட்டுவதை அனுமதிப்போம். இதைச் செய்ய, கோப்பைத் திருத்தவும் 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

ஆய்வு

போஸ்ட்கிரெஸ் சர்வர் (சூடோ பயனர் அல்லது ரூட்):

போஸ்ட்கிரெஸ் சேவையகத்தை நாங்கள் சரிபார்க்கிறோம்:

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

களஞ்சியம் (pgbackrest பயனர்):

களஞ்சிய சேவையகத்தை நாங்கள் சரிபார்க்கிறோம்:

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

வெளியீட்டில் “செக் கமாண்ட் எண்ட்: வெற்றிகரமாக முடிந்தது” என்ற வரியைப் பார்க்கிறோம் என்பதை உறுதிசெய்கிறோம்.

சோர்வாக? மிகவும் சுவாரஸ்யமான பகுதிக்கு செல்லலாம்.

காப்புப்பிரதியை உருவாக்குதல்

களஞ்சியம் (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

காப்புப்பிரதியை மீட்டமைக்கிறது

போஸ்ட்கிரெஸ் சர்வர் (சூடோ பயனர் அல்லது ரூட்):

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

தரவுத்தளத்தை கடைசி முழு காப்புப்பிரதியின் நிலைக்கு மீட்டமைக்க, recovery_target ஐக் குறிப்பிடாமல் கட்டளையைப் பயன்படுத்தவும்:

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

முக்கியமான! மீட்டெடுத்த பிறகு, தரவுத்தளம் மீட்பு பயன்முறையில் சிக்கிக்கொள்ளலாம் (பிழை போன்ற பிழைகள் இருக்கும்: 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

அவ்வளவுதான். முடிவில், நான் எந்த வகையிலும் மூத்த டிபிஏவாக நடிக்க முயற்சிக்கவில்லை என்பதையும், சிறிய வாய்ப்பில் மேகங்களைப் பயன்படுத்துவேன் என்பதையும் உங்களுக்கு நினைவூட்ட விரும்புகிறேன். தற்போது, ​​நானே காப்புப்பிரதி, பிரதி, கண்காணிப்பு போன்ற பல்வேறு தலைப்புகளைப் படிக்கத் தொடங்குகிறேன். மேலும் சமூகத்திற்கு ஒரு சிறிய பங்களிப்பை வழங்குவதற்காகவும், சிறு ஏமாற்றுத் தாள்களை எனக்கே விட்டுச் செல்வதற்காகவும் முடிவுகளைப் பற்றி சிறு அறிக்கைகளை எழுதுகிறேன்.

பின்வரும் கட்டுரைகளில் நான் கூடுதல் அம்சங்களைப் பற்றி பேச முயற்சிப்பேன் - சுத்தமான கிளஸ்டருக்கு தரவு மீட்பு, காப்புப்பிரதிகளின் குறியாக்கம் மற்றும் S3 இல் வெளியிடுதல், rsync வழியாக காப்புப்பிரதிகள்.

ஆதாரம்: www.habr.com

கருத்தைச் சேர்