Momwe Tidagwiritsira Ntchito Kubwereza Kwaulesi Pakubwezeretsa Masoka ndi PostgreSQL

Momwe Tidagwiritsira Ntchito Kubwereza Kwaulesi Pakubwezeretsa Masoka ndi PostgreSQL
Kubwereza sikusunga zosunga zobwezeretsera. Kapena osati? Umu ndi momwe tidagwiritsira ntchito kubwereza kochedwetsa kuti tipezenso njira zazifupi mwangozi.

Akatswiri a zomangamanga GitLab imayang'anira ntchitoyi GitLab.com - chitsanzo chachikulu kwambiri cha GitLab m'chilengedwe. Ndi ogwiritsa ntchito 3 miliyoni komanso mapulojekiti pafupifupi 7 miliyoni, ndi amodzi mwamasamba akulu kwambiri a SaaS omwe ali ndi zomanga zodzipatulira. Popanda dongosolo la database la PostgreSQL, zida za GitLab.com sizingapite patali, ndipo tikuchita chiyani kuti tiwonetsetse kulekerera zolakwika pakalephera pomwe deta itayika. Ndizokayikitsa kuti tsoka loterolo lichitika, koma ndife okonzeka bwino ndikusungidwa ndi njira zingapo zosunga zobwezeretsera ndi kubwereza.

Kubwerezanso si njira yosungira nkhokwe (Onani pansipa). Koma tsopano tiwona momwe mungabwezeretsere mwachangu deta yochotsedwa mwangozi pogwiritsa ntchito kubwereza kwaulesi: pa GitLab.com wogwiritsa ntchito adachotsa njira yachidule za polojekitiyi gitlab-ce ndi kutayika kolumikizana ndi kuphatikiza zopempha ndi ntchito.

Ndi chifaniziro chochedwetsedwa, tidapezanso zambiri m'maola 1,5 okha. Taonani momwe izo zinachitikira.

Lozani mu nthawi yochira ndi PostgreSQL

PostgreSQL ili ndi ntchito yomangidwira yomwe imabwezeretsanso chikhalidwe cha database ku nthawi inayake. Amatchedwa Point-in-Time Recovery (PITR) ndipo amagwiritsa ntchito njira zomwezo zomwe zimasunga chithunzichi kukhala chamakono: kuyambira ndi chithunzithunzi chodalirika cha gulu lonse la database (base backup), timagwiritsa ntchito mndandanda wa kusintha kwa boma mpaka nthawi inayake.

Kuti tigwiritse ntchito izi posunga zoziziritsa kukhosi, timasunga zosunga zobwezeretsera nthawi zonse ndikuzisunga munkhokwe (zosunga zakale za GitLab zimakhalamo. Google Cloud yosungirako). Timayang'aniranso kusintha kwa malo osungirako zinthuzo posunga zolemba zolembera kutsogolo (kulemba-patsogolo chipikaPA, WAL). Ndipo ndi zonsezi, tikhoza kuchita PITR kuti tichitenso tsoka: kuyambira ndi chithunzithunzi chomwe chinatengedwa chisanachitike, ndikugwiritsanso ntchito zosintha kuchokera ku WAL archive mpaka kulephera.

Kodi kubwerezedwa kochedwetsedwa ndi chiyani?

Kubwereza kwaulesi ndiko kugwiritsa ntchito zosintha kuchokera ku WAL ndikuchedwa. Ndiko kuti, kugulitsako kunachitika mu ola limodzi X, koma idzawonekera pachifaniziro ndi kuchedwa d mu ola limodzi X + d.

PostgreSQL ili ndi njira ziwiri zokhazikitsira choyimira cha database: kubwezeretsa zosunga zobwezeretsera ndi kubwerezabwereza. Kubwezeretsa kuchokera kumalo osungira, imagwira ntchito ngati PITR, koma mosalekeza: timapeza zosintha kuchokera ku WAL zakale ndikuziyika pachifanizirocho. A kubwerezabwereza imabweretsa mwachindunji mtsinje wa WAL kuchokera kumtunda wa database host host. Timakonda kubwezeretsa zakale - ndikosavuta kuwongolera komanso kumakhala ndi magwiridwe antchito omwe amayenderana ndi gulu lopanga.

Momwe mungakhazikitsire kuchira kochedwa kuchokera ku archive

Kubwezeretsa Zosankha zofotokozedwa mu fayilo recovery.conf. Chitsanzo:

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'

Ndi magawo awa, tidakonza chofananira chosinthidwa ndikubwezeretsa zosunga zobwezeretsera. Apa amagwiritsidwa ntchito wal-e kuchotsa zigawo za WAL (restore_command) kuchokera pazosungidwa, ndipo zosintha zidzagwiritsidwa ntchito pakatha maola asanu ndi atatu (recovery_min_apply_delay). Choyimiracho chidzawona kusintha kwa nthawi muzosungirako, mwachitsanzo chifukwa cha kulephera kwa gulu (recovery_target_timeline).

Π‘ recovery_min_apply_delay Mutha kukhazikitsa kubwereza kobwereza ndikuchedwa, koma pali misampha ingapo pano yomwe ikugwirizana ndi mipata yobwerezabwereza, mayankho otentha oyimilira, ndi zina zotero. Zosungidwa za WAL zimakulolani kuti mupewe.

chizindikiro recovery_min_apply_delay adangowonekera mu PostgreSQL 9.3. M'matembenuzidwe am'mbuyomu, pakubwereza kochedwetsa muyenera kukonza kuphatikiza ntchito zowongolera kuchira (pg_xlog_replay_pause(), pg_xlog_replay_resume()) kapena sungani magawo a WAL m'malo osungira nthawi yonseyi.

Kodi PostgreSQL imachita bwanji izi?

Ndizosangalatsa kuwona momwe PostgreSQL imagwiritsira ntchito kuchira kwaulesi. Tiyeni tione recoveryApplyDelay(XlogReaderState). Imatchedwa kuchokera main repeat loop pakulowa kulikonse kuchokera ku 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;
}

Chofunikira ndichakuti kuchedwaku kumatengera nthawi yomwe yalembedwa mu sitepe ya nthawi ya transaction (xtime). Monga mukuwonera, kuchedwa kumangogwira ntchito pazochita zokha ndipo sizikhudza zolemba zina - zosintha zonse zimayikidwa mwachindunji, ndipo kudzipereka kumachedwa, ndiye tidzangowona zosintha pambuyo pochedwa.

Momwe mungagwiritsire ntchito chofananira chochedwetsedwa kuti mubwezeretse deta

Tiyerekeze kuti tili ndi gulu la database ndi chofananira chokhala ndi kuchedwa kwa maola asanu ndi atatu pakupanga. Tiyeni tione mmene achire deta ntchito chitsanzo kuchotsa mwangozi njira zazifupi.

Pamene tinaphunzira za vutolo, ife kubwezeretsa zakale kwayimitsidwa kwa chithunzi chochedwetsedwa:

SELECT pg_xlog_replay_pause();

Titapuma pang'ono, tinalibe chiwopsezo choti chofananacho chingabwereze pempholo DELETE. Chinthu chothandiza ngati mukufuna nthawi kuti mudziwe zonse.

Chowonadi ndichakuti chofananira chomwe chachedwetsedwa chiyenera kufikira mphindi isanapemphe DELETE. Tinkadziwa pafupifupi nthawi yochotsedwa. Tachotsa recovery_min_apply_delay ndi kuwonjezera recovery_target_time Π² recovery.conf. Umu ndi momwe chithunzichi chimafikira nthawi yoyenera popanda kuchedwa:

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

Ndi masitampu a nthawi, ndi bwino kuchepetsa owonjezera kuti musaphonye. Zowona, kuchepa kwakukulu, timataya zambiri. Apanso, ngati taphonya pempho DELETE, chilichonse chidzachotsedwanso ndipo muyenera kuyambiranso (kapena kutenga zosunga zoziziritsa kukhosi za PITR).

Tinayambitsanso chitsanzo cha Postgres chomwe chinachedwetsedwa ndipo magawo a WAL adabwerezedwa mpaka nthawi yodziwika. Mutha kuyang'anira momwe zikuyendera panthawiyi pofunsa kuti:

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;

Ngati chidindo chanthawi sichikusintha, kuchira kwatha. Zochita zitha kusinthidwa mwamakonda recovery_target_actionkutseka, kulimbikitsa, kapena kuyimitsa chochitikacho mutayesanso (kuyimitsidwa mwachisawawa).

Dongosolo la database lidabwerera m'malo ake asanapemphe mwatsoka. Tsopano mutha, mwachitsanzo, kutumiza deta. Tidatumiza data yomwe yafufutidwa ndi maulalo onse okhudzana ndi zovuta ndikuphatikiza zopempha ndikuzisunthira kumalo osungirako zinthu. Ngati zotayika zili zazikulu, mutha kungolimbikitsa chofanizira ndikuchigwiritsa ntchito ngati chachikulu. Koma ndiye zosintha zonse pambuyo poti tachira zidzatayika.

M'malo mwa masitampu anthawi, ndibwino kugwiritsa ntchito ma ID ochitika. Ndizothandiza kulemba ma ID awa, mwachitsanzo, pamawu a DDL (monga DROP TABLE), pogwiritsa ntchito log_statements = 'ddl'. Tikanakhala ndi ID yamalonda, tikanatenga recovery_target_xid ndikuthamangitsa zonse mpaka kugulitsako musanapemphe DELETE.

Kubwerera kuntchito ndikosavuta: chotsani zosintha zonse recovery.conf ndikuyambitsanso Postgres. Chofananiracho posachedwapa chidzachedwanso kwa maola asanu ndi atatu, ndipo takonzekera mavuto amtsogolo.

Ubwino Wobwezeretsa

Ndi choyimira chochedwetsedwa m'malo mosunga zoziziritsa kukhosi, simuyenera kuthera maola ambiri mukubwezeretsa chithunzi chonsecho kuchokera pazosungidwa. Mwachitsanzo, zimatitengera maola asanu kuti tipeze zosunga zobwezeretsera zonse za 2 TB. Ndiyeno muyenera kugwiritsabe ntchito WAL yonse ya tsiku ndi tsiku kuti mubwererenso kumalo omwe mukufuna (zoipa kwambiri).

Chifaniziro chochedwetsedwa ndi chabwino kuposa kusunga kozizira m'njira ziwiri:

  1. Palibe chifukwa chochotsera zosunga zobwezeretsera zonse kuchokera pazosungidwa.
  2. Pali zenera la maola asanu ndi atatu la magawo a WAL omwe ayenera kubwerezedwa.

Timayang'ananso nthawi zonse kuti tiwone ngati n'kotheka kupanga PITR kuchokera ku WAL, ndipo tidzazindikira mwamsanga ziphuphu kapena mavuto ena ndi WAL archive poyang'anira kusanja kwa replica yomwe yachedwetsedwa.

Muchitsanzo ichi, zidatitengera mphindi 50 kuti tibwezeretse, kutanthauza kuti liwiro linali 110 GB ya data ya WAL pa ola (zosungirako zikadalipobe. Zowonjezera). Ponseponse, tinathetsa vutoli ndikubwezeretsanso zomwezo mu maola 1,5.

Zotsatira: pomwe chofananira chochedwetsedwa chili chothandiza (ndi pomwe sichili)

Gwiritsani ntchito kubwereza mochedwa ngati chithandizo choyamba ngati mwataya data mwangozi ndikuwona vutoli pakuchedwa komwe mwakonza.

Koma kumbukirani: kubwerezabwereza sikusungitsa.

Kusunga ndi kubwereza kuli ndi zolinga zosiyana. Kusunga kozizira kudzakuthandizani ngati mwapanga mwangozi DELETE kapena DROP TABLE. Timapanga zosunga zobwezeretsera kuchokera kumalo ozizira ndikubwezeretsa momwe zidakhalira patebulo kapena nkhokwe yonse. Koma pa nthawi yomweyo pempho DROP TABLE imapangidwanso nthawi yomweyo muzofananira zonse pagulu logwira ntchito, kotero kubwereza wamba sikungathandize pano. Kubwereza komweko kumapangitsa kuti nkhokweyo ipezeke pomwe ma seva amodzi abwerekedwa ndikugawa katunduyo.

Ngakhale ndi chithunzi chochedwetsedwa, nthawi zina timafunikira zosunga zoziziritsa kukhosi pamalo otetezeka ngati kulephera kwa data center, kuwonongeka kobisika, kapena zochitika zina zomwe sizikuwoneka nthawi yomweyo. Kubwereza kokha sikuthandiza pano.

ndemanga. pa GitLab.com Panopa timangoteteza ku kutayika kwa data pamlingo wadongosolo ndipo sitipezanso deta pamlingo wa ogwiritsa ntchito.

Source: www.habr.com

Kuwonjezera ndemanga