Mar a chleachd sinn ath-riochdachadh dàil airson faighinn seachad air mòr-thubaist le PostgreSQL

Mar a chleachd sinn ath-riochdachadh dàil airson faighinn seachad air mòr-thubaist le PostgreSQL
Chan eil ath-riochdachadh mar chùl-taic. No nach eil? Seo mar a chleachd sinn ath-riochdachadh dàil gus faighinn seachad air ath-ghoiridean a chaidh a dhubhadh às gun fhiosta.

Eòlaichean bun-structair Tha uallach air GitLab airson na h-obrach GitLab.com - an eisimpleir GitLab as motha ann an nàdar. Le 3 millean neach-cleachdaidh agus faisg air 7 millean pròiseact, is e aon de na làraich SaaS stòr fosgailte as motha le ailtireachd sònraichte. Às aonais siostam stòr-dàta PostgreSQL, cha tèid bun-structar GitLab.com fada, agus dè a tha sinn a’ dèanamh gus dèanamh cinnteach à fulangas sgàinidhean gun fhios nach fàilligeadh nuair a thèid dàta a chall. Chan eil e coltach gun tachair a leithid de thubaist, ach tha sinn air ullachadh gu math agus làn de dhiofar dhòighean cùl-taic agus ath-riochdachadh.

Chan eil ath-riochdachadh na dhòigh air cùl-taic a dhèanamh de stòran-dàta (faic gu h-ìosal). Ach a-nis chì sinn mar as urrainn dhut dàta a chaidh a dhubhadh às gun fhiosta fhaighinn air ais le bhith a’ cleachdadh ath-riochdachadh leisg: air adhart GitLab.com an neach-cleachdaidh sguab às an ath-ghoirid airson a’ phròiseict gitlab-ce agus ceanglaichean air chall le iarrtasan agus gnìomhan aonaidh.

Le mac-samhail air a chuir dheth, fhuair sinn air ais dàta ann an dìreach 1,5 uairean. Seall mar a thachair.

Ath-bheothachadh puing ann an ùine le PostgreSQL

Tha gnìomh togte aig PostgreSQL a bheir air ais staid stòr-dàta gu àm sònraichte. Canar Ath-bheothachadh puing-ann-ùine (PITR) agus a’ cleachdadh na h-aon uidheamachdan a chumas am mac-samhail ùraichte: a’ tòiseachadh le dealbh earbsach den bhuidheann stòr-dàta gu lèir (cùl-taic bunaiteach), bidh sinn a’ cleachdadh sreath de dh’ atharrachaidhean stàite suas gu àm sònraichte.

Gus am feart seo a chleachdadh airson cùl-taic fuar, bidh sinn gu cunbhalach a’ dèanamh cùl-taic stòr-dàta bunaiteach agus ga stòradh ann an tasglann (tha tasglann GitLab a’ fuireach ann Stòradh sgòthan Google). Bidh sinn cuideachd a’ cumail sùil air atharrachaidhean ann an staid an stòr-dàta le bhith a’ tasgadh an loga sgrìobhadh air thoiseach (log sgrìobhadh air thoiseach, WAL). Agus leis a h-uile càil seo na àite, is urrainn dhuinn PITR a dhèanamh airson faighinn seachad air mòr-thubaist: a’ tòiseachadh leis an dealbh a chaidh a thogail ron fhàiligeadh, agus a’ cur an sàs atharrachaidhean bho thasglann WAL suas chun na fàilligeadh.

Dè a th’ ann an ath-riochdachadh dàil?

Is e ath-riochdachadh leisg cleachdadh atharrachaidhean bho WAL le dàil. Is e sin, thachair an gnothach ann an uair a thìde X, ach nochdaidh e anns a' mhac-samhail le dàil d ann an uair X + d.

Tha dòighean 2 aig PostgreSQL airson mac-samhail stòr-dàta corporra a stèidheachadh: ath-nuadhachadh cùl-taic agus ath-riochdachadh sruthadh. A luchdachadh a-nuas bho archive, gu bunaiteach ag obair mar PITR, ach gu leantainneach: bidh sinn an-còmhnaidh a’ faighinn atharrachaidhean bho thasglann WAL agus gan cur an sàs anns a’ mhac-samhail. A ath-riochdachadh sruthadh a’ faighinn air ais sruth WAL gu dìreach bhon òstair stòr-dàta shuas an abhainn. Is fheàrr leinn faighinn air ais tasglann - tha e nas fhasa a riaghladh agus tha coileanadh àbhaisteach aige a chumas suas ris a’ bhuidheann riochdachaidh.

Mar a shuidhicheas tu dàil air faighinn air ais bho thasglann

Roghainnean Ath-bheothachaidh air a mhìneachadh anns an fhaidhle recovery.conf. Eisimpleir:

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'

Leis na crìochan sin, shuidhich sinn mac-samhail dàil le ath-bheothachadh cùl-taic. An seo tha e air a chleachdadh wal-e gus earrannan WAL a thoirt a-mach (restore_command) bhon tasglann, agus thèid atharrachaidhean a chuir an sàs an dèidh ochd uairean (recovery_min_apply_delay). Coimheadaidh am mac-samhail airson atharrachaidhean loidhne-tìm san tasglann, mar eisimpleir ri linn fàilligeadh cnuasachaidh (recovery_target_timeline).

С recovery_min_apply_delay Faodaidh tu ath-riochdachadh sruthadh a chuir air dòigh le dàil, ach tha cnap-starra no dhà an seo a tha co-cheangailte ri sliotan ath-riochdachadh, fios air ais teth cùl-taic, agus mar sin air adhart. Leigidh tasglann WAL leat an seachnadh.

Parameter recovery_min_apply_delay nochdadh ann am PostgreSQL 9.3 a-mhàin. Ann an dreachan roimhe, airson ath-riochdachadh dàil feumaidh tu am measgachadh a rèiteachadh gnìomhan rianachd ath-bheothachaidh (pg_xlog_replay_pause(), pg_xlog_replay_resume()) no cùm earrannan WAL san tasglann fhad ‘s a bhios an dàil ann.

Ciamar a nì PostgreSQL seo?

Tha e inntinneach fhaicinn mar a bhios PostgreSQL a’ cur an gnìomh ath-bheothachadh leisg. Bheir sinn sùil air recoveryApplyDelay(XlogReaderState). Tha e air a ghairm bho prìomh lùb ath-aithris airson gach inntrigeadh bho 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;
}

Is e an loidhne gu h-ìosal gu bheil an dàil stèidhichte air an ùine fiosaigeach a chaidh a chlàradh ann an clàr-ama gealltanas a’ ghnothaich (xtime). Mar a chì thu, chan eil an dàil a’ buntainn ach ri geallaidhean agus chan eil e a’ toirt buaidh air inntrigidhean eile - tha a h-uile atharrachadh air a chuir an sàs gu dìreach, agus tha dàil air a’ ghealladh, agus mar sin chan fhaic sinn na h-atharrachaidhean ach às deidh an dàil rèiteachaidh.

Mar a chleachdas tu mac-samhail dàil gus dàta a thoirt air ais

Canaidh sinn gu bheil cruinneachadh stòr-dàta againn agus mac-samhail le dàil ochd uairean a thìde ann an cinneasachadh. Nach faic sinn mar a gheibh sinn air ais dàta a 'cleachdadh eisimpleir cuir às do gheàrr-dhealbhan gun fhiosta.

Nuair a dh'ionnsaich sinn mun duilgheadas, rinn sinn tha ath-nuadhachadh tasglann air a stad airson mac-samhail air a chur dheth:

SELECT pg_xlog_replay_pause();

Le stad, cha robh cunnart sam bith againn gun dèanadh am mac-samhail an t-iarrtas a-rithist DELETE. Rud feumail ma tha feum agad air ùine airson a h-uile càil a thuigsinn.

Is e a’ phuing gum feum am mac-samhail a chaidh a chuir dheth a ruighinn an ìre ron iarrtas DELETE. Bha fios againn timcheall air àm corporra an toirt air falbh. Tha sinn air a sguabadh às recovery_min_apply_delay agus air a chur ris recovery_target_time в recovery.conf. Seo mar a ruigeas am mac-samhail an àm cheart gun dàil:

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

Le stampaichean ùine, tha e nas fheàrr an còrr a lughdachadh gus nach caill thu. Fìor, mar as motha an lùghdachadh, is ann as motha de dhàta a chailleas sinn. A-rithist, ma chailleas sinn an t-iarrtas DELETE, thèid a h-uile càil a dhubhadh às a-rithist agus feumaidh tu tòiseachadh a-rithist (no eadhon cùl-taic fuar a ghabhail airson PITR).

Ath-thòisich sinn an eisimpleir Postgres a chaidh a chuir dheth agus chaidh na roinnean WAL ath-aithris gus an àm ainmichte. Faodaidh tu adhartas a leantainn aig an ìre seo le bhith a’ faighneachd:

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;

Mura h-atharraich an clàr-ama tuilleadh, tha an ath-bheothachadh deiseil. Faodar gnìomh a ghnàthachadh recovery_target_actiongus an t-eisimpleir a dhùnadh, adhartachadh no stad às deidh ath-fheuchainn (tha e air a chuir dheth gu bunaiteach).

Thill an stòr-dàta chun na stàite aige ron iarrtas mhì-fhortanach sin. A-nis faodaidh tu, mar eisimpleir, às-mhalairt dàta. Chuir sinn a-mach an dàta leubail a chaidh a dhubhadh às agus a h-uile ceangal gu cùisean agus iarrtasan aonaidh agus ghluais sinn iad a-steach don stòr-dàta toraidh. Ma tha na call mòr, faodaidh tu dìreach am mac-samhail adhartachadh agus a chleachdadh mar am prìomh fhear. Ach an uairsin thèid a h-uile atharrachadh às deidh na h-ìre gu bheil sinn air faighinn seachad air a chall.

An àite clàran-ama, tha e nas fheàrr IDan malairt a chleachdadh. Tha e feumail na IDan sin a chlàradh, mar eisimpleir, airson aithrisean DDL (leithid DROP TABLE), le bhith a’ cleachdadh log_statements = 'ddl'. Nam biodh ID malairt againn, ghabhadh sinn recovery_target_xid agus ruith a h-uile càil sìos chun a 'ghnothaich ron iarrtas DELETE.

Tha e glè shìmplidh faighinn air ais a dh'obair: cuir às do gach atharrachadh recovery.conf agus ath-thòiseachadh Postgres. Bidh dàil ochd uairean a thìde air a’ mhac-samhail a dh’ aithghearr, agus tha sinn deiseil airson trioblaidean san àm ri teachd.

Sochairean Ath-bheothachaidh

Le mac-samhail dàil an àite cùl-taic fuar, cha leig thu leas uairean a chaitheamh ag ath-nuadhachadh an ìomhaigh gu lèir bhon tasglann. Mar eisimpleir, bheir e còig uairean a thìde dhuinn an cùl-taic bunaiteach 2 TB gu lèir fhaighinn. Agus an uairsin feumaidh tu fhathast an WAL làitheil gu lèir a chuir an sàs gus faighinn air ais chun staid a tha thu ag iarraidh (anns a’ chùis as miosa).

Tha mac-samhail dàil nas fheàrr na cùl-taic fuar ann an dà dhòigh:

  1. Chan eil feum air an cùl-taic bunaiteach gu lèir a thoirt air falbh bhon tasglann.
  2. Tha uinneag stèidhichte ochd uairean a thìde de earrannan WAL a dh'fheumar a dhèanamh a-rithist.

Bidh sinn cuideachd an-còmhnaidh a’ sgrùdadh a bheil e comasach PITR a dhèanamh bho WAL, agus mhothaich sinn gu sgiobalta coirbeachd no duilgheadasan eile le tasglann WAL le bhith a’ cumail sùil air dàil a’ mhac-samhail a chaidh a chuir dheth.

San eisimpleir seo, thug e 50 mionaid dhuinn ath-nuadhachadh, a’ ciallachadh gu robh an astar 110 GB de dhàta WAL san uair (bha an tasglann fhathast air adhart AWS S3). Gu h-iomlan, dh'fhuasgail sinn an duilgheadas agus fhuair sinn air ais an dàta ann an 1,5 uairean.

Toraidhean: far a bheil mac-samhail dàil feumail (agus far nach eil)

Cleachd ath-riochdachadh dàil mar chiad chobhair ma chaill thu dàta gun fhiosta agus ma mhothaich thu an duilgheadas seo taobh a-staigh na dàil a chaidh a rèiteachadh.

Ach cumaibh cuimhne: chan e cùl-taic a th’ ann an ath-riochdachadh.

Tha diofar adhbharan aig cùl-taic agus ath-riochdachadh. Bidh cùl-taic fuar feumail ma rinn thu gun fhiosta DELETE no DROP TABLE. Bidh sinn a’ dèanamh cùl-taic bho stòradh fuar agus ag ath-nuadhachadh staid a’ bhùird no an stòr-dàta gu lèir. Ach aig an aon àm an t-iarrtas DROP TABLE cha mhòr sa bhad air ath-riochdachadh anns a h-uile mac-samhail air a’ bhuidheann obrach, agus mar sin cha chuidich ath-riochdachadh àbhaisteach an seo. Bidh ath-riochdachadh fhèin a’ cumail an stòr-dàta ri fhaighinn nuair a bhios frithealaichean fa-leth air am màl a-mach agus a’ cuairteachadh an luchd.

Eadhon le mac-samhail air a chuir dheth, uaireannan bidh feum againn air cùl-taic fuar ann an àite sàbhailte ma thachras fàilligeadh ionad dàta, milleadh falaichte, no tachartasan eile nach fhaicear sa bhad. Chan eil ath-riochdachadh leis fhèin gu feum sam bith an seo.

thuirt. Air adhart GitLab.com Aig an àm seo chan eil sinn a’ dìon ach an aghaidh call dàta aig ìre an t-siostaim agus chan fhaigh sinn air ais dàta aig ìre an neach-cleachdaidh.

Source: www.habr.com

Cuir beachd ann