Quomodo usus est Replicatio piger ad malum Recuperatio cum PostgreSQL

Quomodo usus est Replicatio piger ad malum Recuperatio cum PostgreSQL
Replicatio non est tergum. Aut non? Hic est quomodo replicatio pigra ad recuperationem usi sumus per compendia casualiter delendo.

infrastructure elit GitLab est reus opus GitLab.com - GitLab in natura maxima instantia. Cum 3 miliones utentium et paene 7 millionum inceptis, una ex maximis locis apertis fonte Saas cum architecturae dedicato est. Sine systemate datorum PostgreSQL, GitLab.com infrastructura non longe abibit, et quod modo non facimus tolerantiam culpae in casu aliquo delictorum, cum notitias amittere potes. Verisimile est talem calamitatem futuram esse, sed bene praeparavimus et instruxi variis machinationibus tergum et replicationem.

Replicatio database tergum instrumentum tuum non est (infra vide). Nunc autem videbimus quomodo notitia cito convalescat accidens deleta utens replicatione pigra: on GitLab.com usor remota brevis ad project gitlab-ce et pereunt nexus cum merge petitiones et officia.

Replica dilata, data in mox 1,5 horas recuperavimus. Ecce quomodo fuit.

Punctum-in-vicis recuperatio cum PostgreSQL

PostgreSQL in munere aedificatum habet, quod statum database ad tempus determinatum reddit. Dicitur Point-in-time Recuperatio (PITR) iisdemque mechanismis utitur, qui replicam usque ad diem servant: incipiendo a certo snapshot totius botri datorum (basi tergum), seriem status mutationum ad certum punctum temporis applicamus.

Hoc pluma ut tergum pro frigido utimur, regulariter basim datorum tergum facimus et in archivo recondimus (in archivo GitLab habitant. Google nubes repono). Nos quoque monitor status database mutationes in archiving a scribe-ante stipes (scribentes injustitiam praemisit log, WAl). Et cum haec omnia PITR pro calamitate recuperationis facere possumus: incipimus a snapshot errorem ante sumptum et mutationes e archivo wal usque ad fragorem applica.

Quid differtur replicatio?

Replicatio dilata est applicatio mutationum WA cum mora. Id est, evenit hora X, at cum dilatione apparebit in replica d una hora X + d.

Duae sunt 2 modi ad imaginem datorum physicorum in PostgreSQL: archivum restituendum et fluentem replicationem. Restorans ex archivoessentialiter operatur sicut PITR, sed continuo: perpetuo mutationes ex archivo WA extrahendo easque ad imaginem applicando. A streaming replicatio exercitum datorum Vallarium directe ab adverso flumine arcessit. Malimus ex archivo restituere - facilius est administrare et normales effectus habet, qui post glomerationem productionis non cessat.

Quam constituere moratus tergum recuperatio

Recuperatio options descriptus est in tabella recovery.conf. Exemplum:

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'

His uncinis tardam imaginem configuramus cum archivo restituto. Hic usus est pariete-e * ad extrahendi wal segmenta (restore_command) ex archivo et mutationes applicabuntur post octo horas (recovery_min_apply_delay). Replica vicissitudines in archivo observabit, ut ob botrum defectivum (recovery_target_timeline).

С recovery_min_apply_delay latency effusis replicatio constituere potes, sed duae foveae sunt cum replicatione foramina coniuncta, feedback calida parce, et sic porro. Archivum WA eos vitat.

parametri recovery_min_apply_delay apparuit in PostgreSQL 9.3. In prioribus versionibus, replicatio tardata requirit complexionem recuperatio procuratio munera (pg_xlog_replay_pause(), pg_xlog_replay_resume()) vel segmenta muralia in archivo pro mora durationis teneant.

Quomodo PostgreSQL facere?

Suus 'interesting videre quomodo PostgreSQL instrumenta piger restituat. Intueamur recoveryApplyDelay(XlogReaderState). Dicitur ab principalis loop repeat pro quolibet introitu de 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;
}

Solum versus est quod mora in temporis corporis indicatione rei gestae innixa est committendum (.xtime). Ut videre potes, dilatio solum applicat ad committendum et non afficit alia monumenta - omnes mutationes directe applicantur, et committi dilatio est, sic mutationes tantum post figuram dilationem videbimus.

Quomodo ad imaginem piger uti pro notitia recuperationis

Dicamus nos habere botrum datorum in productione et imaginem cum mora octo horarum. Videamus quomodo notitia ad recuperandam utens exemplo accidens deletionem shortcuts.

Cum intelleximus quaestionem, constiterunt tergum recuperatio morae effigies;

SELECT pg_xlog_replay_pause();

Cum pausa, nullum periculum habuimus ut imaginem petitionis repeteret DELETE. Utile est, si tempus opus est ut omnia instare.

Solum versus est quod tardae imaginis momentum ad instantiam pervenire debet DELETE. Nos circiter tempus corporis remotionis cognovimus. Nos removimus recovery_min_apply_delay et adiecit recovery_target_time в recovery.conf. Replica igitur ad tempus opportunum sine mora attingit;

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

Cum indicatione temporis, melius est excessum minuere ne deesset. Vera, quo majus decrescunt, magis notitia amittimus. Iterum, si omittitur petitio DELETEomnia rursus delebuntur et initium habebis (vel etiam frigus tergum pro PITR sume).

Repressimus instantiam Postgres tardatam et segmenta wal repetita sunt usque ad tempus praefinitum. Progressus in hac scaena investigando investigare potes:

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;

Si indicatione temporis non mutat, restitutio perfecta est. Potes domicilii actiones recovery_target_actioninstantia claudere, promovere vel morari post retry (moritur per defaltam).

Datorum in civitate prius fatis petentibus. Nunc potes, exempli gratia, data export. Notitiam pittacii remotam exportavimus omnesque nexus ad quaestiones et petitiones merge et ad datorum productionem transtulimus. Si damna magna sunt, simpliciter imaginem promovere potes et uti principali. Sed tunc omnes mutationes amittentur post momentum ad quod nos recuperavimus.

Praestat rem gestam IDs pro indicatione temporis uti. Utile est has IDs notare, exempli gratia, declarationes DDL (ut DROP TABLE), ab usura log_statements = 'ddl'. Si res id haberemus, acciperemus recovery_target_xid et decurrerunt omnia ad rem ante petitionem DELETE.

Recepto opus est valde simplex: omnes mutationes a removere recovery.conf et sileo postgres. Mox octuagesimum horam iterum derivari debebit, et parati sumus ad futuras molestias.

Recuperatio Beneficia

Replica tardata, loco frigoris tergum, horas non habebis integrum ex archivo snapectum restituendi. Exempli gratia: quinque horas opus est ut totum 2 TB basi tergum. Et tunc adhuc debes adhibere totum WA cotidie ad statum desideratum recuperandum (in gravissimo casu).

Melior est retardata replicatio quam tergum frigidum dupliciter:

  1. Non opus est ut basis totius tergum ex archivo accipias.
  2. Est fixa segmenta octo-horarum fenestrarum muralium quae iteranda sunt.

Etiam constanter nos inspicimus si WAL PITRed esse potest, et cito corruptionem vel alias difficultates cum archivo WAL observare volumus, vigilantia ad imaginem retardati backlogum.

In hoc exemplo nobis 50 minuta ad restituendum sumpsit, hoc est, celeritas 110 GB ipsius WAL data per horas (in archivo adhuc erat. S 3 AWS). In summa, problema solvimus et notitias in 1,5 horas reddidimus.

Summarium: ubi utilis est retardata effigies (et ubi non)

Replicatio tardata utere ut primum auxilium, si data accidentaliter amittes et animadvertes hanc calamitatem intra figuram morari.

Sed memento: replicatio non est tergum.

Tergum et replicatio diversos usus habent. Frigidus tergum in manus veniet, si accidens te fecit DELETE aut DROP TABLE. Tergum ex frigore repositionis facimus et statum priorem mensae vel integrae datorum restituimus. Sed simul rogamus DROP TABLE paene statim in omnibus replicationibus in botro laborantis repraesententur, ideo replicatio regularis hic non servabit. Ipsa replicatio datorum praesto servat, cum singulis servientibus locantur et onus distribuuntur.

Etiam cum rettulit effigiem, interdum re frigido in loco tuto egemus, si subito defectus centri notitiarum, damnum absconditum, aliave eventa quae statim non animadvertistis, egent. Hic ab una replicatione nullus est sensus.

illud. in GitLab.com nunc tantum defendimus contra notam iacturam in gradu systematis et non restituimus data in gradu usoris.

Source: www.habr.com

Add a comment