Sida aan ugu isticmaalnay ku celcelinta caajiska ah ee ka soo kabashada musiibada ee PostgreSQL

Sida aan ugu isticmaalnay ku celcelinta caajiska ah ee ka soo kabashada musiibada ee PostgreSQL
Ku-noqoshada ma ahan kayd. Ama maya? Waa kan sida aan u isticmaalnay ku celcelinta dib u dhigista si aan uga soo kabsano tirtirida shilalka gaaban

Xirfadlayaasha kaabayaasha dhaqaalaha GitLab ayaa mas'uul ka ah shaqada GitLab.com - Tusaalaha ugu weyn ee GitLab ee dabiiciga ah. Isticmaalayaasha 3 milyan iyo ku dhawaad ​​​​7 milyan oo mashruuc, waa mid ka mid ah meelaha ugu waaweyn ee furan ee SaaS oo leh qaabdhismeed gaar ah. La'aanteed nidaamka xogta PostgreSQL, kaabayaasha GitLab.com ma aadi doono meel fog, maxaan sameyneynaa si aan u hubinno dulqaadka qaladka haddii ay dhacdo wax kasta oo guul-darreysan marka xogta la lumin karo. Uma badna in masiibadan oo kale ay dhacdo, laakiin si fiican ayaanu ugu diyaargaroobanay waxaanan ku kaydsannay habab kala duwan oo gurmad ah iyo soo-celin.

Ku-noqoshada maaha hab lagu kaydiyo xogta xogta (hoos eeg). Laakiin hadda waxaan arki doonaa sida degdeg ah loogu soo kabsado xogta shil la tirtiray iyadoo la isticmaalayo ku celcelin caajis ah: on GitLab.com isticmaalaha tiray jid-gaabkii mashruuca gitlab-ce oo lumay xiriirkii codsiyada isku darka iyo hawlaha.

nuqul dib loo dhigay, waxaanu ku soo ceshanay xogta 1,5 saacadood gudahood. Bal eeg sida ay wax u dhaceen.

Barta wakhtiga soo kabashada ee PostgreSQL

PostgreSQL waxay leedahay hawl ku dhex jirta oo dib u soo celisa xaalada kaydka meel cayiman oo wakhti ah. Waxaa la yiraahdaa Soo kabashada-Waqtiga-in-Waqtiga (PITR) oo adeegsada isla habab isku mid ah oo nuqul ka dhigaya mid casri ah: laga bilaabo sawir la isku halayn karo ee dhammaan kutlada kaydka xogta (base Backup), waxaanu isticmaalnaa isbeddello dawladeed oo taxane ah ilaa wakhti go'an.

Si aan u isticmaalno sifadan kaydka qabow, waxaanu si joogto ah u samaynaa kaydka xogta aasaasiga ah waxaanu ku kaydinnaa kaydka (GitLab archives ayaa ku nool Kaydinta daruuraha Google). Waxaan sidoo kale la soconaa isbedelada ku dhaca xogta xogta anagoo kaydinayna qoraalka horeqoraal-hore, WAL). Iyadoo waxaas oo dhami ay jiraan, waxaan samayn karnaa PITR soo kabashada musiibada: laga bilaabo sawirka la qaaday ka hor fashilka, iyo adeegsiga isbeddelada kaydka WAL ilaa guuldarada.

Waa maxay ku celcelinta dib loo dhigay?

Ku-noqoshada caajiska ah waa codsiga isbedelada WAL ee leh dib u dhac. Taasi waa, macaamilku wuxuu dhacay saacad gudaheed X, laakiin waxay ka soo muuqan doontaa nuqulka iyadoo daahsan d saacad gudaheed X + d.

PostgreSQL waxay leedahay 2 siyaabood oo lagu dejiyo nuqulka xogta jirka: dib u soo kabashada iyo ku celcelinta qulqulka. Ka soo celinta kaydka, asal ahaan waxa uu u shaqeeyaa sida PITR, laakiin si joogto ah: waxaanu si joogto ah uga soo saarnaa isbeddelada kaydka WAL oo aanu ku dabaqno nuqulka. A ku celcelinta qulqulka Waxay si toos ah uga soo ceshanayaan qulqulka WAL ee kaydiyaha kaydka ee kor u kaca. Waxaan doorbideynaa soo kabashada kaydka - way fududahay in la maareeyo oo waxay leedahay waxqabad caadi ah oo la socda kooxda wax soo saarka.

Sida loo dejiyo soo kabashada daahday ee kaydka

Doorashooyinka soo kabashada lagu sharaxay faylka recovery.conf. Tusaale:

standby_mode = 'on'
restore_command = '/usr/bin/envdir /etc/wal-e.d/env /opt/wal-e/bin/wal-e wal-fetch -p 4 "%f" "%p"'
recovery_min_apply_delay = '8h'
recovery_target_timeline = 'latest'

Halbeegyadan, waxaan ku habeynay nuqul dib loo dhigay oo leh dib u soo kabasho. Halkan waxaa loo isticmaalaa wal-e si loo soo saaro qaybaha WAL (restore_commandlaga bilaabo kaydka, iyo isbeddelada ayaa lagu dabaqi doonaa siddeed saacadood ka dib (recovery_min_apply_delay). Nuqulku waxa uu daawan doonaa isbeddelada wakhtiga ee kaydka, tusaale ahaan sababta oo ah kutlada fashilantay (recovery_target_timeline).

С recovery_min_apply_delay Waxaad dejin kartaa ku celcelinta qulqulka dib u dhac, laakiin waxaa jira dhawr godad oo halkan la xidhiidha boosaska ku celcelinta, jawaab celinta heeganka kulul, iyo wixii la mid ah. Kaydka WAL wuxuu kuu ogolaanayaa inaad iska ilaaliso.

Xildhibaan recovery_min_apply_delay Ka soo muuqday kaliya PostgreSQL 9.3. Noocyadii hore, ku celcelinta dib loo dhigay waxaad u baahan tahay inaad habayso isku darka hawlaha maaraynta soo kabashada (pg_xlog_replay_pause(), pg_xlog_replay_resume()) ama ku hay qaybaha WAL ee kaydka muddada daahitaanka.

Sidee PostgreSQL u sameeyaa tan?

Waxaa xiiso leh in la arko sida PostgreSQL u hirgeliso soo kabashada caajiska ah. Aan eegno recoveryApplyDelay(XlogReaderState). Waxaa laga soo wacaa loop soo celinta ugu weyn gelitaanka kasta ee WAL.

static bool
recoveryApplyDelay(XLogReaderState *record)
{
    uint8       xact_info;
    TimestampTz xtime;
    long        secs;
    int         microsecs;

    /* nothing to do if no delay configured */
    if (recovery_min_apply_delay <= 0)
        return false;

    /* no delay is applied on a database not yet consistent */
    if (!reachedConsistency)
        return false;

    /*
     * Is it a COMMIT record?
     *
     * We deliberately choose not to delay aborts since they have no effect on
     * MVCC. We already allow replay of records that don't have a timestamp,
     * so there is already opportunity for issues caused by early conflicts on
     * standbys.
     */
    if (XLogRecGetRmid(record) != RM_XACT_ID)
        return false;

    xact_info = XLogRecGetInfo(record) & XLOG_XACT_OPMASK;

    if (xact_info != XLOG_XACT_COMMIT &&
        xact_info != XLOG_XACT_COMMIT_PREPARED)
        return false;

    if (!getRecordTimestamp(record, &xtime))
        return false;

    recoveryDelayUntilTime =
        TimestampTzPlusMilliseconds(xtime, recovery_min_apply_delay);

    /*
     * Exit without arming the latch if it's already past time to apply this
     * record
     */
    TimestampDifference(GetCurrentTimestamp(), recoveryDelayUntilTime,
                        &secs, &microsecs);
    if (secs <= 0 && microsecs <= 0)
        return false;

    while (true)
    {
        // Shortened:
        // Use WaitLatch until we reached recoveryDelayUntilTime
        // and then
        break;
    }
    return true;
}

Xariiqda hoose ayaa ah in dib u dhacu uu ku saleysan yahay waqtiga jir ahaaneed ee lagu diiwaan galiyay waqtiyada wax kala iibsigaxtime). Sida aad arki karto, daahitaanku waxay khuseeyaan oo kaliya inay galaan oo ma saameeyaan gelitaannada kale - dhammaan isbeddelada si toos ah ayaa loo dabaqaa, ballan-qaadkuna waa dib loo dhigay, markaa waxaan arki doonnaa oo keliya isbeddellada ka dib daahitaanka habaysan.

Sida loo isticmaalo nuqulka daahsan si loo soo celiyo xogta

Aynu nidhaahno waxaanu haynaa koox xog ururin ah iyo nuqul leh dib u dhac siddeed saacadood ah oo wax soo saar ah. Aan aragno sida loo soo kabsado xogta isticmaalaya tusaale si lama filaan ah u tirtiraya jid-gaabyada.

Markaan ogaanay dhibaatada, waxaan soo celinta kaydka waa la hakiyay nuqul dib loo dhigay:

SELECT pg_xlog_replay_pause();

Hakinta, wax khatar ah uma lihin in nuqulku uu ku celiyo codsiga DELETE. Wax faa'iido leh haddii aad u baahan tahay wakhti aad ku qiyaasto wax walba.

Ujeedadu waa in nuqulka dib loo dhigay uu gaaro wakhtiga ka horeeya codsiga DELETE. Waxaan ku dhawaad ​​naqaanay wakhtiga raritaanka. Waanu tirtirnay recovery_min_apply_delay oo ku daray recovery_target_time в recovery.conf. Sidani waa sida nuqulku u gaadho wakhtiga saxda ah iyada oo aan dib loo dhigin:

recovery_target_time = '2018-10-12 09:25:00+00'

Wakhtiga shaambada, waxa fiican in la yareeyo xad-dhaafka si aanay u seegin. Run ahaantii, inta badan hoos u dhaca, xogta badan ee aan lumino. Mar labaad, haddii aan seegno codsiga DELETE, wax walba mar kale ayaa la tirtiri doonaa oo waa inaad dib u bilowdo (ama xitaa kayd qabow u qaado PITR).

Waxaan dib u bilownay tusaalaha Postgres ee dib loo dhigay waxaana qaybaha WAL lagu soo celiyay ilaa wakhtiga la cayimay. Waxaad la socon kartaa horumarka marxaladan adigoo waydiinaya:

SELECT
  -- current location in WAL
  pg_last_xlog_replay_location(),
  -- current transaction timestamp (state of the replica)
  pg_last_xact_replay_timestamp(),
  -- current physical time
  now(),
  -- the amount of time still to be applied until recovery_target_time has been reached
  '2018-10-12 09:25:00+00'::timestamptz - pg_last_xact_replay_timestamp() as delay;

Haddii shaambada wakhtigu aanu isbeddelin, soo kabashadu waa dhammaatay. Ficil waa la habeyn karaa recovery_target_actionin la xidho, kor u qaado, ama hakiyo tusaalaha ka dib marka dib la isku dayo (waa la hakiyey si caadi ah).

Xogta kaydku waxay ku soo noqotay xaaladeeda ka hor codsigaas nasiib darada ah. Hadda waxaad awoodaa, tusaale ahaan, xogta dhoofinta Waxaan dhoofinay xogta summada ee la tirtiray iyo dhammaan xiriirinta arrimaha iyo isku darka codsiyada waxaanan u rarnay kaydka xogta wax soo saarka. Haddii khasaaruhu uu baaxad weyn yahay, waxaad si fudud kor ugu qaadi kartaa nuqulka oo aad u isticmaali kartaa midda ugu weyn. Laakiin markaa dhammaan isbeddellada ka dib barta aan ka soo kabsanay way lumi doonaan.

Halkii laga heli lahaa calaamadaha wakhtiga, waxa fiican in la isticmaalo aqoonsiga wax kala iibsiga. Way faa'iido leedahay in la duubo aqoonsigan, tusaale ahaan, bayaanada DDL (sida DROP TABLE), iyadoo la isticmaalayo log_statements = 'ddl'. Haddii aan haysano aqoonsiga wax kala iibsiga, waan qaadan lahayn recovery_target_xid oo wax walba ku orday wax kala iibsiga ka hor codsiga DELETE.

Ku soo noqoshada shaqada waa mid aad u fudud: ka saar dhammaan isbeddellada recovery.conf oo dib u bilow Postgres. Nuqulka waxa uu mar kale dib u dhigi doonaa sideed saacadood, waxaanan u diyaargaroobnay dhibaatooyinka mustaqbalka.

Faa'iidooyinka soo kabashada

Nuqul dib loo dhigay halkii aad ka heli lahayd kayd qabow, uma baahnid inaad saacado ku qaadato dib u soo celinta sawirka oo dhan kaydka. Tusaale ahaan, waxay nagu qaadanaysaa shan saacadood si aan u helno dhammaan kaydinta 2 TB ee aasaasiga ah. Kadibna wali waa inaad dalbataa dhammaan WAL-ka maalinlaha ah si aad ugu soo kabato gobolka la rabo (xaaladda ugu xun).

Nuqulka dib loo dhigay ayaa ka fiican kaydka qabow laba siyaabood:

  1. Looma baahna in dhammaan kaydka aasaasiga ah laga saaro kaydka.
  2. Waxaa jira daaqad siddeed saacadood ah oo go'an oo ah qaybaha WAL oo ay tahay in lagu celiyo.

Waxaan sidoo kale si joogto ah u hubinaa si aan u aragno inay suurtagal tahay in PITR laga sameeyo WAL, waxaananu si dhakhso ah u ogaan doonnaa musuqmaasuqa ama dhibaatooyinka kale ee kaydka WAL annagoo la soconna habacsanaanta nuqulka dib loo dhigay.

Tusaalahan, waxay nagu qaadatay 50 daqiiqo inaan soo celino, taasoo la micno ah in xawaaruhu ahaa 110 GB ee xogta WAL saacaddii ( kaydku weli wuu shidnaa. AWS S3). Wadar ahaan, waxaan xallinay dhibaatada waxaanan soo kabsannay xogta 1,5 saacadood.

Natiijooyinka: halka nuqulka dib loo dhigay uu faa'iido leeyahay (iyo halka aanu ahayn)

Isticmaal ku celcelinta daahday sida gargaarka koowaad haddii aad si lama filaan ah u lumisay xogta oo aad ku aragtay dhibaatadan daahitaanka la habeeyey.

Laakin maskaxda ku hay: ku celcelintu maaha kayd.

Kaabta iyo ku celcelintu waxay leeyihiin ujeedooyin kala duwan. Kaydka qabow ayaa ku anfici doona haddii aad si lama filaan ah u samaysay DELETE ama DROP TABLE. Waxaanu ka samaynaa kaydka kaydinta qabow oo aanu soo celinayna xaaladii hore ee miiska ama xogta xogta oo dhan. Laakin isla markaas codsiga DROP TABLE waxay ku dhowdahay isla markiiba in lagu soo saaro dhammaan nuqullada ku jira kooxda shaqada, sidaas awgeed ku-celinta caadiga ah halkan kama caawin doonto. Ku-noqoshada lafteedu waxay haysaa kaydka xogta marka server-yada gaarka ah la kiraysto oo la qaybiyo culayska.

Xataa nuqul dib loo dhigay, waxaan mararka qaarkood runtii u baahanahay kayd qabow meel nabdoon haddii xarun xogeed fashilanto, burbur qarsoon, ama dhacdooyin kale oo aan isla markiiba la dareemin ay dhacaan. Ku-noqoshada oo keliya halkan wax faa'iido ah ma leh.

tacliiq. On GitLab.com Hadda waxaan kaliya ka ilaalinaa luminta xogta heerka nidaamka mana soo kabsaneyno xogta heerka isticmaalaha.

Source: www.habr.com

Add a comment