Bii a ṣe lo ẹda idaduro fun imularada ajalu pẹlu PostgreSQL

Bii a ṣe lo ẹda idaduro fun imularada ajalu pẹlu PostgreSQL
Atunse kii ṣe afẹyinti. Bi beko? Eyi ni bii a ṣe lo ẹda ti o da duro lati gba pada lati piparẹ awọn ọna abuja lairotẹlẹ.

Awọn alamọja amayederun GitLab jẹ iduro fun iṣẹ naa GitLab.com - apẹẹrẹ GitLab ti o tobi julọ ni iseda. Pẹlu awọn olumulo miliọnu 3 ati awọn iṣẹ akanṣe miliọnu 7, o jẹ ọkan ninu awọn aaye orisun ṣiṣi ti SaaS ti o tobi julọ pẹlu faaji iyasọtọ. Laisi eto data data PostgreSQL, awọn amayederun GitLab.com kii yoo lọ jinna, ati kini a n ṣe lati rii daju ifarada aṣiṣe ni ọran eyikeyi awọn ikuna nigbati data le sọnu. Ko ṣee ṣe pe iru ajalu kan yoo ṣẹlẹ, ṣugbọn a ti murasilẹ daradara ati pe a ni ifipamọ pẹlu ọpọlọpọ awọn ọna afẹyinti ati awọn ọna ṣiṣe atunṣe.

Atunṣe kii ṣe ọna ti n ṣe afẹyinti awọn data data (wo isalẹ). Ṣugbọn ni bayi a yoo rii bii o ṣe le yara gba data paarẹ lairotẹlẹ nipa lilo ẹda ọlẹ: lori GitLab.com olumulo paarẹ ọna abuja fun ise agbese gitlab-ce ati awọn asopọ ti o padanu pẹlu awọn ibeere akojọpọ ati awọn iṣẹ-ṣiṣe.

Pẹlu ẹda ti o da duro, a gba data pada ni awọn wakati 1,5 nikan. Wo bi o ṣe ṣẹlẹ.

Tọkasi ni imularada akoko pẹlu PostgreSQL

PostgreSQL ni iṣẹ ti a ṣe sinu ti o mu ipo data pada si aaye kan pato ni akoko. O ti wa ni a npe ni Ojuami-ni-Time Gbigba (PITR) ati pe o nlo awọn ọna ṣiṣe kanna ti o tọju ajọra naa titi di oni: bẹrẹ pẹlu aworan ti o gbẹkẹle ti gbogbo iṣupọ data (afẹyinti ipilẹ), a lo lẹsẹsẹ awọn iyipada ipinlẹ titi di aaye kan ni akoko.

Lati lo ẹya yii fun afẹyinti tutu, a ṣe afẹyinti ipilẹ data nigbagbogbo ati tọju rẹ sinu ile ifi nkan pamosi (Awọn ile-ipamọ GitLab n gbe ni Google awọsanma ipamọ). A tun ṣe atẹle awọn ayipada ni ipo data data nipa fifipamọ akọọlẹ kikọ-iwaju (kọ-iwaju log, WAL). Ati pẹlu gbogbo eyi ni aaye, a le ṣe PITR kan fun imularada ajalu: bẹrẹ pẹlu aworan ti o ya ṣaaju ikuna, ati lilo awọn iyipada lati ile-ipamọ WAL titi di ikuna.

Kini ẹda ti o da duro?

Atunse ọlẹ jẹ ohun elo ti awọn ayipada lati WAL pẹlu idaduro. Iyẹn ni, idunadura naa waye ni wakati kan X, ṣugbọn yoo han ninu ẹda pẹlu idaduro d ni wakati kan X + d.

PostgreSQL ni awọn ọna 2 lati ṣeto ẹda ẹda data ti ara: imularada afẹyinti ati ẹda ṣiṣanwọle. Pada sipo lati ile ifi nkan pamosiNi pataki ṣiṣẹ bi PITR, ṣugbọn nigbagbogbo: a gba awọn ayipada nigbagbogbo lati ile-ipamọ WAL ati lo wọn si ẹda. A ṣiṣan ṣiṣan taara gba ṣiṣan WAL lati ọdọ agbalejo ibi ipamọ data ti oke. A fẹ imularada pamosi - o rọrun lati ṣakoso ati pe o ni iṣẹ ṣiṣe deede ti o tọju pẹlu iṣupọ iṣelọpọ.

Bii o ṣe le ṣeto imularada idaduro lati ile-ipamọ kan

Awọn aṣayan imularada se apejuwe ninu awọn faili recovery.conf... Apẹẹrẹ:

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'

Pẹlu awọn paramita wọnyi, a tunto ẹda ti o da duro pẹlu imularada afẹyinti. Nibi ti o ti lo wal-e lati jade awọn apakan WAL (restore_command) lati ile-ipamọ, ati awọn ayipada yoo ṣee lo lẹhin awọn wakati mẹjọ (recovery_min_apply_delay). Ẹda naa yoo wo awọn ayipada aago ninu ile-ipamọ, fun apẹẹrẹ nitori ikuna iṣupọ kan (recovery_target_timeline).

С recovery_min_apply_delay O le ṣeto atunṣe ṣiṣanwọle pẹlu idaduro, ṣugbọn awọn ọfin meji kan wa nibi ti o ni ibatan si awọn iho ẹda, esi imurasilẹ gbona, ati bẹbẹ lọ. Ile-ipamọ WAL gba ọ laaye lati yago fun wọn.

Apaadi recovery_min_apply_delay han nikan ni PostgreSQL 9.3. Ni awọn ẹya ti tẹlẹ, fun ẹda ti o da duro o nilo lati tunto apapo naa awọn iṣẹ iṣakoso imularada (pg_xlog_replay_pause(), pg_xlog_replay_resume()) tabi mu awọn apakan WAL duro ni ibi ipamọ fun iye akoko idaduro naa.

Bawo ni PostgreSQL ṣe eyi?

O jẹ ohun ti o nifẹ lati rii bii PostgreSQL ṣe ṣe imupadabọ ọlẹ. Jẹ ki a wo recoveryApplyDelay(XlogReaderState). O ti wa ni a npe ni lati akọkọ tun lupu fun titẹsi kọọkan lati 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;
}

Laini isalẹ ni pe idaduro naa da lori akoko ti ara ti o gbasilẹ ninu idunadura ṣe timestamp (xtime). Bii o ti le rii, idaduro naa kan si awọn iṣe ati pe ko ni ipa awọn titẹ sii miiran - gbogbo awọn ayipada ni a lo taara, ati pe adehun naa ni idaduro, nitorinaa a yoo rii awọn ayipada nikan lẹhin idaduro tunto.

Bii o ṣe le lo ẹda idaduro lati mu data pada

Jẹ ki a sọ pe a ni iṣupọ data data ati ẹda kan pẹlu idaduro wakati mẹjọ ni iṣelọpọ. Jẹ ká wo bi o lati bọsipọ data nipa lilo ohun apẹẹrẹ lairotẹlẹ piparẹ awọn ọna abuja.

Nigba ti a kẹkọọ nipa iṣoro naa, a mimu-pada sipo pamosi ti daduro fun ẹda ti o da duro:

SELECT pg_xlog_replay_pause();

Pẹlu idaduro, a ko ni eewu pe ẹda naa yoo tun ibeere naa ṣe DELETE. Ohun ti o wulo ti o ba nilo akoko lati ro ero ohun gbogbo.

Ojuami ni pe ẹda ti o da duro gbọdọ de akoko ṣaaju ibeere naa DELETE. A fẹrẹ mọ akoko ti ara ti yiyọ kuro. A ti paarẹ recovery_min_apply_delay o si fi kun recovery_target_time в recovery.conf. Eyi ni bii ajọra ṣe de akoko to tọ laisi idaduro:

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

Pẹlu awọn ontẹ akoko, o dara lati dinku afikun ki o má ba padanu. Otitọ, ti o pọju idinku, diẹ sii data ti a padanu. Lẹẹkansi, ti a ba padanu ibeere naa DELETE, ohun gbogbo yoo paarẹ lẹẹkansi ati pe iwọ yoo ni lati bẹrẹ lẹẹkansi (tabi paapaa gba afẹyinti tutu fun PITR).

A tun bẹrẹ apẹẹrẹ Postgres ti a da duro ati pe awọn apakan WAL ni a tun ṣe titi di akoko kan pato. O le tọpa ilọsiwaju ni ipele yii nipa bibeere:

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;

Ti timestamp ko ba yipada mọ, imularada ti pari. Iṣe le jẹ adani recovery_target_actionlati tii, ṣe igbega, tabi da duro fun apẹẹrẹ lẹhin atun gbiyanju (o ti daduro nipasẹ aiyipada).

Ipamọ data pada si ipo rẹ ṣaaju ibeere lailoriire yẹn. Bayi o le, fun apẹẹrẹ, okeere data. A ṣe okeere data aami ti o paarẹ ati gbogbo awọn ọna asopọ si awọn ọran ati dapọ awọn ibeere ati gbe wọn lọ si ibi ipamọ data iṣelọpọ. Ti awọn adanu ba jẹ iwọn nla, o le jiroro ni igbega ajọra naa ki o lo bi akọkọ. Ṣugbọn lẹhinna gbogbo awọn ayipada lẹhin aaye ti a ti gba pada yoo sọnu.

Dipo awọn aami igba, o dara lati lo awọn ID idunadura. O wulo lati ṣe igbasilẹ awọn ID wọnyi, fun apẹẹrẹ, fun awọn alaye DDL (bii DROP TABLE), nipa lilo log_statements = 'ddl'. Ti a ba ni ID idunadura, a yoo gba recovery_target_xid ati ki o ran ohun gbogbo si isalẹ lati awọn idunadura ṣaaju ki o to awọn ìbéèrè DELETE.

Gbigba pada si iṣẹ rọrun pupọ: yọ gbogbo awọn ayipada kuro recovery.conf ki o tun bẹrẹ Postgres. Ẹda naa yoo ni idaduro wakati mẹjọ lẹẹkansi, ati pe a ti mura silẹ fun awọn wahala iwaju.

Awọn Anfani Imularada

Pẹlu ẹda ti o da duro dipo afẹyinti tutu, o ko ni lati lo awọn wakati mimu-pada sipo gbogbo aworan lati ile-ipamọ. Fun apẹẹrẹ, o gba to wakati marun lati gba gbogbo ipilẹ 2 TB afẹyinti. Ati lẹhinna o tun ni lati lo gbogbo WAL lojoojumọ lati gba pada si ipo ti o fẹ (ninu ọran ti o buru julọ).

Apẹrẹ ti a da duro dara ju afẹyinti tutu ni awọn ọna meji:

  1. Ko si ye lati yọ gbogbo afẹyinti ipilẹ kuro ni ile-ipamọ.
  2. Ferese wakati mẹjọ wa ti awọn apakan WAL ti o gbọdọ tun ṣe.

A tun ṣayẹwo nigbagbogbo lati rii boya o ṣee ṣe lati ṣe PITR kan lati WAL, ati pe a yoo yara ṣe akiyesi ibajẹ tabi awọn iṣoro miiran pẹlu ile-ipamọ WAL nipa ṣiṣe abojuto aisun ti ẹda ti a da duro.

Ninu apẹẹrẹ yii, o gba wa ni iṣẹju 50 lati mu pada, afipamo pe iyara naa jẹ 110 GB ti data WAL fun wakati kan (ipamọ naa tun wa ni titan. Aws S3). Ni apapọ, a yanju iṣoro naa ati gba data pada ni awọn wakati 1,5.

Awọn abajade: nibiti ẹda ti o da duro ti wulo (ati nibiti ko ṣe)

Lo atunṣe idaduro bi iranlọwọ akọkọ ti o ba padanu data lairotẹlẹ ati ṣe akiyesi iṣoro yii laarin idaduro iṣeto.

Ṣugbọn ṣe akiyesi: atunkọ kii ṣe afẹyinti.

Afẹyinti ati atunṣe ni awọn idi oriṣiriṣi. Afẹyinti tutu yoo wa ni ọwọ ti o ba ṣe lairotẹlẹ DELETE tabi DROP TABLE. A ṣe afẹyinti lati ibi ipamọ tutu ati mu pada ipo iṣaaju ti tabili tabi gbogbo data data. Ṣugbọn ni akoko kanna ibeere naa DROP TABLE ti fẹrẹ ṣe ẹda lesekese ni gbogbo awọn ẹda lori iṣupọ iṣẹ, nitorinaa ẹda lasan kii yoo ṣe iranlọwọ nibi. Atunse ara rẹ ntọju aaye data wa nigbati awọn olupin kọọkan ti yalo jade ti o pin kaakiri.

Paapaa pẹlu ẹda ti o da duro, nigba miiran a nilo afẹyinti tutu ni aaye ailewu ti ikuna ile-iṣẹ data kan, ibajẹ ti o farapamọ, tabi awọn iṣẹlẹ miiran ti ko ṣe akiyesi lẹsẹkẹsẹ waye. Atunse nikan ni ko si lilo nibi.

Daakọ... Tan GitLab.com Lọwọlọwọ a daabobo nikan lodi si pipadanu data ni ipele eto ati pe ko gba data pada ni ipele olumulo.

orisun: www.habr.com

Fi ọrọìwòye kun