Nakala za nyongeza za postgresql na pgbackrest - kozi ya mpiganaji mchanga kutoka kwa msanidi

Kanusho

Mimi ni msanidi programu. Ninaandika nambari na kuingiliana na hifadhidata tu kama mtumiaji. Kwa njia yoyote sijifanyi kuwa msimamizi wa mfumo, sembuse dba. Lakini…

Ilifanyika kwamba nilihitaji kupanga nakala rudufu ya hifadhidata ya postgresql. Hakuna mawingu - tumia tu SSH na uhakikishe kuwa kila kitu kinafanya kazi bila kuomba pesa. Tunafanya nini katika hali kama hizi? Hiyo ni kweli, tunasukuma pgdump kwenye cron, kuhifadhi kila kitu kwenye kumbukumbu kila siku, na ikiwa tumepotea kabisa, tunatuma kumbukumbu hii mahali fulani mbali.

Wakati huu ugumu ulikuwa kwamba kulingana na mipango, hifadhidata ilipaswa kukua kwa karibu +- 100 MB kwa siku. Kwa kweli, baada ya wiki chache hamu ya kuhifadhi kila kitu na pgdump itatoweka. Hapa ndipo hifadhi rudufu zinazoongezeka zinakuja kuwaokoa.

Inavutia? Karibu paka.

Nakala ya ziada ni aina ya chelezo wakati si faili zote chanzo zinakiliwa, lakini ni mpya tu na zile zilizobadilishwa tangu kuundwa kwa nakala ya awali.

Kama msanidi programu yeyote ambaye alikuwa hataki KABISA (wakati huo) kuelewa ugumu wa postgres, nilitaka kupata kitufe cha kijani. Unajua, kama katika AWS, DigitalOcean: ulibonyeza kitufe kimoja - ulipata nakala, ulibonyeza ya pili - ulisanidi nakala rudufu, ya tatu - ulirudisha kila kitu nyuma kwa masaa kadhaa. Sikupata kitufe au zana nzuri ya GUI. Ikiwa unajua moja (ya bure au ya bei nafuu), andika juu yake katika maoni.

Baada ya googling nilipata zana mbili pgbarman ΠΈ pgbackrest. Sikufanikiwa na ile ya kwanza (nyaraka chache sana, nilijaribu kubaini kila kitu kulingana na miongozo ya zamani), lakini na ya pili nyaraka ziligeuka kuwa sawa, lakini sio bila dosari. Ili kurahisisha kazi ya wale ambao wanakabiliwa na kazi kama hiyo, nakala hii iliandikwa.

Baada ya kusoma nakala hii, utajifunza jinsi ya kufanya nakala rudufu, zihifadhi kwenye seva ya mbali (hifadhi iliyo na chelezo) na uirejeshe ikiwa utapoteza data au shida zingine kwenye seva kuu.

Mafunzo ya

Ili kuzalisha mwongozo utahitaji VPS mbili. Ya kwanza itakuwa hifadhi (hazina ambayo chelezo zitahifadhiwa), na pili, kwa kweli, seva yenyewe na postgres (kwa upande wangu, toleo la 11 la postgres).

Inachukuliwa kuwa kwenye seva iliyo na postgres unayo mzizi, mtumiaji wa sudo, mtumiaji wa posta na postgres yenyewe imewekwa (mtumiaji wa postgres huundwa kiatomati wakati wa kusanikisha postgresql), na kwenye seva ya kumbukumbu kuna mtumiaji wa mizizi na sudo (kwenye mwongozo. jina la mtumiaji pgbackrest litatumika) .

Ili uwe na shida chache wakati wa kutoa maagizo tena, ninaandika kwa italiki wapi, na mtumiaji gani na kwa haki gani nilitoa amri wakati wa kuandika na kuangalia makala.

Inasakinisha pgbackrest

Hifadhi (pgbackrest ya mtumiaji):

1. Pakua kumbukumbu kutoka pgbackrest na uhamishe yaliyomo kwenye /build folda:

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

2. Sakinisha vitegemezi vinavyohitajika kwa mkusanyiko:

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

3. Kukusanya pgbackrest:

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

4. Nakili faili inayoweza kutekelezwa kwenye saraka ya /usr/bin:

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

5. Pgbackrest inahitaji perl. Sakinisha:

sudo apt-get install perl

6. Unda saraka za kumbukumbu, zipe haki fulani:

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. Angalia:

pgbackrest version

Seva ya Postgres (mtumiaji wa sudo au mzizi):

Mchakato wa kusakinisha pgbackrest kwenye seva iliyo na postgres ni sawa na usakinishaji kwenye hazina (ndio, pgbackrest lazima iwekwe kwenye seva zote mbili), lakini katika aya ya 6 amri ya pili na ya mwisho:

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

badilisha na:

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

Kuanzisha mwingiliano kati ya seva kupitia SSH isiyo na nenosiri

Ili pgbackrest ifanye kazi kwa usahihi, inahitajika kusanidi mwingiliano kati ya seva ya posta na hazina kwa kutumia faili muhimu.

Hifadhi (pgbackrest ya mtumiaji):

Unda jozi muhimu:

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

Attention! Tunaendesha amri hapo juu bila sudo.

Seva ya Postgres (mtumiaji wa sudo au mzizi):

Unda jozi muhimu:

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

Hifadhi (mtumiaji wa sudo):

Nakili ufunguo wa umma wa seva ya posta kwenye seva ya hazina:

(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

Katika hatua hii utaulizwa nenosiri kwa mtumiaji wa mizizi. Unahitaji kuingiza nenosiri la mtumiaji wa mizizi ya seva ya postgres!

Seva ya Postgres (mtumiaji wa sudo):

Nakili ufunguo wa umma wa hazina kwa seva na 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

Katika hatua hii utaulizwa nenosiri kwa mtumiaji wa mizizi. Unahitaji kuingiza nywila haswa ya mtumiaji wa mizizi ya hazina!

Tunaangalia:

Hifadhi (mtumiaji wa mizizi, kwa usafi wa jaribio):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Seva ya Postgres (mtumiaji wa mizizi, kwa usafi wa jaribio):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Tunahakikisha kwamba tunapata ufikiaji bila matatizo.

Kuanzisha seva ya posta

Seva ya Postgres (mtumiaji wa sudo au mzizi):

1. Hebu turuhusu kugonga kwenye seva ya postgres kutoka kwa IP za nje. Ili kufanya hivyo, hariri faili postgresql.conf (iko kwenye /etc/postgresql/11/main folda), na kuongeza mstari kwake:

listen_addresses = '*'

Ikiwa mstari kama huo tayari upo, iondoe au uweke thamani ya kigezo kama '*'.

Katika faili pg_hba.conf (pia iko kwenye folda /etc/postgresql/11/main) ongeza mistari ifuatayo:

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

ambapo:

hostssl/host - ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡΡ Ρ‡Π΅Ρ€Π΅Π· SSL (ΠΈΠ»ΠΈ Π½Π΅Ρ‚)
all - Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎ всСм Π±Π°Π·Π°ΠΌ
all - имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ (всСм)
0.0.0.0/0 - маска сСти с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ
md5 - способ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ пароля

2. Hebu tufanye mipangilio muhimu ndani postgresql.conf (iko kwenye folda /etc/postgresql/11/main) kwa pgbackrest kufanya kazi:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Π“Π΄Π΅ main - Π½Π°Π·Π²Π°Π½ΠΈΠ΅ кластСра. ΠŸΡ€ΠΈ установкС postgres автоматичСски создаСт кластСр main.
archive_mode = on
max_wal_senders = 3
wal_level = replica

3. Hebu tufanye mipangilio muhimu katika faili ya usanidi ya pgbackrest (/etc/pgbackrest/pgbackrest.conf):

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

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

4. Pakia upya postgresql:

sudo service postgresql restart

Kuweka seva ya hifadhi

Hifadhi (mtumiaji wa pgbackrest):

Hebu tufanye mipangilio muhimu katika faili ya usanidi 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

Kuunda hifadhi

Hifadhi (mtumiaji wa pgbackrest):

Unda hifadhi mpya ya nguzo kuu:

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

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°

Seva ya Postgres (mtumiaji wa sudo au mzizi):

Tunaangalia seva ya postgres:

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

Hifadhi (mtumiaji wa pgbackrest):

Tunaangalia seva ya kumbukumbu:

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

Tunahakikisha kwamba katika pato tunaona mstari "angalia mwisho wa amri: imekamilika kwa mafanikio".

Umechoka? Wacha tuendelee kwenye sehemu ya kuvutia zaidi.

Kufanya chelezo

Hifadhi (mtumiaji wa pgbackrest):

1. Tekeleza nakala rudufu:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Hakikisha kwamba nakala rudufu imeundwa:

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

Pgbackrest itaunda chelezo kamili ya kwanza. Ikiwa unataka, unaweza kuendesha amri ya chelezo tena na uhakikishe kuwa mfumo huunda nakala rudufu.

Ikiwa unataka kufanya nakala kamili tena, basi taja bendera ya ziada:

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

Ikiwa unataka pato la kina la koni, basi pia taja:

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

Inarejesha nakala rudufu

Seva ya Postgres (mtumiaji wa sudo au mzizi):

1. Acha nguzo inayoendesha:

sudo pg_ctlcluster 11 main stop

2. Kurejesha kutoka kwa chelezo:

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

Ili kurejesha hifadhidata katika hali ya chelezo FULL ya mwisho, tumia amri bila kubainisha recovery_target:

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

Muhimu! Baada ya urejeshaji, inaweza kutokea kwamba hifadhidata inakwama katika hali ya uokoaji (kutakuwa na makosa kama ERROR: haiwezi kutekeleza DROP DATABASE katika muamala wa kusoma tu). Kwa kuwa mkweli, bado sijaelewa hii inahusiana na nini. Suluhisho ni kama ifuatavyo (utahitaji kusubiri kidogo baada ya amri kutekelezwa):

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

Kwa kweli, inawezekana kurejesha salama maalum kwa jina lake. Hapa nipo tu Nitatoa kiunga cha maelezo ya kipengele hiki kwenye hati. Watengenezaji wanashauri kutumia chaguo hili kwa tahadhari na kueleza kwa nini. Ninaweza kuongeza kutoka kwangu kuwa niliitumia. Ikiwa unahitaji kweli, hakikisha kwamba baada ya kurejesha hifadhidata inaondoka kwenye hali ya kurejesha (chagua pg_is_in_recovery() inapaswa kuonyesha "f") na, ikiwa tu, fanya salama kamili baada ya kurejesha.

3. Anzisha nguzo:

sudo pg_ctlcluster 11 main start

Baada ya kurejesha nakala rudufu, tunahitaji kufanya nakala rudufu ya pili:

Hifadhi (mtumiaji wa pgbackrest):

sudo pgbackrest --stanza=main backup

Ni hayo tu. Kwa kumalizia, ningependa kuwakumbusha kwamba sijaribu kwa vyovyote kujifanya kuwa dba mkuu na nitatumia mawingu kwa fursa yoyote ile. Hivi sasa, mimi mwenyewe naanza kusoma mada anuwai kama vile chelezo, urudufishaji, ufuatiliaji, n.k. na ninaandika ripoti ndogo kuhusu matokeo ili kutoa mchango mdogo kwa jamii na kuacha karatasi ndogo za kudanganya kwa ajili yangu.

Katika makala zifuatazo nitajaribu kuzungumza juu ya vipengele vya ziada - kurejesha data kwenye nguzo safi, usimbaji fiche wa chelezo na uchapishaji kwa S3, chelezo kupitia rsync.

Chanzo: mapenzi.com

Kuongeza maoni